summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjohnnyg@chromium.org <johnnyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-13 23:43:23 +0000
committerjohnnyg@chromium.org <johnnyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-13 23:43:23 +0000
commit79bb91d1df82b4eb6e0fae56d3fd3f53ef7b74b6 (patch)
treeb4a89b4719dda04897c0c316070066004ee81eb7 /chrome
parentfac8e07ac35d3b5eb86c573ba3b0a8309fe0ab31 (diff)
downloadchromium_src-79bb91d1df82b4eb6e0fae56d3fd3f53ef7b74b6.zip
chromium_src-79bb91d1df82b4eb6e0fae56d3fd3f53ef7b74b6.tar.gz
chromium_src-79bb91d1df82b4eb6e0fae56d3fd3f53ef7b74b6.tar.bz2
Reland http://codereview.chromium.org/3573014/show.
BUG=57885 TEST=included Review URL: http://codereview.chromium.org/3755006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62478 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/dom_ui/constrained_html_dialog.cc43
-rw-r--r--chrome/browser/dom_ui/constrained_html_dialog.h60
-rw-r--r--chrome/browser/dom_ui/dom_ui.cc11
-rw-r--r--chrome/browser/dom_ui/dom_ui.h8
-rw-r--r--chrome/browser/views/constrained_html_dialog_browsertest.cc95
-rw-r--r--chrome/browser/views/constrained_html_dialog_win.cc118
-rw-r--r--chrome/browser/views/constrained_html_dialog_win.h66
-rw-r--r--chrome/chrome_browser.gypi4
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/common/view_types.h1
10 files changed, 402 insertions, 5 deletions
diff --git a/chrome/browser/dom_ui/constrained_html_dialog.cc b/chrome/browser/dom_ui/constrained_html_dialog.cc
new file mode 100644
index 0000000..baa3cc6
--- /dev/null
+++ b/chrome/browser/dom_ui/constrained_html_dialog.cc
@@ -0,0 +1,43 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/dom_ui/constrained_html_dialog.h"
+
+#include "chrome/browser/dom_ui/dom_ui_util.h"
+#include "chrome/browser/dom_ui/html_dialog_ui.h"
+#include "chrome/browser/renderer_host/render_view_host.h"
+
+ConstrainedHtmlDialog::ConstrainedHtmlDialog(Profile* profile,
+ HtmlDialogUIDelegate* delegate)
+ : DOMUI(NULL),
+ profile_(profile),
+ render_view_host_(NULL),
+ html_dialog_ui_delegate_(delegate) {
+}
+
+ConstrainedHtmlDialog::~ConstrainedHtmlDialog() {
+}
+
+void ConstrainedHtmlDialog::InitializeDOMUI(RenderViewHost* render_view_host) {
+ render_view_host_ = render_view_host;
+
+ std::vector<DOMMessageHandler*> handlers;
+ html_dialog_ui_delegate_->GetDOMMessageHandlers(&handlers);
+ render_view_host->SetDOMUIProperty("dialogArguments",
+ html_dialog_ui_delegate_->GetDialogArgs());
+ for (std::vector<DOMMessageHandler*>::iterator it = handlers.begin();
+ it != handlers.end(); ++it) {
+ (*it)->Attach(this);
+ AddMessageHandler(*it);
+ }
+
+ // Add a "DialogClosed" callback which matches HTMLDialogUI behavior.
+ RegisterMessageCallback("DialogClose",
+ NewCallback(this, &ConstrainedHtmlDialog::OnDialogClosed));
+}
+
+void ConstrainedHtmlDialog::OnDialogClosed(const ListValue* args) {
+ html_dialog_ui_delegate()->OnDialogClosed(
+ dom_ui_util::GetJsonResponseFromFirstArgumentInList(args));
+}
diff --git a/chrome/browser/dom_ui/constrained_html_dialog.h b/chrome/browser/dom_ui/constrained_html_dialog.h
new file mode 100644
index 0000000..9eda12a
--- /dev/null
+++ b/chrome/browser/dom_ui/constrained_html_dialog.h
@@ -0,0 +1,60 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_DOM_UI_CONSTRAINED_HTML_DIALOG_H_
+#define CHROME_BROWSER_DOM_UI_CONSTRAINED_HTML_DIALOG_H_
+#pragma once
+
+#include <vector>
+
+#include "chrome/browser/dom_ui/dom_ui.h"
+#include "chrome/browser/tab_contents/constrained_window.h"
+
+class HtmlDialogUIDelegate;
+class Profile;
+class RenderViewHost;
+
+// ConstrainedHtmlDialog is a facility to show HTML DOM_UI content
+// in a tab-modal constrained dialog. It is implemented as an adapter
+// between an HtmlDialogUI object and a ConstrainedWindow object.
+//
+// Since ConstrainedWindow requires platform-specific delegate
+// implementations, this class is just a factory stub.
+class ConstrainedHtmlDialog : public DOMUI {
+ public:
+ static ConstrainedHtmlDialog* CreateConstrainedHTMLDialog(
+ Profile* profile,
+ HtmlDialogUIDelegate* delegate);
+
+ virtual ConstrainedWindowDelegate* GetConstrainedWindowDelegate() = 0;
+
+ // DOMUI override since this class does not use TabContents.
+ Profile* GetProfile() const { return profile_; }
+
+ protected:
+ ConstrainedHtmlDialog(Profile* profile,
+ HtmlDialogUIDelegate* delegate);
+ virtual ~ConstrainedHtmlDialog();
+
+ HtmlDialogUIDelegate* html_dialog_ui_delegate() {
+ return html_dialog_ui_delegate_;
+ }
+
+ // DOMUI override since this class does not use TabContents.
+ RenderViewHost* GetRenderViewHost() const { return render_view_host_; }
+
+ void InitializeDOMUI(RenderViewHost* render_view_host);
+
+ private:
+ // JS Message Handler
+ void OnDialogClosed(const ListValue* args);
+
+ Profile* profile_;
+ RenderViewHost* render_view_host_;
+ HtmlDialogUIDelegate* html_dialog_ui_delegate_;
+
+ DISALLOW_COPY_AND_ASSIGN(ConstrainedHtmlDialog);
+};
+
+#endif // CHROME_BROWSER_DOM_UI_CONSTRAINED_HTML_DIALOG_H_
diff --git a/chrome/browser/dom_ui/dom_ui.cc b/chrome/browser/dom_ui/dom_ui.cc
index a7f5a52..e6481b6 100644
--- a/chrome/browser/dom_ui/dom_ui.cc
+++ b/chrome/browser/dom_ui/dom_ui.cc
@@ -118,7 +118,7 @@ void DOMUI::CallJavascriptFunction(
}
ThemeProvider* DOMUI::GetThemeProvider() const {
- return tab_contents_->profile()->GetThemeProvider();
+ return GetProfile()->GetThemeProvider();
}
void DOMUI::RegisterMessageCallback(const std::string &message,
@@ -127,6 +127,7 @@ void DOMUI::RegisterMessageCallback(const std::string &message,
}
Profile* DOMUI::GetProfile() const {
+ DCHECK(tab_contents());
return tab_contents()->profile();
}
@@ -136,11 +137,15 @@ void DOMUI::AddMessageHandler(DOMMessageHandler* handler) {
handlers_.push_back(handler);
}
+RenderViewHost* DOMUI::GetRenderViewHost() const {
+ DCHECK(tab_contents());
+ return tab_contents()->render_view_host();
+}
+
// DOMUI, private: ------------------------------------------------------------
void DOMUI::ExecuteJavascript(const std::wstring& javascript) {
- tab_contents()->render_view_host()->ExecuteJavascriptInWebFrame(
- std::wstring(), javascript);
+ GetRenderViewHost()->ExecuteJavascriptInWebFrame(std::wstring(), javascript);
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/dom_ui/dom_ui.h b/chrome/browser/dom_ui/dom_ui.h
index e6df31a..42ffe2a 100644
--- a/chrome/browser/dom_ui/dom_ui.h
+++ b/chrome/browser/dom_ui/dom_ui.h
@@ -116,9 +116,13 @@ class DOMUI {
ThemeProvider* GetThemeProvider() const;
- TabContents* tab_contents() const { return tab_contents_; }
+ // May be overridden by DOMUI's which do not have a tab contents.
+ virtual Profile* GetProfile() const;
+
+ // May be overridden by DOMUI's which do not have a tab contents.
+ virtual RenderViewHost* GetRenderViewHost() const;
- Profile* GetProfile() const;
+ TabContents* tab_contents() const { return tab_contents_; }
protected:
void AddMessageHandler(DOMMessageHandler* handler);
diff --git a/chrome/browser/views/constrained_html_dialog_browsertest.cc b/chrome/browser/views/constrained_html_dialog_browsertest.cc
new file mode 100644
index 0000000..0ee6263
--- /dev/null
+++ b/chrome/browser/views/constrained_html_dialog_browsertest.cc
@@ -0,0 +1,95 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/test/ui/ui_test.h"
+
+#include "base/file_path.h"
+#include "base/message_loop.h"
+#include "chrome/browser/chrome_thread.h"
+#include "chrome/browser/dom_ui/constrained_html_dialog.h"
+#include "chrome/browser/renderer_host/render_widget_host_view.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#if defined(OS_WIN)
+#include "chrome/browser/views/constrained_html_dialog_win.h"
+#endif
+#include "chrome/browser/views/html_dialog_view.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/test/in_process_browser_test.h"
+#include "chrome/test/ui_test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "views/widget/widget.h"
+#include "views/window/window.h"
+
+using testing::Eq;
+
+namespace {
+
+// Window non-client-area means that the minimum size for the window
+// won't be the actual minimum size - our layout and resizing code
+// makes sure the chrome is always visible.
+const int kMinimumWidthToTestFor = 20;
+const int kMinimumHeightToTestFor = 30;
+
+class TestHtmlDialogUIDelegate : public HtmlDialogUIDelegate {
+ public:
+ TestHtmlDialogUIDelegate() {}
+ virtual ~TestHtmlDialogUIDelegate() {}
+
+ // HTMLDialogUIDelegate implementation:
+ virtual bool IsDialogModal() const {
+ return true;
+ }
+ virtual std::wstring GetDialogTitle() const {
+ return std::wstring(L"Test");
+ }
+ virtual GURL GetDialogContentURL() const {
+ return GURL(chrome::kAboutAboutURL);
+ }
+ virtual void GetDOMMessageHandlers(
+ std::vector<DOMMessageHandler*>* handlers) const {}
+ virtual void GetDialogSize(gfx::Size* size) const {
+ size->set_width(400);
+ size->set_height(400);
+ }
+ virtual std::string GetDialogArgs() const {
+ return std::string();
+ }
+ virtual void OnDialogClosed(const std::string& json_retval) { }
+ virtual void OnCloseContents(TabContents* source, bool* out_close_dialog) {
+ if (out_close_dialog)
+ *out_close_dialog = true;
+ }
+};
+
+} // namespace
+
+#if defined(OS_WIN)
+
+class ConstrainedHtmlDialogBrowserTest : public InProcessBrowserTest {
+ public:
+ ConstrainedHtmlDialogBrowserTest() {}
+};
+
+IN_PROC_BROWSER_TEST_F(ConstrainedHtmlDialogBrowserTest, LoadWindow) {
+ HtmlDialogUIDelegate* delegate = new TestHtmlDialogUIDelegate();
+
+ ConstrainedHtmlDialogWin* dialog =
+ new ConstrainedHtmlDialogWin(browser()->profile(), delegate);
+
+ TabContents* tab_contents = browser()->GetSelectedTabContents();
+ ASSERT_TRUE(tab_contents != NULL);
+ ConstrainedWindow* window = tab_contents->CreateConstrainedDialog(
+ dialog->GetConstrainedWindowDelegate());
+
+ EXPECT_EQ(1, tab_contents->constrained_window_count());
+
+ gfx::Rect bounds = dialog->GetContentsView()->bounds();
+ EXPECT_LT(0, bounds.width());
+ EXPECT_LT(0, bounds.height());
+ EXPECT_GE(400, bounds.width());
+ EXPECT_GE(400, bounds.height());
+}
+
+#endif // OS_WIN
diff --git a/chrome/browser/views/constrained_html_dialog_win.cc b/chrome/browser/views/constrained_html_dialog_win.cc
new file mode 100644
index 0000000..2cdc81c
--- /dev/null
+++ b/chrome/browser/views/constrained_html_dialog_win.cc
@@ -0,0 +1,118 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/views/constrained_html_dialog_win.h"
+
+#include "chrome/browser/dom_ui/html_dialog_ui.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/renderer_host/render_view_host.h"
+#include "chrome/browser/renderer_host/render_view_host_delegate.h"
+#include "chrome/browser/renderer_host/render_widget_host_view_win.h"
+#include "chrome/browser/renderer_host/site_instance.h"
+#include "chrome/common/bindings_policy.h"
+#include "chrome/common/renderer_preferences.h"
+#include "views/widget/widget_win.h"
+#include "views/window/window_delegate.h"
+
+class ConstrainedHtmlDialogHostView : public views::NativeViewHost {
+ public:
+ explicit ConstrainedHtmlDialogHostView(ConstrainedHtmlDialogWin* dialog)
+ : dialog_(dialog),
+ initialized_(false) {
+ }
+
+ virtual void ViewHierarchyChanged(bool is_add,
+ views::View* parent,
+ views::View* child) {
+ NativeViewHost::ViewHierarchyChanged(is_add, parent, child);
+ if (is_add && GetWidget() && !initialized_) {
+ dialog_->Init(GetWidget()->GetNativeView());
+ initialized_ = true;
+ }
+ }
+
+ private:
+ ConstrainedHtmlDialogWin* dialog_;
+ bool initialized_;
+};
+
+ConstrainedHtmlDialogWin::ConstrainedHtmlDialogWin(
+ Profile* profile,
+ HtmlDialogUIDelegate* delegate)
+ : ConstrainedHtmlDialog(profile, delegate) {
+ CHECK(delegate);
+ native_view_host_ = new ConstrainedHtmlDialogHostView(this);
+
+ // Size the native view to match the delegate preferred size.
+ gfx::Size size;
+ delegate->GetDialogSize(&size);
+ native_view_host_->SetPreferredSize(size);
+
+ // Create a site instance for the correct URL.
+ dialog_url_ = delegate->GetDialogContentURL();
+ site_instance_ =
+ SiteInstance::CreateSiteInstanceForURL(profile, dialog_url_);
+}
+
+ConstrainedHtmlDialogWin::~ConstrainedHtmlDialogWin() {
+}
+
+ConstrainedWindowDelegate*
+ConstrainedHtmlDialogWin::GetConstrainedWindowDelegate() {
+ return this;
+}
+
+bool ConstrainedHtmlDialogWin::CanResize() const {
+ return true;
+}
+
+views::View* ConstrainedHtmlDialogWin::GetContentsView() {
+ return native_view_host_;
+}
+
+void ConstrainedHtmlDialogWin::WindowClosing() {
+ html_dialog_ui_delegate()->OnDialogClosed("");
+}
+
+int ConstrainedHtmlDialogWin::GetBrowserWindowID() const {
+ return 0;
+}
+
+ViewType::Type ConstrainedHtmlDialogWin::GetRenderViewType() const {
+ return ViewType::HTML_DIALOG_UI;
+}
+
+RendererPreferences ConstrainedHtmlDialogWin::GetRendererPrefs(
+ Profile* profile) const {
+ return RendererPreferences();
+}
+
+void ConstrainedHtmlDialogWin::ProcessDOMUIMessage(
+ const ViewHostMsg_DomMessage_Params& params) {
+ DOMUI::ProcessDOMUIMessage(params);
+}
+
+void ConstrainedHtmlDialogWin::Init(gfx::NativeView parent_view) {
+ render_view_host_.reset(new RenderViewHost(site_instance_,
+ this,
+ MSG_ROUTING_NONE,
+ NULL));
+ render_view_host_->AllowBindings(BindingsPolicy::DOM_UI);
+ render_widget_host_view_ =
+ new RenderWidgetHostViewWin(render_view_host_.get());
+ render_view_host_->set_view(render_widget_host_view_);
+ render_view_host_->CreateRenderView(string16());
+ render_view_host_->NavigateToURL(dialog_url_);
+ HWND hwnd = render_widget_host_view_->Create(parent_view);
+ render_widget_host_view_->ShowWindow(SW_SHOW);
+ native_view_host_->Attach(hwnd);
+
+ InitializeDOMUI(render_view_host_.get());
+}
+
+// static
+ConstrainedHtmlDialog* ConstrainedHtmlDialog::CreateConstrainedHTMLDialog(
+ Profile* profile, HtmlDialogUIDelegate* delegate) {
+ return new ConstrainedHtmlDialogWin(profile, delegate);
+}
diff --git a/chrome/browser/views/constrained_html_dialog_win.h b/chrome/browser/views/constrained_html_dialog_win.h
new file mode 100644
index 0000000..6faa821
--- /dev/null
+++ b/chrome/browser/views/constrained_html_dialog_win.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_VIEWS_CONSTRAINED_HTML_DIALOG_WIN_H_
+#define CHROME_BROWSER_VIEWS_CONSTRAINED_HTML_DIALOG_WIN_H_
+#pragma once
+
+#include <string>
+
+#include "chrome/browser/dom_ui/constrained_html_dialog.h"
+#include "chrome/browser/dom_ui/html_dialog_ui.h"
+#include "chrome/browser/renderer_host/render_view_host_delegate.h"
+#include "chrome/browser/renderer_host/site_instance.h"
+#include "chrome/common/bindings_policy.h"
+#include "chrome/common/renderer_preferences.h"
+#include "views/controls/native/native_view_host.h"
+#include "views/window/window_delegate.h"
+
+class RenderViewHost;
+class RenderWidgetHostViewWin;
+
+class ConstrainedHtmlDialogWin : public ConstrainedHtmlDialog,
+ public ConstrainedWindowDelegate,
+ public RenderViewHostDelegate {
+ public:
+ ConstrainedHtmlDialogWin(Profile* profile,
+ HtmlDialogUIDelegate* delegate);
+ ~ConstrainedHtmlDialogWin();
+
+ // Called when the dialog is actually being added to the views hierarchy.
+ void Init(gfx::NativeView parent_window);
+
+ // ConstrainedHtmlDialog override.
+ virtual ConstrainedWindowDelegate* GetConstrainedWindowDelegate();
+
+ // ConstrainedWindowDelegate (aka views::WindowDelegate) override.
+ virtual bool CanResize() const;
+ virtual views::View* GetContentsView();
+ virtual void WindowClosing();
+
+ // RenderViewHostDelegate overrides.
+ virtual int GetBrowserWindowID() const;
+ virtual ViewType::Type GetRenderViewType() const;
+ virtual RendererPreferences GetRendererPrefs(Profile* profile) const;
+ virtual void ProcessDOMUIMessage(
+ const ViewHostMsg_DomMessage_Params& params);
+ virtual void UpdateInspectorSetting(const std::string& key,
+ const std::string& value) {}
+ virtual void ClearInspectorSettings() {}
+
+ private:
+ SiteInstance* site_instance_;
+ scoped_ptr<RenderViewHost> render_view_host_;
+
+ // URL to be displayed in the dialog.
+ GURL dialog_url_;
+
+ // Pointer owned by the |render_view_host_| object.
+ RenderWidgetHostViewWin* render_widget_host_view_;
+
+ // View pointer owned by the views hierarchy.
+ views::NativeViewHost* native_view_host_;
+};
+
+#endif // CHROME_BROWSER_VIEWS_CONSTRAINED_HTML_DIALOG_WIN_H_
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 8b898be..1919dfa 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1262,6 +1262,8 @@
'browser/dom_ui/bug_report_ui.h',
'browser/dom_ui/chrome_url_data_manager.cc',
'browser/dom_ui/chrome_url_data_manager.h',
+ 'browser/dom_ui/constrained_html_dialog.cc',
+ 'browser/dom_ui/constrained_html_dialog.h',
'browser/dom_ui/devtools_ui.cc',
'browser/dom_ui/devtools_ui.h',
'browser/dom_ui/dom_ui.cc',
@@ -2955,6 +2957,8 @@
'browser/views/collected_cookies_win.h',
'browser/views/confirm_message_box_dialog.cc',
'browser/views/confirm_message_box_dialog.h',
+ 'browser/views/constrained_html_dialog_win.cc',
+ 'browser/views/constrained_html_dialog_win.h',
'browser/views/constrained_window_win.cc',
'browser/views/constrained_window_win.h',
'browser/views/content_setting_bubble_contents.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index f0421d5..8707cdb 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1998,6 +1998,7 @@
'browser/ssl/ssl_browser_tests.cc',
'browser/task_manager/task_manager_browsertest.cc',
'browser/views/browser_actions_container_browsertest.cc',
+ 'browser/views/constrained_html_dialog_browsertest.cc',
'browser/views/dom_view_browsertest.cc',
'browser/views/html_dialog_view_browsertest.cc',
'renderer/form_autocomplete_browsertest.cc',
diff --git a/chrome/common/view_types.h b/chrome/common/view_types.h
index 2d9c539..7a1caf0 100644
--- a/chrome/common/view_types.h
+++ b/chrome/common/view_types.h
@@ -21,6 +21,7 @@ class ViewType {
DEV_TOOLS_UI,
INTERSTITIAL_PAGE,
NOTIFICATION,
+ HTML_DIALOG_UI,
};
// Constant strings corresponding to the Type enumeration values. Used