Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(523)

Unified Diff: chrome/browser/ui/cocoa/panels/panel_cocoa.mm

Issue 2263863002: Remove implementation of Panels on OSes other than ChromeOS. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: CR feedback Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/panels/panel_cocoa.mm
diff --git a/chrome/browser/ui/cocoa/panels/panel_cocoa.mm b/chrome/browser/ui/cocoa/panels/panel_cocoa.mm
deleted file mode 100644
index 51410476c0507df50d11b92863751ae8bfc86854..0000000000000000000000000000000000000000
--- a/chrome/browser/ui/cocoa/panels/panel_cocoa.mm
+++ /dev/null
@@ -1,455 +0,0 @@
-// Copyright (c) 2012 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/ui/cocoa/panels/panel_cocoa.h"
-
-#include "base/logging.h"
-#import "chrome/browser/ui/cocoa/chrome_event_processing_window.h"
-#import "chrome/browser/ui/cocoa/panels/panel_titlebar_view_cocoa.h"
-#import "chrome/browser/ui/cocoa/panels/panel_utils_cocoa.h"
-#import "chrome/browser/ui/cocoa/panels/panel_window_controller_cocoa.h"
-#include "chrome/browser/ui/panels/panel.h"
-#include "chrome/browser/ui/panels/stacked_panel_collection.h"
-#include "content/public/browser/native_web_keyboard_event.h"
-
-using content::NativeWebKeyboardEvent;
-using content::WebContents;
-
-// This creates a shim window class, which in turn creates a Cocoa window
-// controller which in turn creates actual NSWindow by loading a nib.
-// Overall chain of ownership is:
-// PanelWindowControllerCocoa -> PanelCocoa -> Panel.
-// static
-NativePanel* Panel::CreateNativePanel(Panel* panel,
- const gfx::Rect& bounds,
- bool always_on_top) {
- return new PanelCocoa(panel, bounds, always_on_top);
-}
-
-PanelCocoa::PanelCocoa(Panel* panel,
- const gfx::Rect& bounds,
- bool always_on_top)
- : panel_(panel),
- bounds_(bounds),
- always_on_top_(always_on_top),
- is_shown_(false),
- attention_request_id_(0),
- corner_style_(panel::ALL_ROUNDED) {
- controller_ = [[PanelWindowControllerCocoa alloc] initWithPanel:this];
-}
-
-PanelCocoa::~PanelCocoa() {
-}
-
-bool PanelCocoa::IsClosed() const {
- return !controller_;
-}
-
-void PanelCocoa::ShowPanel() {
- ShowPanelInactive();
- ActivatePanel();
-
- // |-makeKeyAndOrderFront:| won't send |-windowDidBecomeKey:| until we
- // return to the runloop. This causes extension tests that wait for the
- // active status change notification to fail, so we send an active status
- // notification here.
- panel_->OnActiveStateChanged(true);
-}
-
-void PanelCocoa::ShowPanelInactive() {
- if (IsClosed())
- return;
-
- // This method may be called several times, meaning 'ensure it's shown'.
- // Animations don't look good when repeated - hence this flag is needed.
- if (is_shown_) {
- return;
- }
- // A call to SetPanelBounds() before showing it is required to set
- // the panel frame properly.
- SetPanelBoundsInstantly(bounds_);
- is_shown_ = true;
-
- NSRect finalFrame = cocoa_utils::ConvertRectToCocoaCoordinates(bounds_);
- [controller_ revealAnimatedWithFrame:finalFrame];
-}
-
-gfx::Rect PanelCocoa::GetPanelBounds() const {
- return bounds_;
-}
-
-// |bounds| is the platform-independent screen coordinates, with (0,0) at
-// top-left of the primary screen.
-void PanelCocoa::SetPanelBounds(const gfx::Rect& bounds) {
- setBoundsInternal(bounds, true);
-}
-
-void PanelCocoa::SetPanelBoundsInstantly(const gfx::Rect& bounds) {
- setBoundsInternal(bounds, false);
-}
-
-void PanelCocoa::setBoundsInternal(const gfx::Rect& bounds, bool animate) {
- // We will call SetPanelBoundsInstantly() once before showing the panel
- // and it should set the panel frame correctly.
- if (bounds_ == bounds && is_shown_)
- return;
-
- bounds_ = bounds;
-
- // Safely ignore calls to animate bounds before the panel is shown to
- // prevent the window from loading prematurely.
- if (animate && !is_shown_)
- return;
-
- NSRect frame = cocoa_utils::ConvertRectToCocoaCoordinates(bounds);
- [controller_ setPanelFrame:frame animate:animate];
-}
-
-void PanelCocoa::ClosePanel() {
- if (IsClosed())
- return;
-
- NSWindow* window = [controller_ window];
- // performClose: contains a nested message loop which can cause reentrancy
- // if the browser is terminating and closing all the windows.
- // Use this version that corresponds to protocol of performClose: but does not
- // spin a nested loop.
- // TODO(dimich): refactor similar method from BWC and reuse here.
- if ([controller_ windowShouldClose:window]) {
- // Make sure that the panel window is not associated with the underlying
- // stack window because otherwise hiding the panel window could cause all
- // other panel windows in the same stack to disappear.
- NSWindow* stackWindow = [window parentWindow];
- if (stackWindow)
- [stackWindow removeChildWindow:window];
-
- [window orderOut:nil];
- [window close];
- }
-}
-
-void PanelCocoa::ActivatePanel() {
- if (!is_shown_)
- return;
-
- [controller_ activate];
-}
-
-void PanelCocoa::DeactivatePanel() {
- [controller_ deactivate];
-}
-
-bool PanelCocoa::IsPanelActive() const {
- // TODO(dcheng): It seems like a lot of these methods can be called before
- // our NSWindow is created. Do we really need to check in every one of these
- // methods if the NSWindow is created, or is there a better way to
- // gracefully handle this?
- if (!is_shown_)
- return false;
- return [[controller_ window] isMainWindow];
-}
-
-void PanelCocoa::PreventActivationByOS(bool prevent_activation) {
- [controller_ preventBecomingKeyWindow:prevent_activation];
- return;
-}
-
-gfx::NativeWindow PanelCocoa::GetNativePanelWindow() {
- return [controller_ window];
-}
-
-void PanelCocoa::UpdatePanelTitleBar() {
- if (!is_shown_)
- return;
- [controller_ updateTitleBar];
-}
-
-void PanelCocoa::UpdatePanelLoadingAnimations(bool should_animate) {
- [controller_ updateThrobber:should_animate];
-}
-
-void PanelCocoa::PanelCut() {
- // Nothing to do since we do not have panel-specific system menu on Mac.
-}
-
-void PanelCocoa::PanelCopy() {
- // Nothing to do since we do not have panel-specific system menu on Mac.
-}
-
-void PanelCocoa::PanelPaste() {
- // Nothing to do since we do not have panel-specific system menu on Mac.
-}
-
-void PanelCocoa::DrawAttention(bool draw_attention) {
- DCHECK((panel_->attention_mode() & Panel::USE_PANEL_ATTENTION) != 0);
-
- PanelTitlebarViewCocoa* titlebar = [controller_ titlebarView];
- if (draw_attention)
- [titlebar drawAttention];
- else
- [titlebar stopDrawingAttention];
-
- if ((panel_->attention_mode() & Panel::USE_SYSTEM_ATTENTION) != 0) {
- if (draw_attention) {
- DCHECK(!attention_request_id_);
- attention_request_id_ = [NSApp requestUserAttention:NSCriticalRequest];
- } else {
- [NSApp cancelUserAttentionRequest:attention_request_id_];
- attention_request_id_ = 0;
- }
- }
-}
-
-bool PanelCocoa::IsDrawingAttention() const {
- PanelTitlebarViewCocoa* titlebar = [controller_ titlebarView];
- return [titlebar isDrawingAttention];
-}
-
-void PanelCocoa::HandlePanelKeyboardEvent(
- const NativeWebKeyboardEvent& event) {
- if (event.skip_in_browser || event.type == NativeWebKeyboardEvent::Char)
- return;
-
- ChromeEventProcessingWindow* event_window =
- static_cast<ChromeEventProcessingWindow*>([controller_ window]);
- DCHECK([event_window isKindOfClass:[ChromeEventProcessingWindow class]]);
- [event_window redispatchKeyEvent:event.os_event];
-}
-
-void PanelCocoa::FullScreenModeChanged(bool is_full_screen) {
- if (!is_shown_) {
- // If the panel window is not shown due to that a Chrome tab window is in
- // fullscreen mode when the panel is being created, we need to show the
- // panel window now. In addition, its titlebar needs to be updated since it
- // is not done at the panel creation time.
- if (!is_full_screen) {
- ShowPanelInactive();
- UpdatePanelTitleBar();
- }
-
- // No need to proceed when the panel window was not shown previously.
- // We either show the panel window or do not show it depending on current
- // full screen state.
- return;
- }
- [controller_ fullScreenModeChanged:is_full_screen];
-}
-
-bool PanelCocoa::IsPanelAlwaysOnTop() const {
- return always_on_top_;
-}
-
-void PanelCocoa::SetPanelAlwaysOnTop(bool on_top) {
- if (always_on_top_ == on_top)
- return;
- always_on_top_ = on_top;
- [controller_ updateWindowLevel];
- [controller_ updateWindowCollectionBehavior];
-}
-
-void PanelCocoa::UpdatePanelMinimizeRestoreButtonVisibility() {
- [controller_ updateTitleBarMinimizeRestoreButtonVisibility];
-}
-
-void PanelCocoa::SetWindowCornerStyle(panel::CornerStyle corner_style) {
- corner_style_ = corner_style;
-
- // TODO(dimich): investigate how to support it on Mac.
-}
-
-void PanelCocoa::MinimizePanelBySystem() {
- [controller_ miniaturize];
-}
-
-bool PanelCocoa::IsPanelMinimizedBySystem() const {
- return [controller_ isMiniaturized];
-}
-
-bool PanelCocoa::IsPanelShownOnActiveDesktop() const {
- return [[controller_ window] isOnActiveSpace];
-}
-
-void PanelCocoa::ShowShadow(bool show) {
- [controller_ showShadow:show];
-}
-
-void PanelCocoa::PanelExpansionStateChanging(
- Panel::ExpansionState old_state, Panel::ExpansionState new_state) {
- [controller_ updateWindowLevel:(new_state != Panel::EXPANDED)];
-}
-
-void PanelCocoa::AttachWebContents(content::WebContents* contents) {
- [controller_ webContentsInserted:contents];
-}
-
-void PanelCocoa::DetachWebContents(content::WebContents* contents) {
- [controller_ webContentsDetached:contents];
-}
-
-gfx::Size PanelCocoa::WindowSizeFromContentSize(
- const gfx::Size& content_size) const {
- NSRect content = NSMakeRect(0, 0,
- content_size.width(), content_size.height());
- NSRect frame = [controller_ frameRectForContentRect:content];
- return gfx::Size(NSWidth(frame), NSHeight(frame));
-}
-
-gfx::Size PanelCocoa::ContentSizeFromWindowSize(
- const gfx::Size& window_size) const {
- NSRect frame = NSMakeRect(0, 0, window_size.width(), window_size.height());
- NSRect content = [controller_ contentRectForFrameRect:frame];
- return gfx::Size(NSWidth(content), NSHeight(content));
-}
-
-int PanelCocoa::TitleOnlyHeight() const {
- return [controller_ titlebarHeightInScreenCoordinates];
-}
-
-Panel* PanelCocoa::panel() const {
- return panel_.get();
-}
-
-void PanelCocoa::DidCloseNativeWindow() {
- DCHECK(!IsClosed());
- controller_ = NULL;
- panel_->OnNativePanelClosed();
-}
-
-// NativePanelTesting implementation.
-class CocoaNativePanelTesting : public NativePanelTesting {
- public:
- CocoaNativePanelTesting(NativePanel* native_panel);
- ~CocoaNativePanelTesting() override {}
- // Overridden from NativePanelTesting
- void PressLeftMouseButtonTitlebar(const gfx::Point& mouse_location,
- panel::ClickModifier modifier) override;
- void ReleaseMouseButtonTitlebar(panel::ClickModifier modifier) override;
- void DragTitlebar(const gfx::Point& mouse_location) override;
- void CancelDragTitlebar() override;
- void FinishDragTitlebar() override;
- bool VerifyDrawingAttention() const override;
- bool VerifyActiveState(bool is_active) override;
- bool VerifyAppIcon() const override;
- bool VerifySystemMinimizeState() const override;
- bool IsWindowVisible() const override;
- bool IsWindowSizeKnown() const override;
- bool IsAnimatingBounds() const override;
- bool IsButtonVisible(panel::TitlebarButtonType button_type) const override;
- panel::CornerStyle GetWindowCornerStyle() const override;
- bool EnsureApplicationRunOnForeground() override;
-
- private:
- PanelTitlebarViewCocoa* titlebar() const;
- // Weak, assumed always to outlive this test API object.
- PanelCocoa* native_panel_window_;
-};
-
-NativePanelTesting* PanelCocoa::CreateNativePanelTesting() {
- return new CocoaNativePanelTesting(this);
-}
-
-CocoaNativePanelTesting::CocoaNativePanelTesting(NativePanel* native_panel)
- : native_panel_window_(static_cast<PanelCocoa*>(native_panel)) {
-}
-
-PanelTitlebarViewCocoa* CocoaNativePanelTesting::titlebar() const {
- return [native_panel_window_->controller_ titlebarView];
-}
-
-void CocoaNativePanelTesting::PressLeftMouseButtonTitlebar(
- const gfx::Point& mouse_location, panel::ClickModifier modifier) {
- // Convert from platform-indepedent screen coordinates to Cocoa's screen
- // coordinates because PanelTitlebarViewCocoa method takes Cocoa's screen
- // coordinates.
- int modifierFlags =
- (modifier == panel::APPLY_TO_ALL ? NSShiftKeyMask : 0);
- [titlebar() pressLeftMouseButtonTitlebar:
- cocoa_utils::ConvertPointToCocoaCoordinates(mouse_location)
- modifiers:modifierFlags];
-}
-
-void CocoaNativePanelTesting::ReleaseMouseButtonTitlebar(
- panel::ClickModifier modifier) {
- int modifierFlags =
- (modifier == panel::APPLY_TO_ALL ? NSShiftKeyMask : 0);
- [titlebar() releaseLeftMouseButtonTitlebar:modifierFlags];
-}
-
-void CocoaNativePanelTesting::DragTitlebar(const gfx::Point& mouse_location) {
- // Convert from platform-indepedent screen coordinates to Cocoa's screen
- // coordinates because PanelTitlebarViewCocoa method takes Cocoa's screen
- // coordinates.
- [titlebar() dragTitlebar:
- cocoa_utils::ConvertPointToCocoaCoordinates(mouse_location)];
-}
-
-void CocoaNativePanelTesting::CancelDragTitlebar() {
- [titlebar() cancelDragTitlebar];
-}
-
-void CocoaNativePanelTesting::FinishDragTitlebar() {
- [titlebar() finishDragTitlebar];
-}
-
-bool CocoaNativePanelTesting::VerifyDrawingAttention() const {
- return [titlebar() isDrawingAttention];
-}
-
-bool CocoaNativePanelTesting::VerifyActiveState(bool is_active) {
- // TODO(jianli): to be implemented.
- return false;
-}
-
-bool CocoaNativePanelTesting::VerifyAppIcon() const {
- // Nothing to do since panel does not show dock icon.
- return true;
-}
-
-bool CocoaNativePanelTesting::VerifySystemMinimizeState() const {
- // TODO(jianli): to be implemented.
- return true;
-}
-
-bool CocoaNativePanelTesting::IsWindowVisible() const {
- return [[native_panel_window_->controller_ window] isVisible];
-}
-
-bool CocoaNativePanelTesting::IsWindowSizeKnown() const {
- return true;
-}
-
-bool CocoaNativePanelTesting::IsAnimatingBounds() const {
- if ([native_panel_window_->controller_ isAnimatingBounds])
- return true;
- StackedPanelCollection* stack = native_panel_window_->panel()->stack();
- if (!stack)
- return false;
- return stack->IsAnimatingPanelBounds(native_panel_window_->panel());
-}
-
-bool CocoaNativePanelTesting::IsButtonVisible(
- panel::TitlebarButtonType button_type) const {
- switch (button_type) {
- case panel::CLOSE_BUTTON:
- return ![[titlebar() closeButton] isHidden];
- case panel::MINIMIZE_BUTTON:
- return ![[titlebar() minimizeButton] isHidden];
- case panel::RESTORE_BUTTON:
- return ![[titlebar() restoreButton] isHidden];
- default:
- NOTREACHED();
- }
- return false;
-}
-
-panel::CornerStyle CocoaNativePanelTesting::GetWindowCornerStyle() const {
- return native_panel_window_->corner_style_;
-}
-
-bool CocoaNativePanelTesting::EnsureApplicationRunOnForeground() {
- if ([NSApp isActive])
- return true;
- [NSApp activateIgnoringOtherApps:YES];
- return [NSApp isActive];
-}
« no previous file with comments | « chrome/browser/ui/cocoa/panels/panel_cocoa.h ('k') | chrome/browser/ui/cocoa/panels/panel_cocoa_browsertest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698