diff options
author | scr@chromium.org <scr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-02 04:18:33 +0000 |
---|---|---|
committer | scr@chromium.org <scr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-02 04:18:33 +0000 |
commit | 350019fded4b55fec4392bab8a97664cbd803c4c (patch) | |
tree | 746e4e9490a01dfb3b316f0266c1bd162873d6dc /chrome/renderer/chrome_render_view_observer.cc | |
parent | 5f7c4fedfa98229c863acbd8977747571c37cb7d (diff) | |
download | chromium_src-350019fded4b55fec4392bab8a97664cbd803c4c.zip chromium_src-350019fded4b55fec4392bab8a97664cbd803c4c.tar.gz chromium_src-350019fded4b55fec4392bab8a97664cbd803c4c.tar.bz2 |
Preload with RVH/RV messaging instead of NOTIFICATION_NAV_ENTRY_COMMITTED.
This patch is the first working version using a preload message in the style of
viewsource.
NOTIFICATION_NAV_ENTRY_COMMITTED was too late as it was after the navigate
command was sent and was a race condition to inject before the onload ran.
Basic gist of this patch is:
- Wait for RVH creation by listening for NOTIFICATION_RENDER_VIEW_HOST_CREATED.
Since this is called from constructor, we must listen to AllSources() and
assume the next RVH creation is ours. This is controlled test case, so we're
probably ok.
- When RenderViewHostInitialized, call the OnJsInjectionReady passing the
RVH. JsInjectionReadyObserver should now use that RVH to Send a
ViewMsg_WebUIJavascript message to register javascript to preload.
- the ChromeRenderViewObserver will stash the javascript and load it when
DidStartLoading.
BUG=90476
TEST=browser_tests --gtest_filter=PrintPreview*WebUI*.*
Review URL: http://codereview.chromium.org/7531029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@95048 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/chrome_render_view_observer.cc')
-rw-r--r-- | chrome/renderer/chrome_render_view_observer.cc | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/chrome/renderer/chrome_render_view_observer.cc b/chrome/renderer/chrome_render_view_observer.cc index 76f951c..711d418 100644 --- a/chrome/renderer/chrome_render_view_observer.cc +++ b/chrome/renderer/chrome_render_view_observer.cc @@ -218,6 +218,7 @@ ChromeRenderViewObserver::~ChromeRenderViewObserver() { bool ChromeRenderViewObserver::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(ChromeRenderViewObserver, message) + IPC_MESSAGE_HANDLER(ViewMsg_WebUIJavaScript, OnWebUIJavaScript) IPC_MESSAGE_HANDLER(ViewMsg_CaptureSnapshot, OnCaptureSnapshot) IPC_MESSAGE_HANDLER(ViewMsg_HandleMessageFromExternalHost, OnHandleMessageFromExternalHost) @@ -243,6 +244,18 @@ bool ChromeRenderViewObserver::OnMessageReceived(const IPC::Message& message) { return handled; } +void ChromeRenderViewObserver::OnWebUIJavaScript( + const string16& frame_xpath, + const string16& jscript, + int id, + bool notify_result) { + webui_javascript_.reset(new WebUIJavaScript()); + webui_javascript_->frame_xpath = frame_xpath; + webui_javascript_->jscript = jscript; + webui_javascript_->id = id; + webui_javascript_->notify_result = notify_result; +} + void ChromeRenderViewObserver::OnCaptureSnapshot() { SkBitmap snapshot; bool error = false; @@ -602,6 +615,16 @@ void ChromeRenderViewObserver::OnSetIsPrerendering(bool is_prerendering) { } } +void ChromeRenderViewObserver::DidStartLoading() { + if (BindingsPolicy::is_web_ui_enabled(render_view()->enabled_bindings()) && + webui_javascript_.get()) { + render_view()->EvaluateScript(webui_javascript_->frame_xpath, + webui_javascript_->jscript, + webui_javascript_->id, + webui_javascript_->notify_result); + } +} + void ChromeRenderViewObserver::DidStopLoading() { MessageLoop::current()->PostDelayedTask( FROM_HERE, |