Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6691)

Unified Diff: chrome/renderer/searchbox_extension.cc

Issue 9969191: Make SearchBox extension call through WebFrame to execute page script (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: patch for landing Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698