summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-23 03:11:17 +0000
committeryzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-23 03:11:17 +0000
commitff1ce88bd150ce315e5a225e124e8b39c5f3dbd8 (patch)
tree5c2713de952a85c60e10d4e0b61af141ed908575
parentf292f1719c54a79e83eedd44154f1259093d909e (diff)
downloadchromium_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
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.cc3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.h3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.h3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.mm3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_views.cc3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_views.h3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_win.cc73
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_win.h11
-rw-r--r--chrome/browser/tab_contents/render_view_host_delegate_helper.cc2
-rw-r--r--content/browser/renderer_host/render_widget_host_view.h4
-rw-r--r--content/browser/renderer_host/test_render_view_host.h2
-rw-r--r--webkit/plugins/ppapi/ppapi_plugin_instance.cc5
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) {