summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/search_extension.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer/search_extension.cc')
-rw-r--r--chrome/renderer/search_extension.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/chrome/renderer/search_extension.cc b/chrome/renderer/search_extension.cc
new file mode 100644
index 0000000..859ed8c
--- /dev/null
+++ b/chrome/renderer/search_extension.cc
@@ -0,0 +1,96 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/renderer/search_extension.h"
+
+#include "base/command_line.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/common/render_messages_params.h"
+#include "chrome/renderer/render_view.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebFrame.h"
+#include "v8/include/v8.h"
+
+using WebKit::WebFrame;
+using WebKit::WebView;
+
+namespace extensions_v8 {
+
+const char* const kSearchExtensionName = "v8/InstantSearch";
+
+class SearchExtensionWrapper : public v8::Extension {
+ public:
+ SearchExtensionWrapper();
+
+ // Allows v8's javascript code to call the native functions defined
+ // in this class for window.chrome.
+ virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
+ v8::Handle<v8::String> name);
+
+ // Helper function to find the RenderView. May return NULL.
+ static RenderView* GetRenderView();
+
+ // Implementation of window.chrome.setSuggestResult.
+ static v8::Handle<v8::Value> SetSuggestResult(const v8::Arguments& args);
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SearchExtensionWrapper);
+};
+
+SearchExtensionWrapper::SearchExtensionWrapper()
+ : v8::Extension(kSearchExtensionName,
+ "var chrome;"
+ "if (!chrome)"
+ " chrome = {};"
+ "chrome.setSuggestResult = function(text) {"
+ " native function NativeSetSuggestResult();"
+ " NativeSetSuggestResult(text);"
+ "};") {
+}
+
+v8::Handle<v8::FunctionTemplate> SearchExtensionWrapper::GetNativeFunction(
+ v8::Handle<v8::String> name) {
+ if (name->Equals(v8::String::New("NativeSetSuggestResult"))) {
+ return v8::FunctionTemplate::New(SetSuggestResult);
+ }
+
+ return v8::Handle<v8::FunctionTemplate>();
+}
+
+// static
+RenderView* SearchExtensionWrapper::GetRenderView() {
+ WebFrame* webframe = WebFrame::frameForEnteredContext();
+ DCHECK(webframe) << "There should be an active frame since we just got "
+ "a native function called.";
+ if (!webframe) return NULL;
+
+ WebView* webview = webframe->view();
+ if (!webview) return NULL; // can happen during closing
+
+ return RenderView::FromWebView(webview);
+}
+
+// static
+v8::Handle<v8::Value> SearchExtensionWrapper::SetSuggestResult(
+ const v8::Arguments& args) {
+ if (!args.Length()) return v8::Undefined();
+
+ std::string suggest = std::string(*v8::String::Utf8Value(args[0]));
+ if (!suggest.length()) return v8::Undefined();
+
+ RenderView* render_view = GetRenderView();
+ if (!render_view) return v8::Undefined();
+
+ render_view->SetSuggestResult(suggest);
+ return v8::Undefined();
+}
+
+v8::Extension* SearchExtension::Get() {
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableMatchPreview)) {
+ return new SearchExtensionWrapper();
+ }
+ return NULL;
+}
+
+} // namespace extensions_v8