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

Unified Diff: ash/wm/caption_buttons/frame_maximize_button.cc

Issue 169443005: Fix crash which occurs when a widget destroys itself as a result of ET_GESTURE_TAP_DOWN (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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: ash/wm/caption_buttons/frame_maximize_button.cc
diff --git a/ash/wm/caption_buttons/frame_maximize_button.cc b/ash/wm/caption_buttons/frame_maximize_button.cc
index 16b98fecdee84b398995454bf3cef92b28e0e312..93dcb207665df7fd75cd209caef6dcc4b92ef544 100644
--- a/ash/wm/caption_buttons/frame_maximize_button.cc
+++ b/ash/wm/caption_buttons/frame_maximize_button.cc
@@ -38,9 +38,7 @@ const int kUpdateDelayMS = 400;
// The delay of the bubble appearance.
const int kBubbleAppearanceDelayMS = 500;
-// The minimum sanp size in percent of the screen width.
-const int kMinSnapSizePercent = 50;
-}
+} // namespace
// EscapeEventFilter is installed on the RootWindow to track when the escape key
// is pressed. We use an EventFilter for this as the FrameMaximizeButton
@@ -149,10 +147,11 @@ void FrameMaximizeButton::SnapButtonHovered(SnapType type) {
}
void FrameMaximizeButton::ExecuteSnapAndCloseMenu(SnapType snap_type) {
- // We can come here with no snap type set in case that the mouse opened the
- // maximize button and a touch event "touched" a button.
- if (snap_type_ == SNAP_NONE)
+ if (snap_type_ != snap_type) {
+ // This occurs if mouse hover opened the maximize bubble and a user
+ // "touched" one of the maximize bubble's buttons.
SnapButtonHovered(snap_type);
+ }
Cancel(true);
// Tell our menu to close.
@@ -191,12 +190,19 @@ void FrameMaximizeButton::OnWindowDestroying(aura::Window* window) {
maximizer_.reset();
if (observing_frame_) {
CHECK_EQ(frame_->GetNativeWindow(), window);
- frame_->GetNativeWindow()->RemoveObserver(this);
+ window->RemoveObserver(this);
+ wm::GetWindowState(window)->RemoveObserver(this);
frame_->RemoveObserver(this);
observing_frame_ = false;
}
}
+void FrameMaximizeButton::OnPostWindowShowTypeChange(
+ wm::WindowState* window_state,
+ wm::WindowShowType old_type) {
+ Cancel(false);
+}
+
void FrameMaximizeButton::OnWidgetActivationChanged(views::Widget* widget,
bool active) {
// Upon losing focus, the bubble menu and the phantom window should hide.
@@ -224,7 +230,9 @@ void FrameMaximizeButton::OnMouseEntered(const ui::MouseEvent& event) {
DCHECK(GetWidget());
if (!observing_frame_) {
observing_frame_ = true;
- frame_->GetNativeWindow()->AddObserver(this);
+ aura::Window* window = frame_->GetNativeWindow();
+ window->AddObserver(this);
+ wm::GetWindowState(window)->AddObserver(this);
frame_->AddObserver(this);
}
maximizer_.reset(new MaximizeBubbleController(
@@ -558,31 +566,23 @@ MaximizeBubbleFrameState
FrameMaximizeButton::GetMaximizeBubbleFrameState() const {
wm::WindowState* window_state =
wm::GetWindowState(frame_->GetNativeWindow());
- // When there are no restore bounds, we are in normal mode.
- if (!window_state->HasRestoreBounds())
- return FRAME_STATE_NONE;
- // The normal maximized test can be used.
- if (frame_->IsMaximized())
- return FRAME_STATE_FULL;
- // For Left/right maximize we need to check the dimensions.
- gfx::Rect bounds = frame_->GetWindowBoundsInScreen();
- gfx::Rect screen = Shell::GetScreen()->GetDisplayNearestWindow(
- frame_->GetNativeView()).work_area();
- if (bounds.width() < (screen.width() * kMinSnapSizePercent) / 100)
- return FRAME_STATE_NONE;
- // We might still have a horizontally filled window at this point which we
- // treat as no special state.
- if (bounds.y() != screen.y() || bounds.height() != screen.height())
- return FRAME_STATE_NONE;
-
- // We have to be in a maximize mode at this point.
- if (bounds.x() == screen.x())
- return FRAME_STATE_SNAP_LEFT;
- if (bounds.right() == screen.right())
- return FRAME_STATE_SNAP_RIGHT;
- // If we come here, it is likely caused by the fact that the
- // "VerticalResizeDoubleClick" stored a restore rectangle. In that case
- // we allow all maximize operations (and keep the restore rectangle).
+ switch (window_state->window_show_type()) {
+ case wm::SHOW_TYPE_MAXIMIZED:
+ case wm::SHOW_TYPE_FULLSCREEN:
+ return FRAME_STATE_FULL;
+ case wm::SHOW_TYPE_LEFT_SNAPPED:
+ return FRAME_STATE_SNAP_LEFT;
+ case wm::SHOW_TYPE_RIGHT_SNAPPED:
+ return FRAME_STATE_SNAP_RIGHT;
+ case wm::SHOW_TYPE_DEFAULT:
+ case wm::SHOW_TYPE_NORMAL:
+ case wm::SHOW_TYPE_MINIMIZED:
+ case wm::SHOW_TYPE_INACTIVE:
+ case wm::SHOW_TYPE_DETACHED:
+ case wm::SHOW_TYPE_END:
+ case wm::SHOW_TYPE_AUTO_POSITIONED:
+ return FRAME_STATE_NONE;
+ }
return FRAME_STATE_NONE;
}

Powered by Google App Engine
This is Rietveld 408576698