blob: 0fa2308884ae426109107ff94616319cfe260034 [file] [log] [blame]
// Copyright 2015 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/views/extensions/extension_popup_aura.h"
#include "ui/aura/window.h"
#include "ui/views/widget/widget.h"
#include "ui/wm/core/window_animations.h"
#include "ui/wm/core/window_util.h"
#include "ui/wm/public/activation_client.h"
// static
ExtensionPopup* ExtensionPopup::Create(extensions::ExtensionViewHost* host,
views::View* anchor_view,
views::BubbleBorder::Arrow arrow,
ShowAction show_action) {
auto* popup = new ExtensionPopupAura(host, anchor_view, arrow, show_action);
views::Widget* widget = views::BubbleDialogDelegateView::CreateBubble(popup);
gfx::NativeView native_view = widget->GetNativeView();
wm::SetWindowVisibilityAnimationType(
native_view, wm::WINDOW_VISIBILITY_ANIMATION_TYPE_VERTICAL);
wm::SetWindowVisibilityAnimationVerticalPosition(native_view, -3.0f);
aura::client::GetActivationClient(native_view->GetRootWindow())
->AddObserver(popup);
return popup;
}
ExtensionPopupAura::ExtensionPopupAura(extensions::ExtensionViewHost* host,
views::View* anchor_view,
views::BubbleBorder::Arrow arrow,
ShowAction show_action)
: ExtensionPopup(host, anchor_view, arrow, show_action) {
}
ExtensionPopupAura::~ExtensionPopupAura() {
}
void ExtensionPopupAura::OnWidgetDestroying(views::Widget* widget) {
ExtensionPopup::OnWidgetDestroying(widget);
if (widget == GetWidget()) {
auto* activation_client = aura::client::GetActivationClient(
widget->GetNativeWindow()->GetRootWindow());
// If the popup was being inspected with devtools and the browser window
// was closed, then the root window and activation client are already
// destroyed.
if (activation_client)
activation_client->RemoveObserver(this);
}
}
void ExtensionPopupAura::OnWindowActivated(
aura::client::ActivationChangeObserver::ActivationReason reason,
aura::Window* gained_active,
aura::Window* lost_active) {
// Close on anchor window activation (ie. user clicked the browser window).
// DesktopNativeWidgetAura does not trigger the expected browser widget
// [de]activation events when activating widgets in its own root window.
// This additional check handles those cases. See: http://crbug.com/320889
if (gained_active == anchor_widget()->GetNativeWindow())
OnAnchorWindowActivation();
}