summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/chrome_render_view_observer.cc
diff options
context:
space:
mode:
authorscr@chromium.org <scr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-02 04:18:33 +0000
committerscr@chromium.org <scr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-02 04:18:33 +0000
commit350019fded4b55fec4392bab8a97664cbd803c4c (patch)
tree746e4e9490a01dfb3b316f0266c1bd162873d6dc /chrome/renderer/chrome_render_view_observer.cc
parent5f7c4fedfa98229c863acbd8977747571c37cb7d (diff)
downloadchromium_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.cc23
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,