diff options
-rw-r--r-- | chrome/browser/renderer_host/browser_render_process_host.cc | 1 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.cc | 10 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.h | 1 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host_delegate.h | 4 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.cc | 5 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.h | 1 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_delegate.cc | 4 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_delegate.h | 3 | ||||
-rw-r--r-- | chrome/chrome_renderer.gypi | 2 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 6 | ||||
-rw-r--r-- | chrome/renderer/render_thread.cc | 5 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 5 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 3 | ||||
-rw-r--r-- | chrome/renderer/search_extension.cc | 96 | ||||
-rw-r--r-- | chrome/renderer/search_extension.h | 24 |
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_ |