From ccd7df122f3d59d54316a8e6c8248d5b1a66dff7 Mon Sep 17 00:00:00 2001 From: jackhou Date: Thu, 13 Nov 2014 18:00:27 -0800 Subject: Don't fire AppLifetimeMonitor::Observer::OnAppActivated on every AppWindow::Show. The previous logic in AppLifetimeMonitor::OnAppWindowShown causes OnAppActivated to be fired whenever a window is shown. With this change, it will only fire when the first non-visible window becomes visible. This includes http://crrev.com/699363002 but passes |was_hidden| insetad of AppWindow::ShowType. BUG=410435 TEST=Create two windows using the Window State Sample app: https://chrome.google.com/webstore/detail/window-state-sample/hcbhfbnaaancmblfhdknlnojpafjohbi On one of the windows, set a delay of a few seconds, then click "Show". Focus a non-Chrome window so that both app windows are obscured. After the delay, only one app window should be brought to the front. Review URL: https://codereview.chromium.org/705173003 Cr-Commit-Position: refs/heads/master@{#304144} --- apps/app_lifetime_monitor.cc | 16 ++++++++++------ apps/app_lifetime_monitor.h | 11 +++++++---- 2 files changed, 17 insertions(+), 10 deletions(-) (limited to 'apps') diff --git a/apps/app_lifetime_monitor.cc b/apps/app_lifetime_monitor.cc index 16323e9..3190e29 100644 --- a/apps/app_lifetime_monitor.cc +++ b/apps/app_lifetime_monitor.cc @@ -81,21 +81,24 @@ void AppLifetimeMonitor::Observe(int type, } void AppLifetimeMonitor::OnAppWindowRemoved(AppWindow* app_window) { - if (!HasVisibleAppWindows(app_window)) + if (!HasOtherVisibleAppWindows(app_window)) NotifyAppDeactivated(app_window->extension_id()); } void AppLifetimeMonitor::OnAppWindowHidden(AppWindow* app_window) { - if (!HasVisibleAppWindows(app_window)) + if (!HasOtherVisibleAppWindows(app_window)) NotifyAppDeactivated(app_window->extension_id()); } -void AppLifetimeMonitor::OnAppWindowShown(AppWindow* app_window) { +void AppLifetimeMonitor::OnAppWindowShown(AppWindow* app_window, + bool was_hidden) { if (app_window->window_type() != AppWindow::WINDOW_TYPE_DEFAULT) return; - if (HasVisibleAppWindows(app_window)) + // The app is being activated if this is the first window to become visible. + if (was_hidden && !HasOtherVisibleAppWindows(app_window)) { NotifyAppActivated(app_window->extension_id()); + } } void AppLifetimeMonitor::Shutdown() { @@ -106,7 +109,8 @@ void AppLifetimeMonitor::Shutdown() { app_window_registry->RemoveObserver(this); } -bool AppLifetimeMonitor::HasVisibleAppWindows(AppWindow* app_window) const { +bool AppLifetimeMonitor::HasOtherVisibleAppWindows( + AppWindow* app_window) const { AppWindowRegistry::AppWindowList windows = AppWindowRegistry::Get(app_window->browser_context()) ->GetAppWindowsForApp(app_window->extension_id()); @@ -114,7 +118,7 @@ bool AppLifetimeMonitor::HasVisibleAppWindows(AppWindow* app_window) const { for (AppWindowRegistry::AppWindowList::const_iterator i = windows.begin(); i != windows.end(); ++i) { - if (!(*i)->is_hidden()) + if (*i != app_window && !(*i)->is_hidden()) return true; } return false; diff --git a/apps/app_lifetime_monitor.h b/apps/app_lifetime_monitor.h index 8f079fe..90ae2a8 100644 --- a/apps/app_lifetime_monitor.h +++ b/apps/app_lifetime_monitor.h @@ -32,9 +32,11 @@ class AppLifetimeMonitor : public KeyedService, public: // Called when the app starts running. virtual void OnAppStart(Profile* profile, const std::string& app_id) {} - // Called when the app becomes active to the user, i.e. it opens a window. + // Called when the app becomes active to the user, i.e. the first window + // becomes visible. virtual void OnAppActivated(Profile* profile, const std::string& app_id) {} - // Called when the app becomes inactive to the user. + // Called when the app becomes inactive to the user, i.e. the last window is + // hidden or closed. virtual void OnAppDeactivated(Profile* profile, const std::string& app_id) { } // Called when the app stops running. @@ -63,12 +65,13 @@ class AppLifetimeMonitor : public KeyedService, // extensions::AppWindowRegistry::Observer overrides: void OnAppWindowRemoved(extensions::AppWindow* app_window) override; void OnAppWindowHidden(extensions::AppWindow* app_window) override; - void OnAppWindowShown(extensions::AppWindow* app_window) override; + void OnAppWindowShown(extensions::AppWindow* app_window, + bool was_hidden) override; // KeyedService overrides: void Shutdown() override; - bool HasVisibleAppWindows(extensions::AppWindow* app_window) const; + bool HasOtherVisibleAppWindows(extensions::AppWindow* app_window) const; void NotifyAppStart(const std::string& app_id); void NotifyAppActivated(const std::string& app_id); -- cgit v1.1