summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/renderer_host/browser_render_process_host.cc1
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc10
-rw-r--r--chrome/browser/renderer_host/render_view_host.h1
-rw-r--r--chrome/browser/renderer_host/render_view_host_delegate.h4
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc5
-rw-r--r--chrome/browser/tab_contents/tab_contents.h1
-rw-r--r--chrome/browser/tab_contents/tab_contents_delegate.cc4
-rw-r--r--chrome/browser/tab_contents/tab_contents_delegate.h3
-rw-r--r--chrome/chrome_renderer.gypi2
-rw-r--r--chrome/common/render_messages_internal.h6
-rw-r--r--chrome/renderer/render_thread.cc5
-rw-r--r--chrome/renderer/render_view.cc5
-rw-r--r--chrome/renderer/render_view.h3
-rw-r--r--chrome/renderer/search_extension.cc96
-rw-r--r--chrome/renderer/search_extension.h24
15 files changed, 170 insertions, 0 deletions
diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc
index f7a9b17..ce76ff9 100644
--- a/chrome/browser/renderer_host/browser_render_process_host.cc
+++ b/chrome/browser/renderer_host/browser_render_process_host.cc
@@ -579,6 +579,7 @@ void BrowserRenderProcessHost::PropagateBrowserCommandLineToRenderer(
switches::kPrelaunchGpuProcess,
switches::kEnableAcceleratedDecoding,
switches::kEnableFileSystem,
+ switches::kEnableMatchPreview
};
renderer_cmd->CopySwitchesFrom(browser_cmd, kSwitchNames,
arraysize(kSwitchNames));
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index 9d06007..998d87c 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -855,6 +855,7 @@ void RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnMsgFocusedNodeChanged)
IPC_MESSAGE_HANDLER(ViewHostMsg_SetDisplayingPDFContent,
OnSetDisplayingPDFContent)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_SetSuggestResult, OnSetSuggestResult)
// Have the super handle all other messages.
IPC_MESSAGE_UNHANDLED(RenderWidgetHost::OnMessageReceived(msg))
IPC_END_MESSAGE_MAP_EX()
@@ -2071,3 +2072,12 @@ void RenderViewHost::OnWebDatabaseAccessed(const GURL& url,
void RenderViewHost::OnSetDisplayingPDFContent() {
delegate_->SetDisplayingPDFContent();
}
+
+void RenderViewHost::OnSetSuggestResult(int32 page_id,
+ const std::string& result) {
+ RenderViewHostDelegate::BrowserIntegration* integration_delegate =
+ delegate_->GetBrowserIntegrationDelegate();
+ if (!integration_delegate)
+ return;
+ integration_delegate->OnSetSuggestResult(page_id, result);
+}
diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h
index c971918..deccb72 100644
--- a/chrome/browser/renderer_host/render_view_host.h
+++ b/chrome/browser/renderer_host/render_view_host.h
@@ -677,6 +677,7 @@ class RenderViewHost : public RenderWidgetHost {
unsigned long estimated_size,
bool blocked_by_policy);
void OnSetDisplayingPDFContent();
+ void OnSetSuggestResult(int32 page_id, const std::string& result);
private:
friend class TestRenderViewHost;
diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h
index 27f9dc8..ebe088e 100644
--- a/chrome/browser/renderer_host/render_view_host_delegate.h
+++ b/chrome/browser/renderer_host/render_view_host_delegate.h
@@ -281,6 +281,10 @@ class RenderViewHostDelegate {
const std::string& translated_lang,
TranslateErrors::Type error_type) = 0;
+ // Notification that the page has a suggest result.
+ virtual void OnSetSuggestResult(int32 page_id,
+ const std::string& result) = 0;
+
protected:
virtual ~BrowserIntegration() {}
};
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index 3c35e61..01a303f 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -2112,6 +2112,11 @@ void TabContents::OnPageTranslated(int32 page_id,
Details<PageTranslatedDetails>(&details));
}
+void TabContents::OnSetSuggestResult(int32 page_id, const std::string& result) {
+ if (delegate())
+ delegate()->OnSetSuggestResult(page_id, result);
+}
+
void TabContents::DidStartProvisionalLoadForFrame(
RenderViewHost* render_view_host,
bool is_main_frame,
diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h
index 94b2ca7..56b2844 100644
--- a/chrome/browser/tab_contents/tab_contents.h
+++ b/chrome/browser/tab_contents/tab_contents.h
@@ -864,6 +864,7 @@ class TabContents : public PageNavigator,
const std::string& original_lang,
const std::string& translated_lang,
TranslateErrors::Type error_type);
+ virtual void OnSetSuggestResult(int32 page_id, const std::string& result);
// RenderViewHostDelegate::Resource implementation.
virtual void DidStartProvisionalLoadForFrame(RenderViewHost* render_view_host,
diff --git a/chrome/browser/tab_contents/tab_contents_delegate.cc b/chrome/browser/tab_contents/tab_contents_delegate.cc
index 2735a2c..615a438 100644
--- a/chrome/browser/tab_contents/tab_contents_delegate.cc
+++ b/chrome/browser/tab_contents/tab_contents_delegate.cc
@@ -168,5 +168,9 @@ void TabContentsDelegate::ContentTypeChanged(TabContents* source) {
void TabContentsDelegate::CommitMatchPreview(TabContents* source) {
}
+void TabContentsDelegate::OnSetSuggestResult(int32 page_id,
+ const std::string& result) {
+}
+
TabContentsDelegate::~TabContentsDelegate() {
}
diff --git a/chrome/browser/tab_contents/tab_contents_delegate.h b/chrome/browser/tab_contents/tab_contents_delegate.h
index 629a8d4..56b4c9f 100644
--- a/chrome/browser/tab_contents/tab_contents_delegate.h
+++ b/chrome/browser/tab_contents/tab_contents_delegate.h
@@ -290,6 +290,9 @@ class TabContentsDelegate : public AutomationResourceRoutingDelegate {
// preview TabContents.
virtual void CommitMatchPreview(TabContents* source);
+ // Notifies the delegate that the page has a suggest result.
+ virtual void OnSetSuggestResult(int32 page_id, const std::string& result);
+
protected:
virtual ~TabContentsDelegate();
};
diff --git a/chrome/chrome_renderer.gypi b/chrome/chrome_renderer.gypi
index f2ddc13..92b77e1 100644
--- a/chrome/chrome_renderer.gypi
+++ b/chrome/chrome_renderer.gypi
@@ -199,6 +199,8 @@
'renderer/safe_browsing/phishing_term_feature_extractor.h',
'renderer/safe_browsing/phishing_url_feature_extractor.cc',
'renderer/safe_browsing/phishing_url_feature_extractor.h',
+ 'renderer/search_extension.cc',
+ 'renderer/search_extension.h',
'renderer/speech_input_dispatcher.cc',
'renderer/speech_input_dispatcher.h',
'renderer/spellchecker/spellcheck.cc',
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index 3dd2707..bca49fa 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -2826,4 +2826,10 @@ IPC_BEGIN_MESSAGES(ViewHost)
// Unregister a blob URL.
IPC_MESSAGE_CONTROL1(ViewHostMsg_UnregisterBlobUrl, GURL /* url */)
+ // Suggest results -----------------------------------------------------------
+
+ IPC_MESSAGE_ROUTED2(ViewHostMsg_SetSuggestResult,
+ int32 /* page_id */,
+ std::string /* suggest */)
+
IPC_END_MESSAGES(ViewHost)
diff --git a/chrome/renderer/render_thread.cc b/chrome/renderer/render_thread.cc
index edbe0c9..a067435 100644
--- a/chrome/renderer/render_thread.cc
+++ b/chrome/renderer/render_thread.cc
@@ -65,6 +65,7 @@
#include "chrome/renderer/renderer_histogram_snapshots.h"
#include "chrome/renderer/renderer_webidbfactory_impl.h"
#include "chrome/renderer/renderer_webkitclient_impl.h"
+#include "chrome/renderer/search_extension.h"
#include "chrome/renderer/spellchecker/spellcheck.h"
#include "chrome/renderer/user_script_slave.h"
#include "ipc/ipc_channel_handle.h"
@@ -855,6 +856,10 @@ void RenderThread::EnsureWebKitInitialized() {
extensions_v8::ChromeAppExtension::Get());
WebScriptController::registerExtension(
extensions_v8::ExternalExtension::Get());
+ v8::Extension* search_extension = extensions_v8::SearchExtension::Get();
+ // search_extension is null if not enabled.
+ if (search_extension)
+ WebScriptController::registerExtension(search_extension);
// TODO(rafaelw). Note that extension-related v8 extensions are being
// bound currently based on is_extension_process_. This means that
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index ed19289..02d7fa5 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -4061,6 +4061,11 @@ WebFrame* RenderView::GetChildFrame(const std::wstring& xpath) const {
return frame;
}
+void RenderView::SetSuggestResult(const std::string& suggest) {
+ if (!suggest.empty())
+ Send(new ViewHostMsg_SetSuggestResult(routing_id_, page_id_, suggest));
+}
+
void RenderView::EvaluateScript(const std::wstring& frame_xpath,
const std::wstring& script) {
WebFrame* web_frame = GetChildFrame(frame_xpath);
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index cd57b10..97ee04a 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -224,6 +224,9 @@ class RenderView : public RenderWidget,
GetSearchProviderInstallState(WebKit::WebFrame* frame,
const std::string& url);
+ // Sends ViewHostMsg_SetSuggestResult to the browser.
+ void SetSuggestResult(const std::string& suggest);
+
// Evaluates a string of JavaScript in a particular frame.
void EvaluateScript(const std::wstring& frame_xpath,
const std::wstring& jscript);
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
diff --git a/chrome/renderer/search_extension.h b/chrome/renderer/search_extension.h
new file mode 100644
index 0000000..6bd45bd
--- /dev/null
+++ b/chrome/renderer/search_extension.h
@@ -0,0 +1,24 @@
+// 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.
+
+#ifndef CHROME_RENDERER_SEARCH_EXTENSION_H_
+#define CHROME_RENDERER_SEARCH_EXTENSION_H_
+#pragma once
+
+namespace v8 {
+class Extension;
+}
+
+namespace extensions_v8 {
+
+class SearchExtension {
+ public:
+ // Returns the v8::Extension object handling search bindings. Returns null if
+ // match-preview is not enabled. Caller takes ownership of returned object.
+ static v8::Extension* Get();
+};
+
+} // namespace extensions_v8
+
+#endif // CHROME_RENDERER_SEARCH_EXTENSION_H_