From b3f982dd737365aec984b7eec39e60fdde8608bc Mon Sep 17 00:00:00 2001 From: Marshall Greenblatt Date: Tue, 29 May 2012 17:18:33 +0000 Subject: [PATCH] Avoid crash due to missing prerenderer support (issue #608). git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@652 5089003a-bbd8-11dd-ad1f-f1f9622dbc98 --- libcef/renderer/content_renderer_client.cc | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/libcef/renderer/content_renderer_client.cc b/libcef/renderer/content_renderer_client.cc index 6baacec8a..f837a923d 100644 --- a/libcef/renderer/content_renderer_client.cc +++ b/libcef/renderer/content_renderer_client.cc @@ -15,13 +15,46 @@ #include "content/public/renderer/render_thread.h" #include "content/public/renderer/render_view.h" #include "ipc/ipc_sync_channel.h" +#include "third_party/WebKit/Source/Platform/chromium/public/WebPrerenderingSupport.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebPrerendererClient.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" #include "v8/include/v8.h" +namespace { + +// Stub implementation of WebKit::WebPrerenderingSupport. +class CefPrerenderingSupport : public WebKit::WebPrerenderingSupport { + public: + virtual ~CefPrerenderingSupport() {} + + private: + virtual void add(const WebKit::WebPrerender& prerender) OVERRIDE {} + virtual void cancel(const WebKit::WebPrerender& prerender) OVERRIDE {} + virtual void abandon(const WebKit::WebPrerender& prerender) OVERRIDE {} +}; + +// Stub implementation of WebKit::WebPrerendererClient. +class CefPrerendererClient : public content::RenderViewObserver, + public WebKit::WebPrerendererClient { + public: + explicit CefPrerendererClient(content::RenderView* render_view) + : content::RenderViewObserver(render_view) { + DCHECK(render_view); + render_view->GetWebView()->setPrerendererClient(this); + } + + private: + virtual ~CefPrerendererClient() {} + + virtual void willAddPrerender(WebKit::WebPrerender* prerender) OVERRIDE {} +}; + +} // namespace + struct CefContentRendererClient::SchemeInfo { std::string scheme_name; bool is_local; @@ -112,6 +145,8 @@ void CefContentRendererClient::RenderThreadStarted() { content::RenderThread* thread = content::RenderThread::Get(); thread->AddObserver(observer_.get()); + WebKit::WebPrerenderingSupport::initialize(new CefPrerenderingSupport()); + thread->Send(new CefProcessHostMsg_RenderThreadStarted); // Notify the render process handler. @@ -128,6 +163,8 @@ void CefContentRendererClient::RenderViewCreated( content::RenderView* render_view) { CefRefPtr browser = new CefBrowserImpl(render_view); browsers_.insert(std::make_pair(render_view, browser)); + + new CefPrerendererClient(render_view); } void CefContentRendererClient::SetNumberOfViews(int number_of_views) {