summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkbr@google.com <kbr@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-17 19:05:46 +0000
committerkbr@google.com <kbr@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-17 19:05:46 +0000
commitc091c2c92ee26788d063f939297312f9b43f1df2 (patch)
tree5ea5ed64e088477b8f77e458f63634f6d4124576
parentc5ef91caf12d91c53e3b7bd8ced24f549c4c5485 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/dom_ui/file_browse_browsertest.cc2
-rw-r--r--chrome/renderer/render_view.cc40
-rw-r--r--chrome/renderer/render_view.h4
3 files changed, 28 insertions, 18 deletions
diff --git a/chrome/browser/dom_ui/file_browse_browsertest.cc b/chrome/browser/dom_ui/file_browse_browsertest.cc
index d775e1c..c8d7a1f 100644
--- a/chrome/browser/dom_ui/file_browse_browsertest.cc
+++ b/chrome/browser/dom_ui/file_browse_browsertest.cc
@@ -102,7 +102,7 @@ class FileBrowseUiObserver : public NotificationObserver {
DISALLOW_COPY_AND_ASSIGN(FileBrowseUiObserver);
};
-IN_PROC_BROWSER_TEST_F(FileBrowseBrowserTest, FAILS_InputFileTriggerFileBrowse) {
+IN_PROC_BROWSER_TEST_F(FileBrowseBrowserTest, InputFileTriggerFileBrowse) {
ASSERT_TRUE(test_server()->Start());
ui_test_utils::NavigateToURL(browser(),
test_server()->GetURL("files/input_file.html"));
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();