diff options
author | kbr@google.com <kbr@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-17 19:05:46 +0000 |
---|---|---|
committer | kbr@google.com <kbr@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-17 19:05:46 +0000 |
commit | c091c2c92ee26788d063f939297312f9b43f1df2 (patch) | |
tree | 5ea5ed64e088477b8f77e458f63634f6d4124576 /chrome/renderer | |
parent | c5ef91caf12d91c53e3b7bd8ced24f549c4c5485 (diff) | |
download | chromium_src-c091c2c92ee26788d063f939297312f9b43f1df2.zip chromium_src-c091c2c92ee26788d063f939297312f9b43f1df2.tar.gz chromium_src-c091c2c92ee26788d063f939297312f9b43f1df2.tar.bz2 |
Fixed crash in DOM UI setup caused by lazy instantiation of the
DOMUIBindings. Added helper functions to lazily instantiate both
DOMUIBindings and ExternalHostBindings and call them from all access
sites in render_view.
Also incorporated re-enabling of InputFileTriggerFileBrowse test
thanks to xiyuan in http://codereview.chromium.org/3466001 .
BUG=55959
TEST=none
Review URL: http://codereview.chromium.org/3412011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59826 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/render_view.cc | 40 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 4 |
2 files changed, 27 insertions, 17 deletions
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 95da382..9f1fcb6 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -3081,20 +3081,14 @@ void RenderView::didClearWindowObject(WebFrame* frame) { if (BindingsPolicy::is_dom_automation_enabled(enabled_bindings_)) BindDOMAutomationController(frame); if (BindingsPolicy::is_dom_ui_enabled(enabled_bindings_)) { - if (!dom_ui_bindings_.get()) { - dom_ui_bindings_.reset(new DOMUIBindings()); - } - dom_ui_bindings_->set_message_sender(this); - dom_ui_bindings_->set_routing_id(routing_id_); - dom_ui_bindings_->BindToJavascript(frame, L"chrome"); + GetDOMUIBindings()->set_message_sender(this); + GetDOMUIBindings()->set_routing_id(routing_id_); + GetDOMUIBindings()->BindToJavascript(frame, L"chrome"); } if (BindingsPolicy::is_external_host_enabled(enabled_bindings_)) { - if (!external_host_bindings_.get()) { - external_host_bindings_.reset(new ExternalHostBindings()); - } - external_host_bindings_->set_message_sender(this); - external_host_bindings_->set_routing_id(routing_id_); - external_host_bindings_->BindToJavascript(frame, L"externalHost"); + GetExternalHostBindings()->set_message_sender(this); + GetExternalHostBindings()->set_routing_id(routing_id_); + GetExternalHostBindings()->BindToJavascript(frame, L"externalHost"); } } @@ -3802,6 +3796,20 @@ GURL RenderView::GetAlternateErrorPageURL(const GURL& failed_url, return url; } +DOMUIBindings* RenderView::GetDOMUIBindings() { + if (!dom_ui_bindings_.get()) { + dom_ui_bindings_.reset(new DOMUIBindings()); + } + return dom_ui_bindings_.get(); +} + +ExternalHostBindings* RenderView::GetExternalHostBindings() { + if (!external_host_bindings_.get()) { + external_host_bindings_.reset(new ExternalHostBindings()); + } + return external_host_bindings_.get(); +} + WebKit::WebPlugin* RenderView::GetWebPluginFromPluginDocument() { return webview()->mainFrame()->document().to<WebPluginDocument>().plugin(); } @@ -4197,8 +4205,7 @@ void RenderView::OnAllowBindings(int enabled_bindings_flags) { void RenderView::OnSetDOMUIProperty(const std::string& name, const std::string& value) { DCHECK(BindingsPolicy::is_dom_ui_enabled(enabled_bindings_)); - DCHECK(dom_ui_bindings_.get()); - dom_ui_bindings_->SetProperty(name, value); + GetDOMUIBindings()->SetProperty(name, value); } void RenderView::OnReservePageIDRange(int size_of_range) { @@ -4554,9 +4561,8 @@ void RenderView::OnHandleMessageFromExternalHost(const std::string& message, const std::string& target) { if (message.empty()) return; - DCHECK(external_host_bindings_.get()); - external_host_bindings_->ForwardMessageFromExternalHost(message, origin, - target); + GetExternalHostBindings()->ForwardMessageFromExternalHost(message, origin, + target); } void RenderView::OnDisassociateFromPopupCount() { diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 7b552d7..0013ee9 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -959,6 +959,10 @@ class RenderView : public RenderWidget, // Locates a sub frame with given xpath WebKit::WebFrame* GetChildFrame(const std::wstring& frame_xpath) const; + DOMUIBindings* GetDOMUIBindings(); + + ExternalHostBindings* GetExternalHostBindings(); + // Should only be called if this object wraps a PluginDocument. WebKit::WebPlugin* GetWebPluginFromPluginDocument(); |