diff options
author | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-23 03:11:17 +0000 |
---|---|---|
committer | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-23 03:11:17 +0000 |
commit | ff1ce88bd150ce315e5a225e124e8b39c5f3dbd8 (patch) | |
tree | 5c2713de952a85c60e10d4e0b61af141ed908575 | |
parent | f292f1719c54a79e83eedd44154f1259093d909e (diff) | |
download | chromium_src-ff1ce88bd150ce315e5a225e124e8b39c5f3dbd8.zip chromium_src-ff1ce88bd150ce315e5a225e124e8b39c5f3dbd8.tar.gz chromium_src-ff1ce88bd150ce315e5a225e124e8b39c5f3dbd8.tar.bz2 |
Support fullscreen widget on Windows.
BUG=None
TEST=None
Review URL: http://codereview.chromium.org/7466007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@93768 0039d316-1c4b-4281-b951-d872f2087c98
12 files changed, 77 insertions, 38 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc index 4e52393..53de2bb 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc @@ -576,7 +576,8 @@ void RenderWidgetHostViewGtk::InitAsPopup( } } -void RenderWidgetHostViewGtk::InitAsFullscreen() { +void RenderWidgetHostViewGtk::InitAsFullscreen( + RenderWidgetHostView* /*reference_host_view*/) { DoSharedInit(); is_fullscreen_ = true; diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.h b/chrome/browser/renderer_host/render_widget_host_view_gtk.h index d67c771..af0f17f 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_gtk.h +++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.h @@ -56,7 +56,8 @@ class RenderWidgetHostViewGtk : public RenderWidgetHostView, // RenderWidgetHostView implementation. virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) OVERRIDE; - virtual void InitAsFullscreen() OVERRIDE; + virtual void InitAsFullscreen( + RenderWidgetHostView* reference_host_view) OVERRIDE; virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE; virtual void DidBecomeSelected() OVERRIDE; virtual void WasHidden() OVERRIDE; diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.h b/chrome/browser/renderer_host/render_widget_host_view_mac.h index ef2a895..9beb324 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.h +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.h @@ -174,7 +174,8 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView { // Implementation of RenderWidgetHostView: virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) OVERRIDE; - virtual void InitAsFullscreen() OVERRIDE; + virtual void InitAsFullscreen( + RenderWidgetHostView* reference_host_view) OVERRIDE; virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE; virtual void DidBecomeSelected() OVERRIDE; virtual void WasHidden() OVERRIDE; diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm index 7b66497..1f0b3d5 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm @@ -284,7 +284,8 @@ void RenderWidgetHostViewMac::InitAsPopup( [cocoa_view_ setFrame:initial_frame]; } -void RenderWidgetHostViewMac::InitAsFullscreen() { +void RenderWidgetHostViewMac::InitAsFullscreen( + RenderWidgetHostView* /*reference_host_view*/) { NOTIMPLEMENTED() << "Full screen not implemented on Mac"; } diff --git a/chrome/browser/renderer_host/render_widget_host_view_views.cc b/chrome/browser/renderer_host/render_widget_host_view_views.cc index 0697460..a9b036f 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_views.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_views.cc @@ -125,7 +125,8 @@ void RenderWidgetHostViewViews::InitAsPopup( } } -void RenderWidgetHostViewViews::InitAsFullscreen() { +void RenderWidgetHostViewViews::InitAsFullscreen( + RenderWidgetHostView* /*reference_host_view*/) { NOTIMPLEMENTED(); } diff --git a/chrome/browser/renderer_host/render_widget_host_view_views.h b/chrome/browser/renderer_host/render_widget_host_view_views.h index 872972f..e10694e 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_views.h +++ b/chrome/browser/renderer_host/render_widget_host_view_views.h @@ -50,7 +50,8 @@ class RenderWidgetHostViewViews : public RenderWidgetHostView, // RenderWidgetHostView implementation. virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) OVERRIDE; - virtual void InitAsFullscreen() OVERRIDE; + virtual void InitAsFullscreen( + RenderWidgetHostView* reference_host_view) OVERRIDE; virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE; virtual void DidBecomeSelected() OVERRIDE; virtual void WasHidden() OVERRIDE; diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.cc b/chrome/browser/renderer_host/render_widget_host_view_win.cc index 74e1277..92b454a 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_win.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_win.cc @@ -50,6 +50,7 @@ #include "views/accessibility/native_view_accessibility_win.h" #include "views/focus/focus_manager.h" #include "views/focus/focus_util_win.h" +#include "views/screen.h" // Included for views::kReflectedMessage - TODO(beng): move this to win_util.h! #include "views/widget/native_widget_win.h" #include "webkit/glue/webaccessibility.h" @@ -105,7 +106,7 @@ BOOL CALLBACK DismissOwnedPopups(HWND window, LPARAM arg) { class NotifyPluginProcessHostTask : public Task { public: NotifyPluginProcessHostTask(HWND window, HWND parent) - : window_(window), parent_(parent), tries_(kMaxTries) { } + : window_(window), parent_(parent), tries_(kMaxTries) { } private: void Run() { @@ -240,7 +241,8 @@ RenderWidgetHostViewWin::RenderWidgetHostViewWin(RenderWidgetHost* widget) parent_hwnd_(NULL), is_loading_(false), overlay_color_(0), - text_input_type_(ui::TEXT_INPUT_TYPE_NONE) { + text_input_type_(ui::TEXT_INPUT_TYPE_NONE), + is_fullscreen_(false) { render_widget_host_->SetView(this); registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, @@ -260,20 +262,17 @@ void RenderWidgetHostViewWin::CreateWnd(HWND parent) { void RenderWidgetHostViewWin::InitAsPopup( RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) { - parent_hwnd_ = parent_host_view->GetNativeView(); close_on_deactivate_ = true; - Create(parent_hwnd_, NULL, NULL, WS_POPUP, WS_EX_TOOLWINDOW); - MoveWindow(pos.x(), pos.y(), pos.width(), pos.height(), TRUE); - // To show tooltip on popup window.(e.g. title in <select>) - // Popups default to showing, which means |DidBecomeSelected()| isn't invoked. - // Ensure the tooltip is created otherwise tooltips are never shown. - EnsureTooltip(); - // Popups are not activated. - ShowWindow(IsActivatable() ? SW_SHOW : SW_SHOWNA); + DoPopupOrFullscreenInit(parent_host_view->GetNativeView(), pos, + WS_EX_TOOLWINDOW); } -void RenderWidgetHostViewWin::InitAsFullscreen() { - NOTIMPLEMENTED() << "Fullscreen not implemented on Win"; +void RenderWidgetHostViewWin::InitAsFullscreen( + RenderWidgetHostView* reference_host_view) { + gfx::Rect pos = views::Screen::GetMonitorAreaNearestWindow( + reference_host_view->GetNativeView()); + is_fullscreen_ = true; + DoPopupOrFullscreenInit(GetDesktopWindow(), pos, 0); } RenderWidgetHost* RenderWidgetHostViewWin::GetRenderWidgetHost() const { @@ -510,16 +509,18 @@ bool RenderWidgetHostViewWin::HasFocus() { } void RenderWidgetHostViewWin::Show() { - DCHECK(parent_hwnd_); - DCHECK(parent_hwnd_ != GetDesktopWindow()); - SetParent(parent_hwnd_); + if (!is_fullscreen_) { + DCHECK(parent_hwnd_); + DCHECK(parent_hwnd_ != GetDesktopWindow()); + SetParent(parent_hwnd_); + } ShowWindow(SW_SHOW); DidBecomeSelected(); } void RenderWidgetHostViewWin::Hide() { - if (GetParent() == GetDesktopWindow()) { + if (!is_fullscreen_ && GetParent() == GetDesktopWindow()) { LOG(WARNING) << "Hide() called twice in a row: " << this << ":" << parent_hwnd_ << ":" << GetParent(); return; @@ -529,9 +530,12 @@ void RenderWidgetHostViewWin::Hide() { ::SetFocus(NULL); ShowWindow(SW_HIDE); - // Cache the old parent, then orphan the window so we stop receiving messages - parent_hwnd_ = GetParent(); - SetParent(NULL); + if (!is_fullscreen_) { + // Cache the old parent, then orphan the window so we stop receiving + // messages. + parent_hwnd_ = GetParent(); + SetParent(NULL); + } WasHidden(); } @@ -996,7 +1000,8 @@ void RenderWidgetHostViewWin::OnCancelMode() { if (render_widget_host_) render_widget_host_->LostCapture(); - if (close_on_deactivate_ && shutdown_factory_.empty()) { + if ((is_fullscreen_ || close_on_deactivate_) && + shutdown_factory_.empty()) { // Dismiss popups and menus. We do this asynchronously to avoid changing // activation within this callstack, which may interfere with another window // being activated. We can synchronously hide the window, but we need to @@ -1217,7 +1222,9 @@ LRESULT RenderWidgetHostViewWin::OnMouseEvent(UINT message, WPARAM wparam, // is the first non-child view of the view that was specified to the create // call). So the TabContents window would have to be specified to the // RenderViewHostHWND as there is no way to retrieve it from the HWND. - if (!close_on_deactivate_) { // Don't forward if the container is a popup. + + // Don't forward if the container is a popup or fullscreen widget. + if (!is_fullscreen_ && !close_on_deactivate_) { switch (message) { case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: @@ -1256,6 +1263,13 @@ LRESULT RenderWidgetHostViewWin::OnKeyEvent(UINT message, WPARAM wparam, LPARAM lparam, BOOL& handled) { handled = TRUE; + // Force fullscreen windows to close on Escape. + if (is_fullscreen_ && (message == WM_KEYDOWN || message == WM_KEYUP) && + wparam == VK_ESCAPE) { + SendMessage(WM_CANCELMODE); + return 0; + } + // If we are a pop-up, forward tab related messages to our parent HWND, so // that we are dismissed appropriately and so that the focus advance in our // parent. @@ -1366,7 +1380,7 @@ LRESULT RenderWidgetHostViewWin::OnWheelEvent(UINT message, WPARAM wparam, // This is a bit of a hack, but will work for now since we don't want to // pollute this object with TabContents-specific functionality... bool handled_by_TabContents = false; - if (GetParent()) { + if (!is_fullscreen_ && GetParent()) { // Use a special reflected message to break recursion. If we send // WM_MOUSEWHEEL, the focus manager subclass of web contents will // route it back here. @@ -1797,3 +1811,16 @@ RenderWidgetHostView* reinterpret_cast<RenderWidgetHostView*>( ViewProp::GetValue(native_view, kRenderWidgetHostViewKey)) : NULL; } + +void RenderWidgetHostViewWin::DoPopupOrFullscreenInit(HWND parent_hwnd, + const gfx::Rect& pos, + DWORD ex_style) { + parent_hwnd_ = parent_hwnd; + Create(parent_hwnd_, NULL, NULL, WS_POPUP, ex_style); + MoveWindow(pos.x(), pos.y(), pos.width(), pos.height(), TRUE); + // To show tooltip on popup window.(e.g. title in <select>) + // Popups default to showing, which means |DidBecomeSelected()| isn't invoked. + // Ensure the tooltip is created otherwise tooltips are never shown. + EnsureTooltip(); + ShowWindow(IsActivatable() ? SW_SHOW : SW_SHOWNA); +} diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.h b/chrome/browser/renderer_host/render_widget_host_view_win.h index df8b45c..0d2aaf73 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_win.h +++ b/chrome/browser/renderer_host/render_widget_host_view_win.h @@ -130,7 +130,8 @@ class RenderWidgetHostViewWin // Implementation of RenderWidgetHostView: virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) OVERRIDE; - virtual void InitAsFullscreen() OVERRIDE; + virtual void InitAsFullscreen( + RenderWidgetHostView* reference_host_view) OVERRIDE; virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE; virtual void DidBecomeSelected() OVERRIDE; virtual void WasHidden() OVERRIDE; @@ -275,6 +276,11 @@ class RenderWidgetHostViewWin // Whether the window should be activated. bool IsActivatable() const; + // Do initialization needed by both InitAsPopup() and InitAsFullscreen(). + void DoPopupOrFullscreenInit(HWND parent_hwnd, + const gfx::Rect& pos, + DWORD ex_style); + // The associated Model. RenderWidgetHost* render_widget_host_; @@ -365,6 +371,9 @@ class RenderWidgetHostViewWin ScopedVector<ui::ViewProp> props_; + // Is the widget fullscreen? + bool is_fullscreen_; + DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewWin); }; diff --git a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc index 6d76c21..743f443 100644 --- a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc +++ b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc @@ -288,7 +288,7 @@ RenderWidgetHostView* tab_contents->delegate()->RenderWidgetShowing(); RenderWidgetHostView* widget_host_view = GetCreatedWidget(route_id); - widget_host_view->InitAsFullscreen(); + widget_host_view->InitAsFullscreen(tab_contents->GetRenderWidgetHostView()); widget_host_view->GetRenderWidgetHost()->Init(); return widget_host_view; } diff --git a/content/browser/renderer_host/render_widget_host_view.h b/content/browser/renderer_host/render_widget_host_view.h index 6b0cd7a..b638bd2 100644 --- a/content/browser/renderer_host/render_widget_host_view.h +++ b/content/browser/renderer_host/render_widget_host_view.h @@ -83,7 +83,9 @@ class RenderWidgetHostView { // Perform all the initialization steps necessary for this object to represent // a full screen window. - virtual void InitAsFullscreen() = 0; + // |reference_host_view| is the view associated with the creating page that + // helps to position the full screen widget on the correct monitor. + virtual void InitAsFullscreen(RenderWidgetHostView* reference_host_view) = 0; // Returns the associated RenderWidgetHost. virtual RenderWidgetHost* GetRenderWidgetHost() const = 0; diff --git a/content/browser/renderer_host/test_render_view_host.h b/content/browser/renderer_host/test_render_view_host.h index 224a0eb..889dfa5 100644 --- a/content/browser/renderer_host/test_render_view_host.h +++ b/content/browser/renderer_host/test_render_view_host.h @@ -53,7 +53,7 @@ class TestRenderWidgetHostView : public RenderWidgetHostView { virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) {} - virtual void InitAsFullscreen() {} + virtual void InitAsFullscreen(RenderWidgetHostView* reference_host_view) {} virtual RenderWidgetHost* GetRenderWidgetHost() const; virtual void DidBecomeSelected() {} virtual void WasHidden() {} diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.cc b/webkit/plugins/ppapi/ppapi_plugin_instance.cc index 24dd8b8..17756c2 100644 --- a/webkit/plugins/ppapi/ppapi_plugin_instance.cc +++ b/webkit/plugins/ppapi/ppapi_plugin_instance.cc @@ -1482,13 +1482,8 @@ PP_Bool PluginInstance::IsFullscreen(PP_Instance instance) { PP_Bool PluginInstance::SetFullscreen(PP_Instance instance, PP_Bool fullscreen) { - // TODO(yzshen): Re-enable it once fullscreen mode is supported on Windows. -#if !defined(OS_WIN) SetFullscreen(PP_ToBool(fullscreen), true); return PP_TRUE; -#else - return PP_FALSE; -#endif } PP_Bool PluginInstance::GetScreenSize(PP_Instance instance, PP_Size* size) { |