diff options
author | johnnyg@chromium.org <johnnyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-13 23:43:23 +0000 |
---|---|---|
committer | johnnyg@chromium.org <johnnyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-13 23:43:23 +0000 |
commit | 79bb91d1df82b4eb6e0fae56d3fd3f53ef7b74b6 (patch) | |
tree | b4a89b4719dda04897c0c316070066004ee81eb7 /chrome | |
parent | fac8e07ac35d3b5eb86c573ba3b0a8309fe0ab31 (diff) | |
download | chromium_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.cc | 43 | ||||
-rw-r--r-- | chrome/browser/dom_ui/constrained_html_dialog.h | 60 | ||||
-rw-r--r-- | chrome/browser/dom_ui/dom_ui.cc | 11 | ||||
-rw-r--r-- | chrome/browser/dom_ui/dom_ui.h | 8 | ||||
-rw-r--r-- | chrome/browser/views/constrained_html_dialog_browsertest.cc | 95 | ||||
-rw-r--r-- | chrome/browser/views/constrained_html_dialog_win.cc | 118 | ||||
-rw-r--r-- | chrome/browser/views/constrained_html_dialog_win.h | 66 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 4 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 | ||||
-rw-r--r-- | chrome/common/view_types.h | 1 |
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 |