| Index: chrome/renderer/searchbox_extension.cc
|
| diff --git a/chrome/renderer/searchbox_extension.cc b/chrome/renderer/searchbox_extension.cc
|
| index e04bf9131ba327c3c45e5a8f0ba1c9ba0f3d2709..83e99a9978aa3808e95b490fcea10f5be2b9293a 100644
|
| --- a/chrome/renderer/searchbox_extension.cc
|
| +++ b/chrome/renderer/searchbox_extension.cc
|
| @@ -59,13 +59,41 @@ static const char kSearchBoxExtensionScript[] =
|
| " };"
|
| "}";
|
|
|
| -static const char kChangeEventName[] = "chrome.searchBox.onchange";
|
| +static const char kDispatchChangeEventScript[] =
|
| + "if (window.chrome &&"
|
| + " window.chrome.searchBox &&"
|
| + " window.chrome.searchBox.onchange &&"
|
| + " typeof window.chrome.searchBox.onchange == 'function') {"
|
| + " window.chrome.searchBox.onchange();"
|
| + " true;"
|
| + "}";
|
|
|
| -static const char kSubmitEventName[] = "chrome.searchBox.onsubmit";
|
| +static const char kDispatchSubmitEventScript[] =
|
| + "if (window.chrome &&"
|
| + " window.chrome.searchBox &&"
|
| + " window.chrome.searchBox.onsubmit &&"
|
| + " typeof window.chrome.searchBox.onsubmit == 'function') {"
|
| + " window.chrome.searchBox.onsubmit();"
|
| + " true;"
|
| + "}";
|
|
|
| -static const char kCancelEventName[] = "chrome.searchBox.oncancel";
|
| +static const char kDispatchCancelEventScript[] =
|
| + "if (window.chrome &&"
|
| + " window.chrome.searchBox &&"
|
| + " window.chrome.searchBox.oncancel &&"
|
| + " typeof window.chrome.searchBox.oncancel == 'function') {"
|
| + " window.chrome.searchBox.oncancel();"
|
| + " true;"
|
| + "}";
|
|
|
| -static const char kResizeEventName[] = "chrome.searchBox.onresize";
|
| +static const char kDispatchResizeEventScript[] =
|
| + "if (window.chrome &&"
|
| + " window.chrome.searchBox &&"
|
| + " window.chrome.searchBox.onresize &&"
|
| + " typeof window.chrome.searchBox.onresize == 'function') {"
|
| + " window.chrome.searchBox.onresize();"
|
| + " true;"
|
| + "}";
|
|
|
| // Deprecated API support.
|
| // TODO(tonyg): Remove these when they are no longer used.
|
| @@ -349,61 +377,37 @@ v8::Handle<v8::Value> SearchBoxExtensionWrapper::SetSuggestions(
|
| }
|
|
|
| // static
|
| -bool Dispatch(WebFrame* frame, const std::string& event_name) {
|
| +void Dispatch(WebFrame* frame,
|
| + WebString event_dispatch_script,
|
| + WebString no_event_handler_script) {
|
| DCHECK(frame) << "Dispatch requires frame";
|
| - if (!frame) return false;
|
| -
|
| - v8::HandleScope handle_scope;
|
| - v8::Local<v8::Context> context = frame->mainWorldScriptContext();
|
| - if (context.IsEmpty())
|
| - return false;
|
| - v8::Context::Scope context_scope(context);
|
| -
|
| - v8::Local<v8::Value> value =
|
| - context->Global()->Get(v8::String::New("window"));
|
| - std::vector<std::string> components;
|
| - base::SplitStringDontTrim(event_name, '.', &components);
|
| - for (size_t i = 0; i < components.size(); ++i) {
|
| - if (!value.IsEmpty() && value->IsObject())
|
| - value = value->ToObject()->Get(v8::String::New(components[i].c_str()));
|
| - }
|
| - if (value.IsEmpty() || !value->IsFunction())
|
| - return false;
|
| -
|
| - v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(value);
|
| - if (function.IsEmpty())
|
| - return false;
|
| + if (!frame)
|
| + return;
|
|
|
| - function->Call(v8::Object::New(), 0, NULL);
|
| - return true;
|
| + v8::Handle<v8::Value> result = frame->executeScriptAndReturnValue(
|
| + WebScriptSource(event_dispatch_script));
|
| + if (result.IsEmpty())
|
| + frame->executeScript(WebScriptSource(no_event_handler_script));
|
| }
|
|
|
| // static
|
| void SearchBoxExtension::DispatchChange(WebFrame* frame) {
|
| - if (Dispatch(frame, kChangeEventName))
|
| - return;
|
| - frame->executeScript(WebScriptSource(kUserInputScript));
|
| + Dispatch(frame, kDispatchChangeEventScript, kUserInputScript);
|
| }
|
|
|
| // static
|
| void SearchBoxExtension::DispatchSubmit(WebFrame* frame) {
|
| - if (Dispatch(frame, kSubmitEventName))
|
| - return;
|
| - frame->executeScript(WebScriptSource(kUserDoneScript));
|
| + Dispatch(frame, kDispatchSubmitEventScript, kUserDoneScript);
|
| }
|
|
|
| // static
|
| void SearchBoxExtension::DispatchCancel(WebFrame* frame) {
|
| - if (Dispatch(frame, kCancelEventName))
|
| - return;
|
| - frame->executeScript(WebScriptSource(kUserDoneScript));
|
| + Dispatch(frame, kDispatchCancelEventScript, kUserDoneScript);
|
| }
|
|
|
| // static
|
| void SearchBoxExtension::DispatchResize(WebFrame* frame) {
|
| - if (Dispatch(frame, kResizeEventName))
|
| - return;
|
| - frame->executeScript(WebScriptSource(kSetOmniboxBoundsScript));
|
| + Dispatch(frame, kDispatchResizeEventScript, kSetOmniboxBoundsScript);
|
| }
|
|
|
| // static
|
|
|