summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm17
-rw-r--r--chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm296
-rw-r--r--chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.h21
-rw-r--r--chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.mm98
-rw-r--r--extensions/components/native_app_window/native_app_window_views.cc2
-rw-r--r--ui/base/test/windowed_nsnotification_observer.h4
-rw-r--r--ui/base/test/windowed_nsnotification_observer.mm6
-rw-r--r--ui/views/cocoa/bridged_native_widget_interactive_uitest.mm23
-rw-r--r--ui/views/widget/native_widget_mac.mm1
9 files changed, 60 insertions, 408 deletions
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
index b0591e0..a8130c7 100644
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
+++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
@@ -362,7 +362,7 @@ bool NativeAppWindowCocoa::IsActive() const {
}
bool NativeAppWindowCocoa::IsMaximized() const {
- return is_maximized_ && !IsMinimized();
+ return is_maximized_;
}
bool NativeAppWindowCocoa::IsMinimized() const {
@@ -497,14 +497,9 @@ void NativeAppWindowCocoa::Deactivate() {
}
void NativeAppWindowCocoa::Maximize() {
- if (is_fullscreen_)
- return;
-
UpdateRestoredBounds();
is_maximized_ = true; // See top of file NOTE: State Before Update.
[window() setFrame:[[window() screen] visibleFrame] display:YES animate:YES];
- if (IsMinimized())
- [window() deminiaturize:window_controller_];
}
void NativeAppWindowCocoa::Minimize() {
@@ -514,12 +509,13 @@ void NativeAppWindowCocoa::Minimize() {
void NativeAppWindowCocoa::Restore() {
DCHECK(!IsFullscreenOrPending()); // SetFullscreen, not Restore, expected.
- if (is_maximized_) {
+ if (IsMaximized()) {
is_maximized_ = false; // See top of file NOTE: State Before Update.
[window() setFrame:restored_bounds() display:YES animate:YES];
- }
- if (IsMinimized())
+ } else if (IsMinimized()) {
+ is_maximized_ = false; // See top of file NOTE: State Before Update.
[window() deminiaturize:window_controller_];
+ }
}
void NativeAppWindowCocoa::SetBounds(const gfx::Rect& bounds) {
@@ -767,7 +763,6 @@ void NativeAppWindowCocoa::WindowDidDeminiaturize() {
}
void NativeAppWindowCocoa::WindowDidEnterFullscreen() {
- is_maximized_ = false;
is_fullscreen_ = true;
app_window_->OnNativeWindowChanged();
}
@@ -777,8 +772,6 @@ void NativeAppWindowCocoa::WindowDidExitFullscreen() {
if (!shows_fullscreen_controls_)
gfx::SetNSWindowCanFullscreen(window(), false);
- WindowDidFinishResize();
-
app_window_->OnNativeWindowChanged();
}
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm
index e9f82b8..7ca858a 100644
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm
+++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm
@@ -25,7 +25,6 @@
#include "extensions/common/constants.h"
#include "testing/gmock/include/gmock/gmock.h"
#import "ui/base/test/nswindow_fullscreen_notification_waiter.h"
-#import "ui/base/test/windowed_nsnotification_observer.h"
#import "ui/gfx/mac/nswindow_frame_controls.h"
using extensions::AppWindow;
@@ -214,6 +213,42 @@ IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest,
testing::Mock::VerifyAndClearExpectations(&mock_host);
}
+@interface ScopedNotificationWatcher : NSObject {
+ @private
+ BOOL received_;
+}
+- (id)initWithNotification:(NSString*)notification
+ andObject:(NSObject*)object;
+- (void)onNotification:(NSString*)notification;
+- (void)waitForNotification;
+@end
+
+@implementation ScopedNotificationWatcher
+
+- (id)initWithNotification:(NSString*)notification
+ andObject:(NSObject*)object {
+ if ((self = [super init])) {
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(onNotification:)
+ name:notification
+ object:object];
+ }
+ return self;
+}
+
+- (void)onNotification:(NSString*)notification {
+ received_ = YES;
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)waitForNotification {
+ while (!received_)
+ content::RunAllPendingInMessageLoop();
+}
+
+@end
+
// Test that NativeAppWindow and AppWindow fullscreen state is updated when
// the window is fullscreened natively.
IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Fullscreen) {
@@ -224,8 +259,7 @@ IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Fullscreen) {
CreateTestAppWindow("{\"alwaysOnTop\": true }");
extensions::NativeAppWindow* window = app_window->GetBaseWindow();
NSWindow* ns_window = app_window->GetNativeWindow();
- base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter(
- [[NSWindowFullscreenNotificationWaiter alloc] initWithWindow:ns_window]);
+ base::scoped_nsobject<ScopedNotificationWatcher> watcher;
EXPECT_EQ(AppWindow::FULLSCREEN_TYPE_NONE,
app_window->fullscreen_types_for_test());
@@ -233,34 +267,46 @@ IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Fullscreen) {
EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask);
EXPECT_TRUE(gfx::IsNSWindowAlwaysOnTop(ns_window));
+ watcher.reset([[ScopedNotificationWatcher alloc]
+ initWithNotification:NSWindowDidEnterFullScreenNotification
+ andObject:ns_window]);
[ns_window toggleFullScreen:nil];
- [waiter waitForEnterCount:1 exitCount:0];
+ [watcher waitForNotification];
EXPECT_TRUE(app_window->fullscreen_types_for_test() &
AppWindow::FULLSCREEN_TYPE_OS);
EXPECT_TRUE(window->IsFullscreen());
EXPECT_TRUE([ns_window styleMask] & NSFullScreenWindowMask);
EXPECT_FALSE(gfx::IsNSWindowAlwaysOnTop(ns_window));
+ watcher.reset([[ScopedNotificationWatcher alloc]
+ initWithNotification:NSWindowDidExitFullScreenNotification
+ andObject:ns_window]);
app_window->Restore();
EXPECT_FALSE(window->IsFullscreenOrPending());
- [waiter waitForEnterCount:1 exitCount:1];
+ [watcher waitForNotification];
EXPECT_EQ(AppWindow::FULLSCREEN_TYPE_NONE,
app_window->fullscreen_types_for_test());
EXPECT_FALSE(window->IsFullscreen());
EXPECT_FALSE([ns_window styleMask] & NSFullScreenWindowMask);
EXPECT_TRUE(gfx::IsNSWindowAlwaysOnTop(ns_window));
+ watcher.reset([[ScopedNotificationWatcher alloc]
+ initWithNotification:NSWindowDidEnterFullScreenNotification
+ andObject:ns_window]);
app_window->Fullscreen();
EXPECT_TRUE(window->IsFullscreenOrPending());
- [waiter waitForEnterCount:2 exitCount:1];
+ [watcher waitForNotification];
EXPECT_TRUE(app_window->fullscreen_types_for_test() &
AppWindow::FULLSCREEN_TYPE_WINDOW_API);
EXPECT_TRUE(window->IsFullscreen());
EXPECT_TRUE([ns_window styleMask] & NSFullScreenWindowMask);
EXPECT_FALSE(gfx::IsNSWindowAlwaysOnTop(ns_window));
+ watcher.reset([[ScopedNotificationWatcher alloc]
+ initWithNotification:NSWindowDidExitFullScreenNotification
+ andObject:ns_window]);
[ns_window toggleFullScreen:nil];
- [waiter waitForEnterCount:2 exitCount:2];
+ [watcher waitForNotification];
EXPECT_EQ(AppWindow::FULLSCREEN_TYPE_NONE,
app_window->fullscreen_types_for_test());
EXPECT_FALSE(window->IsFullscreen());
@@ -268,242 +314,6 @@ IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Fullscreen) {
EXPECT_TRUE(gfx::IsNSWindowAlwaysOnTop(ns_window));
}
-// Test Minimize, Restore combinations with their native equivalents.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Minimize) {
- SetUpAppWithWindows(1);
- AppWindow* app_window = GetFirstAppWindow();
- extensions::NativeAppWindow* window = app_window->GetBaseWindow();
- NSWindow* ns_window = app_window->GetNativeWindow();
-
- NSRect initial_frame = [ns_window frame];
-
- EXPECT_FALSE(window->IsMinimized());
- EXPECT_FALSE([ns_window isMiniaturized]);
-
- // Native minimize, Restore.
- [ns_window miniaturize:nil];
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMinimized());
- EXPECT_TRUE([ns_window isMiniaturized]);
-
- app_window->Restore();
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_FALSE(window->IsMinimized());
- EXPECT_FALSE([ns_window isMiniaturized]);
-
- // Minimize, native restore.
- app_window->Minimize();
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMinimized());
- EXPECT_TRUE([ns_window isMiniaturized]);
-
- [ns_window deminiaturize:nil];
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_FALSE(window->IsMinimized());
- EXPECT_FALSE([ns_window isMiniaturized]);
-}
-
-// Test Maximize, Restore combinations with their native equivalents.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Maximize) {
- SetUpAppWithWindows(1);
- AppWindow* app_window = GetFirstAppWindow();
- extensions::NativeAppWindow* window = app_window->GetBaseWindow();
- NSWindow* ns_window = app_window->GetNativeWindow();
- base::scoped_nsobject<WindowedNSNotificationObserver> watcher;
-
- gfx::Rect initial_restored_bounds = window->GetRestoredBounds();
- NSRect initial_frame = [ns_window frame];
- NSRect maximized_frame = [[ns_window screen] visibleFrame];
-
- EXPECT_FALSE(window->IsMaximized());
-
- // Native maximize, Restore.
- watcher.reset([[WindowedNSNotificationObserver alloc]
- initForNotification:NSWindowDidResizeNotification
- object:ns_window]);
- [ns_window zoom:nil];
- [watcher wait];
- EXPECT_EQ(initial_restored_bounds, window->GetRestoredBounds());
- EXPECT_TRUE(NSEqualRects(maximized_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMaximized());
-
- watcher.reset([[WindowedNSNotificationObserver alloc]
- initForNotification:NSWindowDidResizeNotification
- object:ns_window]);
- app_window->Restore();
- [watcher wait];
- EXPECT_EQ(initial_restored_bounds, window->GetRestoredBounds());
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_FALSE(window->IsMaximized());
-
- // Maximize, native restore.
- watcher.reset([[WindowedNSNotificationObserver alloc]
- initForNotification:NSWindowDidResizeNotification
- object:ns_window]);
- app_window->Maximize();
- [watcher wait];
- EXPECT_EQ(initial_restored_bounds, window->GetRestoredBounds());
- EXPECT_TRUE(NSEqualRects(maximized_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMaximized());
-
- watcher.reset([[WindowedNSNotificationObserver alloc]
- initForNotification:NSWindowDidResizeNotification
- object:ns_window]);
- [ns_window zoom:nil];
- [watcher wait];
- EXPECT_EQ(initial_restored_bounds, window->GetRestoredBounds());
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_FALSE(window->IsMaximized());
-}
-
-// Test Maximize when the window has a maximum size. The maximum size means that
-// the window is not user-maximizable. However, calling Maximize() via the
-// javascript API should still maximize and since the zoom button is removed,
-// the codepath changes.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, MaximizeConstrained) {
- AppWindow* app_window = CreateTestAppWindow(
- "{\"outerBounds\": {\"maxWidth\":200, \"maxHeight\":300}}");
- extensions::NativeAppWindow* window = app_window->GetBaseWindow();
- NSWindow* ns_window = app_window->GetNativeWindow();
- base::scoped_nsobject<WindowedNSNotificationObserver> watcher;
-
- gfx::Rect initial_restored_bounds = window->GetRestoredBounds();
- NSRect initial_frame = [ns_window frame];
- NSRect maximized_frame = [[ns_window screen] visibleFrame];
-
- EXPECT_FALSE(window->IsMaximized());
-
- // Maximize, Restore.
- watcher.reset([[WindowedNSNotificationObserver alloc]
- initForNotification:NSWindowDidResizeNotification
- object:ns_window]);
- app_window->Maximize();
- [watcher wait];
- EXPECT_EQ(initial_restored_bounds, window->GetRestoredBounds());
- EXPECT_TRUE(NSEqualRects(maximized_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMaximized());
-
- watcher.reset([[WindowedNSNotificationObserver alloc]
- initForNotification:NSWindowDidResizeNotification
- object:ns_window]);
- app_window->Restore();
- [watcher wait];
- EXPECT_EQ(initial_restored_bounds, window->GetRestoredBounds());
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_FALSE(window->IsMaximized());
-}
-
-// Test Minimize, Maximize, Restore combinations with their native equivalents.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, MinimizeMaximize) {
- SetUpAppWithWindows(1);
- AppWindow* app_window = GetFirstAppWindow();
- extensions::NativeAppWindow* window = app_window->GetBaseWindow();
- NSWindow* ns_window = app_window->GetNativeWindow();
- base::scoped_nsobject<WindowedNSNotificationObserver> watcher;
-
- NSRect initial_frame = [ns_window frame];
- NSRect maximized_frame = [[ns_window screen] visibleFrame];
-
- EXPECT_FALSE(window->IsMaximized());
- EXPECT_FALSE(window->IsMinimized());
- EXPECT_FALSE([ns_window isMiniaturized]);
-
- // Maximize, Minimize, Restore.
- watcher.reset([[WindowedNSNotificationObserver alloc]
- initForNotification:NSWindowDidResizeNotification
- object:ns_window]);
- app_window->Maximize();
- [watcher wait];
- EXPECT_TRUE(NSEqualRects(maximized_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMaximized());
-
- app_window->Minimize();
- EXPECT_TRUE(NSEqualRects(maximized_frame, [ns_window frame]));
- EXPECT_FALSE(window->IsMaximized());
- EXPECT_TRUE(window->IsMinimized());
- EXPECT_TRUE([ns_window isMiniaturized]);
-
- app_window->Restore();
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_FALSE(window->IsMaximized());
- EXPECT_FALSE(window->IsMinimized());
- EXPECT_FALSE([ns_window isMiniaturized]);
-
- // Minimize, Maximize.
- app_window->Minimize();
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMinimized());
- EXPECT_TRUE([ns_window isMiniaturized]);
-
- app_window->Maximize();
- EXPECT_TRUE([ns_window isVisible]);
- EXPECT_TRUE(NSEqualRects(maximized_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMaximized());
- EXPECT_FALSE(window->IsMinimized());
- EXPECT_FALSE([ns_window isMiniaturized]);
-}
-
-// Test Maximize, Fullscreen, Restore combinations.
-// TODO(jackhou): Enable this when we can mock out fullscreen.
-// See http://crbug.com/502150
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest,
- DISABLED_MaximizeFullscreen) {
- SetUpAppWithWindows(1);
- AppWindow* app_window = GetFirstAppWindow();
- extensions::NativeAppWindow* window = app_window->GetBaseWindow();
- NSWindow* ns_window = app_window->GetNativeWindow();
- base::scoped_nsobject<WindowedNSNotificationObserver> watcher;
- base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter(
- [[NSWindowFullscreenNotificationWaiter alloc] initWithWindow:ns_window]);
-
- NSRect initial_frame = [ns_window frame];
- NSRect maximized_frame = [[ns_window screen] visibleFrame];
-
- EXPECT_FALSE(window->IsMaximized());
- EXPECT_FALSE(window->IsFullscreen());
-
- // Maximize, Fullscreen, Restore, Restore.
- watcher.reset([[WindowedNSNotificationObserver alloc]
- initForNotification:NSWindowDidResizeNotification
- object:ns_window]);
- app_window->Maximize();
- [watcher wait];
- EXPECT_TRUE(NSEqualRects(maximized_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMaximized());
-
- EXPECT_EQ(0, [waiter enterCount]);
- app_window->Fullscreen();
- [waiter waitForEnterCount:1 exitCount:0];
- EXPECT_FALSE(window->IsMaximized());
- EXPECT_TRUE(window->IsFullscreen());
-
- app_window->Restore();
- [waiter waitForEnterCount:1 exitCount:1];
- EXPECT_TRUE(NSEqualRects(maximized_frame, [ns_window frame]));
- EXPECT_TRUE(window->IsMaximized());
- EXPECT_FALSE(window->IsFullscreen());
-
- app_window->Restore();
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_FALSE(window->IsMaximized());
-
- // Fullscreen, Maximize, Restore.
- app_window->Fullscreen();
- [waiter waitForEnterCount:2 exitCount:1];
- EXPECT_FALSE(window->IsMaximized());
- EXPECT_TRUE(window->IsFullscreen());
-
- app_window->Maximize();
- EXPECT_FALSE(window->IsMaximized());
- EXPECT_TRUE(window->IsFullscreen());
-
- app_window->Restore();
- [waiter waitForEnterCount:2 exitCount:2];
- EXPECT_TRUE(NSEqualRects(initial_frame, [ns_window frame]));
- EXPECT_FALSE(window->IsMaximized());
- EXPECT_FALSE(window->IsFullscreen());
-}
-
// Test that, in frameless windows, the web contents has the same size as the
// window.
IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Frameless) {
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.h b/chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.h
index 18b057b..5d930c8 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.h
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.h
@@ -5,22 +5,14 @@
#ifndef CHROME_BROWSER_UI_VIEWS_APPS_CHROME_NATIVE_APP_WINDOW_VIEWS_MAC_H_
#define CHROME_BROWSER_UI_VIEWS_APPS_CHROME_NATIVE_APP_WINDOW_VIEWS_MAC_H_
-#import <Foundation/Foundation.h>
-
-#import "base/mac/scoped_nsobject.h"
#include "chrome/browser/ui/views/apps/chrome_native_app_window_views.h"
-@class StartResizeNotificationObserver;
-
// Mac-specific parts of ChromeNativeAppWindowViews.
class ChromeNativeAppWindowViewsMac : public ChromeNativeAppWindowViews {
public:
ChromeNativeAppWindowViewsMac();
~ChromeNativeAppWindowViewsMac() override;
- // Called by |nswindow_observer_| when the window is about to resize.
- void OnWindowWillStartLiveResize();
-
protected:
// ChromeNativeAppWindowViews implementation.
void OnBeforeWidgetInit(
@@ -31,18 +23,11 @@ class ChromeNativeAppWindowViewsMac : public ChromeNativeAppWindowViews {
views::NonClientFrameView* CreateNonStandardAppFrame() override;
// ui::BaseWindow implementation.
- bool IsMaximized() const override;
- gfx::Rect GetRestoredBounds() const override;
void Show() override;
void ShowInactive() override;
void Activate() override;
- void Maximize() override;
- void Restore() override;
void FlashFrame(bool flash) override;
- // WidgetObserver implementation.
- void OnWidgetCreated(views::Widget* widget) override;
-
// NativeAppWindow implementation.
void UpdateDraggableRegions(
const std::vector<extensions::DraggableRegion>& regions) override;
@@ -56,12 +41,6 @@ class ChromeNativeAppWindowViewsMac : public ChromeNativeAppWindowViews {
// Unset is_hidden_with_app_ and tell the shim to unhide.
void UnhideWithoutActivation();
- // Used to notify us about certain NSWindow events.
- base::scoped_nsobject<StartResizeNotificationObserver> nswindow_observer_;
-
- // The bounds of the window just before it was last maximized.
- NSRect bounds_before_maximize_;
-
// Whether this window last became hidden due to a request to hide the entire
// app, e.g. via the dock menu or Cmd+H. This is set by Hide/ShowWithApp.
bool is_hidden_with_app_;
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.mm b/chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.mm
index ab7e05a..61e9657 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.mm
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.mm
@@ -7,81 +7,19 @@
#import <Cocoa/Cocoa.h>
#import "base/mac/scoped_nsobject.h"
-#import "base/mac/sdk_forward_declarations.h"
#include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h"
#import "chrome/browser/ui/views/apps/app_window_native_widget_mac.h"
#import "chrome/browser/ui/views/apps/native_app_window_frame_view_mac.h"
-#import "ui/gfx/mac/coordinate_conversion.h"
@interface NSView (WebContentsView)
- (void)setMouseDownCanMoveWindow:(BOOL)can_move;
@end
-// This observer is used to get NSWindowWillStartLiveResizeNotification. We need
-// a single hook when animated/user resize begins to save the current bounds.
-@interface StartResizeNotificationObserver : NSObject {
- @private
- // Weak. Owns us.
- ChromeNativeAppWindowViewsMac* nativeAppWindow_;
-}
-- (id)initForNativeAppWindow:(ChromeNativeAppWindowViewsMac*)nativeAppWindow;
-- (void)onWindowWillStartLiveResize:(NSNotification*)notification;
-- (void)stopObserving;
-@end
-
-@implementation StartResizeNotificationObserver
-
-- (id)initForNativeAppWindow:(ChromeNativeAppWindowViewsMac*)nativeAppWindow {
- if ((self = [super init])) {
- nativeAppWindow_ = nativeAppWindow;
- [[NSNotificationCenter defaultCenter]
- addObserver:self
- selector:@selector(onWindowWillStartLiveResize:)
- name:NSWindowWillStartLiveResizeNotification
- object:implicit_cast<ui::BaseWindow*>(nativeAppWindow)
- ->GetNativeWindow()];
- }
- return self;
-}
-
-- (void)onWindowWillStartLiveResize:(NSNotification*)notification {
- nativeAppWindow_->OnWindowWillStartLiveResize();
-}
-
-- (void)stopObserving {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- nativeAppWindow_ = nullptr;
-}
-
-@end
-
-namespace {
-
-bool NSWindowIsMaximized(NSWindow* window) {
- // -[NSWindow isZoomed] only works if the zoom button is enabled.
- if ([[window standardWindowButton:NSWindowZoomButton] isEnabled])
- return [window isZoomed];
-
- // We don't attempt to distinguish between a window that has been explicitly
- // maximized versus one that has just been dragged by the user to fill the
- // screen. This is the same behavior as -[NSWindow isZoomed] above.
- return NSEqualRects([window frame], [[window screen] visibleFrame]);
-}
-
-} // namespace
-
ChromeNativeAppWindowViewsMac::ChromeNativeAppWindowViewsMac()
: is_hidden_with_app_(false) {
}
ChromeNativeAppWindowViewsMac::~ChromeNativeAppWindowViewsMac() {
- [nswindow_observer_ stopObserving];
-}
-
-void ChromeNativeAppWindowViewsMac::OnWindowWillStartLiveResize() {
- if (!NSWindowIsMaximized(GetNativeWindow())) {
- bounds_before_maximize_ = [GetNativeWindow() frame];
- }
}
void ChromeNativeAppWindowViewsMac::OnBeforeWidgetInit(
@@ -105,17 +43,6 @@ ChromeNativeAppWindowViewsMac::CreateNonStandardAppFrame() {
return new NativeAppWindowFrameViewMac(widget(), this);
}
-bool ChromeNativeAppWindowViewsMac::IsMaximized() const {
- return !IsMinimized() && NSWindowIsMaximized(GetNativeWindow());
-}
-
-gfx::Rect ChromeNativeAppWindowViewsMac::GetRestoredBounds() const {
- if (NSWindowIsMaximized(GetNativeWindow()))
- return gfx::ScreenRectFromNSRect(bounds_before_maximize_);
-
- return ChromeNativeAppWindowViews::GetRestoredBounds();
-}
-
void ChromeNativeAppWindowViewsMac::Show() {
UnhideWithoutActivation();
ChromeNativeAppWindowViews::Show();
@@ -133,37 +60,12 @@ void ChromeNativeAppWindowViewsMac::Activate() {
ChromeNativeAppWindowViews::Activate();
}
-void ChromeNativeAppWindowViewsMac::Maximize() {
- if (IsFullscreen())
- return;
-
- NSWindow* window = GetNativeWindow();
- if (!NSWindowIsMaximized(window))
- [window setFrame:[[window screen] visibleFrame] display:YES animate:YES];
-
- if (IsMinimized())
- [window deminiaturize:nil];
-}
-
-void ChromeNativeAppWindowViewsMac::Restore() {
- NSWindow* window = GetNativeWindow();
- if (NSWindowIsMaximized(window))
- [window setFrame:bounds_before_maximize_ display:YES animate:YES];
-
- ChromeNativeAppWindowViews::Restore();
-}
-
void ChromeNativeAppWindowViewsMac::FlashFrame(bool flash) {
apps::ExtensionAppShimHandler::RequestUserAttentionForWindow(
app_window(), flash ? apps::APP_SHIM_ATTENTION_CRITICAL
: apps::APP_SHIM_ATTENTION_CANCEL);
}
-void ChromeNativeAppWindowViewsMac::OnWidgetCreated(views::Widget* widget) {
- nswindow_observer_.reset(
- [[StartResizeNotificationObserver alloc] initForNativeAppWindow:this]);
-}
-
void ChromeNativeAppWindowViewsMac::UpdateDraggableRegions(
const std::vector<extensions::DraggableRegion>& regions) {
ChromeNativeAppWindowViews::UpdateDraggableRegions(regions);
diff --git a/extensions/components/native_app_window/native_app_window_views.cc b/extensions/components/native_app_window/native_app_window_views.cc
index 0233623..e80e852 100644
--- a/extensions/components/native_app_window/native_app_window_views.cc
+++ b/extensions/components/native_app_window/native_app_window_views.cc
@@ -44,10 +44,10 @@ void NativeAppWindowViews::Init(AppWindow* app_window,
Observe(app_window_->web_contents());
widget_ = new views::Widget;
- widget_->AddObserver(this);
InitializeWindow(app_window, create_params);
OnViewWasResized();
+ widget_->AddObserver(this);
}
NativeAppWindowViews::~NativeAppWindowViews() {
diff --git a/ui/base/test/windowed_nsnotification_observer.h b/ui/base/test/windowed_nsnotification_observer.h
index ffecd97..92b897a 100644
--- a/ui/base/test/windowed_nsnotification_observer.h
+++ b/ui/base/test/windowed_nsnotification_observer.h
@@ -27,10 +27,6 @@ class RunLoop;
// Watch for an NSNotification on the default notification center.
- (id)initForNotification:(NSString*)name;
-// Watch for an NSNotification on the default notification center from a
-// particular object.
-- (id)initForNotification:(NSString*)name object:(id)sender;
-
// Watch for an NSNotification on the shared workspace notification center for
// the
// given application.
diff --git a/ui/base/test/windowed_nsnotification_observer.mm b/ui/base/test/windowed_nsnotification_observer.mm
index ae8d2f4..02f4517 100644
--- a/ui/base/test/windowed_nsnotification_observer.mm
+++ b/ui/base/test/windowed_nsnotification_observer.mm
@@ -15,15 +15,11 @@
@implementation WindowedNSNotificationObserver
- (id)initForNotification:(NSString*)name {
- return [self initForNotification:name object:nil];
-}
-
-- (id)initForNotification:(NSString*)name object:(id)sender {
if ((self = [super init])) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onNotification:)
name:name
- object:sender];
+ object:nil];
}
return self;
}
diff --git a/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm b/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
index 6b4db34..f7c4329 100644
--- a/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
+++ b/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
@@ -149,29 +149,6 @@ TEST_F(BridgedNativeWidgetUITest, FullscreenEnterAndExit) {
EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds());
}
-// Test that Widget::Restore exits fullscreen.
-TEST_F(BridgedNativeWidgetUITest, FullscreenRestore) {
- if (base::mac::IsOSSnowLeopard())
- return;
-
- base::scoped_nsobject<NSWindowFullscreenNotificationWaiter> waiter(
- [[NSWindowFullscreenNotificationWaiter alloc]
- initWithWindow:test_window()]);
-
- EXPECT_FALSE(widget_->IsFullscreen());
- const gfx::Rect restored_bounds = widget_->GetRestoredBounds();
- EXPECT_FALSE(restored_bounds.IsEmpty());
-
- widget_->SetFullscreen(true);
- EXPECT_TRUE(widget_->IsFullscreen());
- [waiter waitForEnterCount:1 exitCount:0];
-
- widget_->Restore();
- EXPECT_FALSE(widget_->IsFullscreen());
- [waiter waitForEnterCount:1 exitCount:1];
- EXPECT_EQ(restored_bounds, widget_->GetRestoredBounds());
-}
-
namespace {
// This is used to wait for reposted events to be seen. We can't just use
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index 0cd870c..680abb3 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -445,7 +445,6 @@ bool NativeWidgetMac::IsMinimized() const {
}
void NativeWidgetMac::Restore() {
- SetFullscreen(false);
[GetNativeWindow() deminiaturize:nil];
}