summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Hou <jackhou@chromium.org>2015-01-28 11:23:20 +1100
committerJack Hou <jackhou@chromium.org>2015-01-28 00:24:58 +0000
commit0725b9b4bc9aae78fc13d483c7b600709d47661c (patch)
tree1c1547800d92a9ff37790b5ad596f98c850e124d
parentd1a8e20b222ddb2b469d327c0c323e1dcb334997 (diff)
downloadchromium_src-0725b9b4bc9aae78fc13d483c7b600709d47661c.zip
chromium_src-0725b9b4bc9aae78fc13d483c7b600709d47661c.tar.gz
chromium_src-0725b9b4bc9aae78fc13d483c7b600709d47661c.tar.bz2
[Win] Fix black screen when min/maximizing hidden app window.
On Windows, an app window that is initialized with hidden:true and state:'maximized' will start visible and maximized, but its content is all black. This is because maximizing a hidden window on Windows causes the window to be shown, but this path does not also trigger the content to show. This CL is a temporary fix to prevent the above state without changing the current behavior. App windows that are initially hidden will not also be maximized, minimized, or fullscreen. On Windows, maximizing or minimizing hidden app windows will cause them to be shown. In the long term, we want the behavior on Windows to match CrOS where calling maximize() on a hidden window does nothing, and the next show() will show the window maximized. BUG=436867 Review URL: https://codereview.chromium.org/851233002 Cr-Commit-Position: refs/heads/master@{#312061} (cherry picked from commit 3d1fd029975c325129474b9d4e262940d99ab375) TBR=benwells@chromium.org Review URL: https://codereview.chromium.org/876413004 Cr-Commit-Position: refs/branch-heads/2272@{#139} Cr-Branched-From: 827a380cfdb31aa54c8d56e63ce2c3fd8c3ba4d4-refs/heads/master@{#310958}
-rw-r--r--chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.cc25
-rw-r--r--chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.h9
-rw-r--r--extensions/browser/app_window/app_window.cc16
3 files changed, 41 insertions, 9 deletions
diff --git a/chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.cc b/chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.cc
index 0762f29..1782078 100644
--- a/chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.cc
+++ b/chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.cc
@@ -7,6 +7,7 @@
#include "chrome/browser/ui/views/apps/app_window_desktop_window_tree_host_win.h"
#include "chrome/browser/ui/views/apps/chrome_native_app_window_views_win.h"
#include "ui/aura/window.h"
+#include "ui/views/widget/desktop_aura/desktop_window_tree_host.h"
AppWindowDesktopNativeWidgetAuraWin::AppWindowDesktopNativeWidgetAuraWin(
ChromeNativeAppWindowViewsWin* app_window)
@@ -21,7 +22,27 @@ AppWindowDesktopNativeWidgetAuraWin::~AppWindowDesktopNativeWidgetAuraWin() {
void AppWindowDesktopNativeWidgetAuraWin::InitNativeWidget(
const views::Widget::InitParams& params) {
views::Widget::InitParams modified_params = params;
- modified_params.desktop_window_tree_host =
- new AppWindowDesktopWindowTreeHostWin(app_window_, this);
+ tree_host_ = new AppWindowDesktopWindowTreeHostWin(app_window_, this);
+ modified_params.desktop_window_tree_host = tree_host_;
DesktopNativeWidgetAura::InitNativeWidget(modified_params);
}
+
+void AppWindowDesktopNativeWidgetAuraWin::Maximize() {
+ // Maximizing on Windows causes the window to be shown. Call Show() first to
+ // ensure the content view is also made visible. See http://crbug.com/436867.
+ // TODO(jackhou): Make this behavior the same as other platforms, i.e. calling
+ // Maximize() does not also show the window.
+ if (!tree_host_->IsVisible())
+ DesktopNativeWidgetAura::Show();
+ DesktopNativeWidgetAura::Maximize();
+}
+
+void AppWindowDesktopNativeWidgetAuraWin::Minimize() {
+ // Minimizing on Windows causes the window to be shown. Call Show() first to
+ // ensure the content view is also made visible. See http://crbug.com/436867.
+ // TODO(jackhou): Make this behavior the same as other platforms, i.e. calling
+ // Minimize() does not also show the window.
+ if (!tree_host_->IsVisible())
+ DesktopNativeWidgetAura::Show();
+ DesktopNativeWidgetAura::Minimize();
+}
diff --git a/chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.h b/chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.h
index 43bc8a7..75f3464 100644
--- a/chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.h
+++ b/chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.h
@@ -12,6 +12,10 @@ class BrowserFrame;
class BrowserView;
class ChromeNativeAppWindowViewsWin;
+namespace views {
+class DesktopWindowTreeHost;
+}
+
namespace wm {
class VisibilityController;
}
@@ -30,11 +34,16 @@ class AppWindowDesktopNativeWidgetAuraWin
// Overridden from views::DesktopNativeWidgetAura:
virtual void InitNativeWidget(
const views::Widget::InitParams& params) override;
+ void Maximize() override;
+ void Minimize() override;
private:
// Ownership managed by the views system.
ChromeNativeAppWindowViewsWin* app_window_;
+ // Owned by superclass DesktopNativeWidgetAura.
+ views::DesktopWindowTreeHost* tree_host_;
+
DISALLOW_COPY_AND_ASSIGN(AppWindowDesktopNativeWidgetAuraWin);
};
diff --git a/extensions/browser/app_window/app_window.cc b/extensions/browser/app_window/app_window.cc
index 9ed0342..7fdaeff 100644
--- a/extensions/browser/app_window/app_window.cc
+++ b/extensions/browser/app_window/app_window.cc
@@ -301,14 +301,16 @@ void AppWindow::Init(const GURL& url,
// Panels are not activated by default.
Show(window_type_is_panel() || !new_params.focused ? SHOW_INACTIVE
: SHOW_ACTIVE);
- }
- if (new_params.state == ui::SHOW_STATE_FULLSCREEN)
- Fullscreen();
- else if (new_params.state == ui::SHOW_STATE_MAXIMIZED)
- Maximize();
- else if (new_params.state == ui::SHOW_STATE_MINIMIZED)
- Minimize();
+ // These states may cause the window to show, so they are ignored if the
+ // window is initially hidden.
+ if (new_params.state == ui::SHOW_STATE_FULLSCREEN)
+ Fullscreen();
+ else if (new_params.state == ui::SHOW_STATE_MAXIMIZED)
+ Maximize();
+ else if (new_params.state == ui::SHOW_STATE_MINIMIZED)
+ Minimize();
+ }
OnNativeWindowChanged();