diff options
author | rkc@chromium.org <rkc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-28 08:54:46 +0000 |
---|---|---|
committer | rkc@chromium.org <rkc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-28 08:54:46 +0000 |
commit | f760f49ce1b3e2d1d31e04a8d1c5f99285455d1a (patch) | |
tree | bf22f7a52c4798a1ae60df3a622ad926c4a356b2 | |
parent | c94d7380ba5e6aa8cffe433d51d7a845f020634c (diff) | |
download | chromium_src-f760f49ce1b3e2d1d31e04a8d1c5f99285455d1a.zip chromium_src-f760f49ce1b3e2d1d31e04a8d1c5f99285455d1a.tar.gz chromium_src-f760f49ce1b3e2d1d31e04a8d1c5f99285455d1a.tar.bz2 |
Screensaver at login screen.
This CL adds code to show a screensaver on the login screen. The location of the screensaver and timeout for it to show up are currently hard coded but will be changed to pull from an enterprise policy once work on that end is completed.
The screensaver stays active only on the login screen, if any user logs on, we de-activate the screensaver for the rest of the session. Since logout causes a Chrome restart, we will be active on the login screen again.
If the screensaver crashes, we reload the extension and show ourselves again.
R=sky@chromium.org,xiyuan@chromium.org,yoz@chromium.org
BUG=chromium-os:26042
TEST=Tested that the screensaver comes up on the login screen, does not come up once we log in, reloads when I manually crash the screensaver extension process. Also verified that SelectFileDialog on ChromeOS works as intended.
Review URL: https://chromiumcodereview.appspot.com/9455038
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@123945 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/chromeos/chrome_browser_main_chromeos.cc | 6 | ||||
-rw-r--r-- | chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.cc | 105 | ||||
-rw-r--r-- | chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h | 43 | ||||
-rw-r--r-- | chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc | 78 | ||||
-rw-r--r-- | chrome/browser/chromeos/ui/screensaver_extension_dialog.cc | 158 | ||||
-rw-r--r-- | chrome/browser/chromeos/ui/screensaver_extension_dialog.h | 65 | ||||
-rw-r--r-- | chrome/browser/ui/views/extensions/extension_dialog.cc | 76 | ||||
-rw-r--r-- | chrome/browser/ui/views/extensions/extension_dialog.h | 22 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 4 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 | ||||
-rw-r--r-- | chrome/common/chrome_switches.cc | 6 | ||||
-rw-r--r-- | chrome/common/chrome_switches.h | 2 |
12 files changed, 527 insertions, 39 deletions
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 347366f..95b234e 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc @@ -25,6 +25,7 @@ #include "chrome/browser/chromeos/imageburner/burn_manager.h" #include "chrome/browser/chromeos/input_method/input_method_manager.h" #include "chrome/browser/chromeos/input_method/xkeyboard.h" +#include "chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h" #include "chrome/browser/chromeos/login/authenticator.h" #include "chrome/browser/chromeos/login/login_utils.h" #include "chrome/browser/chromeos/login/ownership_service.h" @@ -197,7 +198,11 @@ void OptionallyRunChromeOSLoginManager(const CommandLine& parsed_command_line, size.SetSize(width, height); } } + browser::ShowLoginWizard(first_screen, size); + + if (parsed_command_line.HasSwitch(switches::kEnableKioskMode)) + chromeos::InitializeKioskModeScreensaver(); } else if (parsed_command_line.HasSwitch(switches::kLoginUser) && parsed_command_line.HasSwitch(switches::kLoginPassword)) { chromeos::BootTimesLoader::Get()->RecordLoginAttempted(); @@ -221,6 +226,7 @@ ChromeBrowserMainPartsChromeos::ChromeBrowserMainPartsChromeos( } ChromeBrowserMainPartsChromeos::~ChromeBrowserMainPartsChromeos() { + chromeos::ShutdownKioskModeScreensaver(); cryptohome::AsyncMethodCaller::Shutdown(); chromeos::imageburner::BurnManager::Shutdown(); chromeos::disks::DiskMountManager::Shutdown(); diff --git a/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.cc b/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.cc new file mode 100644 index 0000000..bd943f4 --- /dev/null +++ b/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.cc @@ -0,0 +1,105 @@ +// 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/chromeos/kiosk_mode/kiosk_mode_screensaver.h" + +#include "base/lazy_instance.h" +#include "base/logging.h" +#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" +#include "chrome/browser/chromeos/login/user_manager.h" +#include "chrome/browser/chromeos/ui/screensaver_extension_dialog.h" +#include "chrome/common/chrome_notification_types.h" +#include "content/public/browser/notification_service.h" + +namespace { + +// This (along with screensaver location) will change once we have the +// retail mode enterprise policy set up. +const int64 kScreensaverIdleTimeout = 60; + +} // namespace + +namespace chromeos { + +KioskModeScreensaver::KioskModeScreensaver() { + // We should NOT be created if already logged in. + CHECK(!chromeos::UserManager::Get()->user_is_logged_in()); + + registrar_.Add(this, chrome::NOTIFICATION_LOGIN_USER_CHANGED, + content::NotificationService::AllSources()); + + // We will register ourselves now and unregister if a user logs in. + chromeos::PowerManagerClient* power_manager = + chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); + if (!power_manager->HasObserver(this)) + power_manager->AddObserver(this); + + // Register for the next Idle for kScreensaverIdleTimeout event. + chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> + RequestIdleNotification(kScreensaverIdleTimeout * 1000); +} + +KioskModeScreensaver::~KioskModeScreensaver() { + chromeos::PowerManagerClient* power_manager = + chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); + if (power_manager->HasObserver(this)) + power_manager->RemoveObserver(this); +} + +// NotificationObserver overrides: +void KioskModeScreensaver::Observe( + int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + DCHECK_EQ(type, chrome::NOTIFICATION_LOGIN_USER_CHANGED); + // User logged in, remove our observers, screensaver will be deactivated. + chromeos::PowerManagerClient* power_manager = + chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); + if (power_manager->HasObserver(this)) + power_manager->RemoveObserver(this); + + ShutdownKioskModeScreensaver(); +} + +void KioskModeScreensaver::IdleNotify(int64 threshold) { + // We're idle, next time we go active, we need to know so we can remove + // the logout dialog if it's still up. + chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> + RequestActiveNotification(); + + browser::ShowScreensaverDialog(); +} + +void KioskModeScreensaver::ActiveNotify() { + // Before anything else, close the logout dialog to prevent restart + browser::CloseScreensaverDialog(); + + // Now that we're active, register a request for notification for + // the next time we go idle for kScreensaverIdleTimeout seconds. + chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> + RequestIdleNotification(kScreensaverIdleTimeout * 1000); +} + +static KioskModeScreensaver* g_kiosk_mode_screensaver = NULL; + +void InitializeKioskModeScreensaver() { + if (g_kiosk_mode_screensaver) { + LOG(WARNING) << "Screensaver was already initialized"; + return; + } + + g_kiosk_mode_screensaver = new KioskModeScreensaver(); +} + +void ShutdownKioskModeScreensaver() { + if (g_kiosk_mode_screensaver) { + LOG(WARNING) << "Screensaver shutdown called when uninitialized."; + return; + } + + delete g_kiosk_mode_screensaver; + g_kiosk_mode_screensaver = NULL; +} + +} // namespace chromeos diff --git a/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h b/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h new file mode 100644 index 0000000..9daeec0 --- /dev/null +++ b/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h @@ -0,0 +1,43 @@ +// 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. + +#ifndef CHROME_BROWSER_CHROMEOS_KIOSK_MODE_KIOSK_MODE_SCREENSAVER_H_ +#define CHROME_BROWSER_CHROMEOS_KIOSK_MODE_KIOSK_MODE_SCREENSAVER_H_ +#pragma once + +#include "base/basictypes.h" +#include "chrome/browser/chromeos/dbus/power_manager_client.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" + +namespace chromeos { + +class KioskModeScreensaver : public PowerManagerClient::Observer, + public content::NotificationObserver { + public: + KioskModeScreensaver(); + virtual ~KioskModeScreensaver(); + + // NotificationObserver overrides: + virtual void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) OVERRIDE; + + // PowerManagerClient::Observer overrides: + virtual void IdleNotify(int64 threshold) OVERRIDE; + virtual void ActiveNotify() OVERRIDE; + + private: + friend class KioskModeScreensaverTest; + content::NotificationRegistrar registrar_; + + DISALLOW_COPY_AND_ASSIGN(KioskModeScreensaver); +}; + +void InitializeKioskModeScreensaver(); +void ShutdownKioskModeScreensaver(); + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_KIOSK_MODE_KIOSK_MODE_SCREENSAVER_H_ diff --git a/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc b/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc new file mode 100644 index 0000000..9198ad3 --- /dev/null +++ b/chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc @@ -0,0 +1,78 @@ +// 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/chromeos/kiosk_mode/kiosk_mode_screensaver.h" + +#include "base/bind.h" +#include "base/memory/scoped_ptr.h" +#include "base/message_loop.h" +#include "base/synchronization/waitable_event.h" +#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" +#include "chrome/browser/chromeos/login/user_manager.h" +#include "chrome/common/chrome_notification_types.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/notification_registrar.h" +#include "content/public/browser/notification_service.h" +#include "content/test/test_browser_thread.h" +#include "testing/gtest/include/gtest/gtest.h" + +using content::BrowserThread; + +namespace chromeos { + +class KioskModeScreensaverTest : public testing::Test { + public: + KioskModeScreensaverTest() + : ui_thread_(BrowserThread::UI, &message_loop_), + screensaver_(NULL) { + } + + virtual void SetUp() OVERRIDE { + DBusThreadManager::Initialize(); + screensaver_ = new KioskModeScreensaver(); + } + + virtual void TearDown() OVERRIDE { + delete screensaver_; + DBusThreadManager::Shutdown(); + } + + bool LoginUserObserverRegistered() { + return screensaver_->registrar_.IsRegistered( + screensaver_, + chrome::NOTIFICATION_LOGIN_USER_CHANGED, + content::NotificationService::AllSources()); + } + + bool PowerManagerObserverRegistered() { + chromeos::PowerManagerClient* power_manager = + chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); + return power_manager->HasObserver(screensaver_); + } + + MessageLoopForUI message_loop_; + content::TestBrowserThread ui_thread_; + + KioskModeScreensaver* screensaver_; + content::NotificationRegistrar registrar_; +}; + +TEST_F(KioskModeScreensaverTest, CheckObservers) { + EXPECT_TRUE(LoginUserObserverRegistered()); + EXPECT_TRUE(PowerManagerObserverRegistered()); +} + +TEST_F(KioskModeScreensaverTest, CheckObserversAfterUserLogin) { + content::NotificationService::current()->Notify( + chrome::NOTIFICATION_LOGIN_USER_CHANGED, + content::Source<UserManager>(UserManager::Get()), + // Ideally this should be the user logged in, but since we won't really be + // checking for the current logged in user in our observer anyway, giving + // NoDetails here is fine. + content::NotificationService::NoDetails()); + + EXPECT_FALSE(PowerManagerObserverRegistered()); +} + +} // namespace chromeos diff --git a/chrome/browser/chromeos/ui/screensaver_extension_dialog.cc b/chrome/browser/chromeos/ui/screensaver_extension_dialog.cc new file mode 100644 index 0000000..8eb2879 --- /dev/null +++ b/chrome/browser/chromeos/ui/screensaver_extension_dialog.cc @@ -0,0 +1,158 @@ +// 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/chromeos/ui/screensaver_extension_dialog.h" + +#include "base/bind.h" +#include "base/logging.h" +#include "base/memory/ref_counted.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/sessions/restore_tab_helper.h" +#include "chrome/browser/ui/views/extensions/extension_dialog.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/common/extensions/extension.h" +#include "chrome/common/extensions/extension_file_util.h" + +using content::BrowserThread; + +namespace { + +ScreensaverExtensionDialog* g_instance = NULL; + +} // namespace + +namespace browser { + +void ShowScreensaverDialog() { + ScreensaverExtensionDialog::ShowScreensaverDialog(); +} + +void CloseScreensaverDialog() { + ScreensaverExtensionDialog::CloseScreensaverDialog(); +} + +} // namespace browser + +// static +void ScreensaverExtensionDialog::ShowScreensaverDialog() { + if (!g_instance) + g_instance = new ScreensaverExtensionDialog(); + g_instance->Show(); +} + +// static +void ScreensaverExtensionDialog::CloseScreensaverDialog() { + if (g_instance) + g_instance->Close(); +} + +ScreensaverExtensionDialog::ScreensaverExtensionDialog() + : screensaver_extension_(NULL), + loading_extension_(false) { +} + +void ScreensaverExtensionDialog::LoadExtension() { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); + std::string error; + std::string extension_path = CommandLine::ForCurrentProcess()-> + GetSwitchValueASCII(switches::kKioskModeScreensaverPath); + + scoped_refptr<Extension> screensaver_extension = + extension_file_util::LoadExtension( + FilePath(extension_path), + Extension::COMPONENT, + Extension::NO_FLAGS, + &error); + + if (!screensaver_extension) { + LOG(ERROR) << "Could not load screensaver extension from: " << + extension_path; + return; + } + + BrowserThread::PostTask(BrowserThread::UI, + FROM_HERE, + base::Bind( + &ScreensaverExtensionDialog::SetExtensionAndShow, + base::Unretained(this), + screensaver_extension)); +} + +void ScreensaverExtensionDialog::SetExtensionAndShow( + scoped_refptr<Extension> extension) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + screensaver_extension_ = extension; + loading_extension_ = false; + Show(); +} + +void ScreensaverExtensionDialog::Show() { + // Whenever we're loading the extension, Show() will + // be called after the load finishes, so return. + if (loading_extension_) + return; + + if (!screensaver_extension_) { + loading_extension_ = true; + BrowserThread::PostTask(BrowserThread::FILE, + FROM_HERE, + base::Bind( + &ScreensaverExtensionDialog::LoadExtension, + base::Unretained(this))); + return; + } + + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + Profile* default_profile = ProfileManager::GetDefaultProfile(); + if (default_profile->GetExtensionService()->AddExtension( + screensaver_extension_)) { + extension_dialog_ = ExtensionDialog::ShowFullscreen( + screensaver_extension_->GetFullLaunchURL(), + default_profile, + string16(), + this); + } else { + LOG(ERROR) << "Couldn't add screensaver extension to profile."; + } +} + +void ScreensaverExtensionDialog::Close() { + if (extension_dialog_) { + extension_dialog_->Close(); + extension_dialog_ = NULL; + } +} + +ScreensaverExtensionDialog::~ScreensaverExtensionDialog() { + if (extension_dialog_) + extension_dialog_->ObserverDestroyed(); +} + +void ScreensaverExtensionDialog::ExtensionDialogClosing( + ExtensionDialog* dialog) { + // Release our reference to the dialog to allow it to close. + extension_dialog_ = NULL; +} + +void ScreensaverExtensionDialog::ExtensionTerminated( + ExtensionDialog* dialog) { + // This needs to be run 'slightly' delayed. When we get the extension + // terminated notification, the extension isn't fully unloaded yet. There + // is no good way to get around this. The correct solution will be to + // not need to reload the extension at all - but the current wiring in + // ExtensionViewsHost makes that not possible. + MessageLoop::current()->PostTask(FROM_HERE, + base::Bind(&ScreensaverExtensionDialog::ReloadAndShow, + base::Unretained(this))); + dialog->Close(); +} + +void ScreensaverExtensionDialog::ReloadAndShow() { + ProfileManager::GetDefaultProfile()->GetExtensionService()->ReloadExtension( + screensaver_extension_->id()); + + Show(); +} diff --git a/chrome/browser/chromeos/ui/screensaver_extension_dialog.h b/chrome/browser/chromeos/ui/screensaver_extension_dialog.h new file mode 100644 index 0000000..d11dede --- /dev/null +++ b/chrome/browser/chromeos/ui/screensaver_extension_dialog.h @@ -0,0 +1,65 @@ +// 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. + +#ifndef CHROME_BROWSER_CHROMEOS_UI_SCREENSAVER_EXTENSION_DIALOG_H_ +#define CHROME_BROWSER_CHROMEOS_UI_SCREENSAVER_EXTENSION_DIALOG_H_ +#pragma once + +#include "base/memory/ref_counted.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/views/extensions/extension_dialog_observer.h" + +class Extension; +class ExtensionDialog; + +namespace browser { + +void ShowScreensaverDialog(); +void CloseScreensaverDialog(); + +} // namespace browser + +// Shows or hides the screensaver extension in fullscreen mode on +// top of all other windows. +class ScreensaverExtensionDialog + : public ExtensionDialogObserver { + public: + static void ShowScreensaverDialog(); + static void CloseScreensaverDialog(); + + // ExtensionDialog::Observer implementation. + virtual void ExtensionDialogClosing(ExtensionDialog* dialog) OVERRIDE; + virtual void ExtensionTerminated(ExtensionDialog* dialog) OVERRIDE; + + protected: + // ScreensaverDialog implementation. + virtual void Show() OVERRIDE; + virtual void Close() OVERRIDE; + + private: + friend class ScreensaverExtensionDialogBrowserTest; + friend class ScreensaverExtensionDialogTest; + + ScreensaverExtensionDialog(); + virtual ~ScreensaverExtensionDialog(); + + // Load the screensaver extension. + void LoadExtension(); + // Callback to set the extension and show the dialog. + // Called from LoadExtension. + void SetExtensionAndShow(scoped_refptr<Extension> extension); + // Reload the screensaver extension and show another screensaver dialog. + void ReloadAndShow(); + + scoped_refptr<Extension> screensaver_extension_; + // Host for the extension that implements this dialog. + scoped_refptr<ExtensionDialog> extension_dialog_; + + // Set while we're loading an extension; only touched from the UI thread. + bool loading_extension_; + + DISALLOW_COPY_AND_ASSIGN(ScreensaverExtensionDialog); +}; + +#endif // CHROME_BROWSER_CHROMEOS_UI_SCREENSAVER_EXTENSION_DIALOG_H_ diff --git a/chrome/browser/ui/views/extensions/extension_dialog.cc b/chrome/browser/ui/views/extensions/extension_dialog.cc index 35f8220..9f0ec8f 100644 --- a/chrome/browser/ui/views/extensions/extension_dialog.cc +++ b/chrome/browser/ui/views/extensions/extension_dialog.cc @@ -19,12 +19,13 @@ #include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents.h" #include "googleurl/src/gurl.h" +#include "ui/gfx/screen.h" #include "ui/views/background.h" #include "ui/views/widget/widget.h" #if defined(USE_AURA) +#include "ash/shell.h" #include "ui/aura/root_window.h" -#include "ui/aura/window.h" #endif using content::WebContents; @@ -58,19 +59,27 @@ ExtensionDialog* ExtensionDialog::Show( int height, const string16& title, ExtensionDialogObserver* observer) { - return ExtensionDialog::ShowInternal(url, browser, web_contents, width, - height, false, title, observer); + ExtensionHost* host = CreateExtensionHost(url, browser, NULL); + if (!host) + return NULL; + host->set_associated_web_contents(web_contents); + + return ExtensionDialog::ShowInternal(url, browser, host, width, height, + false, title, observer); } #if defined(USE_AURA) // static ExtensionDialog* ExtensionDialog::ShowFullscreen( const GURL& url, - Browser* browser, - WebContents* web_contents, + Profile* profile, const string16& title, ExtensionDialogObserver* observer) { - return ExtensionDialog::ShowInternal(url, browser, web_contents, 0, 0, + ExtensionHost* host = CreateExtensionHost(url, NULL, profile); + if (!host) + return NULL; + + return ExtensionDialog::ShowInternal(url, NULL, host, 0, 0, true, title, observer); } #endif @@ -78,22 +87,18 @@ ExtensionDialog* ExtensionDialog::ShowFullscreen( // static ExtensionDialog* ExtensionDialog::ShowInternal(const GURL& url, Browser* browser, - content::WebContents* web_contents, + ExtensionHost* host, int width, int height, bool fullscreen, const string16& title, ExtensionDialogObserver* observer) { - CHECK(browser); - ExtensionHost* host = CreateExtensionHost(url, browser); - if (!host) - return NULL; - host->set_associated_web_contents(web_contents); - + CHECK(fullscreen || browser); ExtensionDialog* dialog = new ExtensionDialog(host, observer); dialog->set_title(title); + if (fullscreen) - dialog->InitWindowFullscreen(browser); + dialog->InitWindowFullscreen(); else dialog->InitWindow(browser, width, height); @@ -110,36 +115,41 @@ ExtensionDialog* ExtensionDialog::ShowInternal(const GURL& url, // static ExtensionHost* ExtensionDialog::CreateExtensionHost(const GURL& url, - Browser* browser) { - ExtensionProcessManager* manager = - browser->profile()->GetExtensionProcessManager(); + Browser* browser, + Profile* profile) { + // Prefer picking the extension manager from the profile if given. + ExtensionProcessManager* manager = NULL; + if (profile) + manager = profile->GetExtensionProcessManager(); + else + manager = browser->profile()->GetExtensionProcessManager(); + DCHECK(manager); if (!manager) return NULL; - return manager->CreateDialogHost(url, browser); + if (browser) + return manager->CreateDialogHost(url, browser); + else + return manager->CreatePopupHost(url, NULL); } #if defined(USE_AURA) -void ExtensionDialog::InitWindowFullscreen(Browser* browser) { - gfx::NativeWindow parent = browser->window()->GetNativeHandle(); - - // Create the window as a child of the root window. - window_ = browser::CreateFramelessViewsWindow( - parent->GetRootWindow(), this); - // Make sure we're always on top by putting ourselves at the top - // of the z-order of the child windows of the root window. - parent->GetRootWindow()->StackChildAtTop(window_->GetNativeWindow()); - - int width = parent->GetRootWindow()->GetHostSize().width(); - int height = parent->GetRootWindow()->GetHostSize().height(); - window_->SetBounds(gfx::Rect(0, 0, width, height)); - +void ExtensionDialog::InitWindowFullscreen() { + aura::RootWindow* root_window = ash::Shell::GetRootWindow(); + gfx::Rect screen_rect = + gfx::Screen::GetMonitorAreaNearestWindow(root_window); + + // We want to be the fullscreen topmost child of the root window. + window_ = browser::CreateFramelessViewsWindow(root_window, this); + window_->StackAtTop(); + window_->SetBounds(screen_rect); window_->Show(); + // TODO(jamescook): Remove redundant call to Activate()? window_->Activate(); } #else -void ExtensionDialog::InitWindowFullscreen(Browser* browser) { +void ExtensionDialog::InitWindowFullscreen() { NOTIMPLEMENTED(); } #endif diff --git a/chrome/browser/ui/views/extensions/extension_dialog.h b/chrome/browser/ui/views/extensions/extension_dialog.h index 65b65f0..47b91b5 100644 --- a/chrome/browser/ui/views/extensions/extension_dialog.h +++ b/chrome/browser/ui/views/extensions/extension_dialog.h @@ -7,6 +7,7 @@ #pragma once #include "base/memory/ref_counted.h" +#include "base/logging.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "ui/views/widget/widget_delegate.h" @@ -15,6 +16,7 @@ class Browser; class ExtensionDialogObserver; class ExtensionHost; class GURL; +class Profile; namespace content { class WebContents; @@ -43,13 +45,20 @@ class ExtensionDialog : public views::WidgetDelegate, #if defined(USE_AURA) // Create and show a fullscreen dialog with |url|. - // |browser| is the browser to which the pop-up will be attached. + // |profile| is the profile that the extension is registered with. // |web_contents| is the tab that spawned the dialog. static ExtensionDialog* ShowFullscreen(const GURL& url, - Browser* browser, - content::WebContents* web_contents, + Profile* profile, const string16& title, ExtensionDialogObserver* observer); +#else + static ExtensionDialog* ShowFullscreen(const GURL& url, + Profile* profile, + const string16& title, + ExtensionDialogObserver* observer) { + NOTIMPLEMENTED(); + return NULL; + } #endif // Notifies the dialog that the observer has been destroyed and should not @@ -86,7 +95,7 @@ class ExtensionDialog : public views::WidgetDelegate, static ExtensionDialog* ShowInternal(const GURL& url, Browser* browser, - content::WebContents* web_contents, + ExtensionHost* host, int width, int height, bool fullscreen, @@ -94,10 +103,11 @@ class ExtensionDialog : public views::WidgetDelegate, ExtensionDialogObserver* observer); static ExtensionHost* CreateExtensionHost(const GURL& url, - Browser* browser); + Browser* browser, + Profile* profile); void InitWindow(Browser* browser, int width, int height); - void InitWindowFullscreen(Browser* browser); + void InitWindowFullscreen(); // Window that holds the extension host view. views::Widget* window_; diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 04205ae..64919c9 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -553,6 +553,8 @@ 'browser/chromeos/input_method/xkeyboard.cc', 'browser/chromeos/input_method/xkeyboard.h', 'browser/chromeos/input_method/xkeyboard_data.h', + 'browser/chromeos/kiosk_mode/kiosk_mode_screensaver.cc', + 'browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h', 'browser/chromeos/language_preferences.cc', 'browser/chromeos/language_preferences.h', 'browser/chromeos/legacy_window_manager/initial_browser_window_observer.cc', @@ -848,6 +850,8 @@ 'browser/chromeos/tab_closeable_state_watcher.h', 'browser/chromeos/ui/brightness_bubble.cc', 'browser/chromeos/ui/brightness_bubble.h', + 'browser/chromeos/ui/screensaver_extension_dialog.cc', + 'browser/chromeos/ui/screensaver_extension_dialog.h', 'browser/chromeos/ui/setting_level_bubble.cc', 'browser/chromeos/ui/setting_level_bubble.h', 'browser/chromeos/ui/setting_level_bubble_view.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 2e9a547..7eab5d9 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1356,6 +1356,7 @@ 'browser/chromeos/input_method/input_method_util_unittest.cc', 'browser/chromeos/input_method/virtual_keyboard_selector_unittest.cc', 'browser/chromeos/input_method/xkeyboard_unittest.cc', + 'browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc', 'browser/chromeos/language_preferences_unittest.cc', 'browser/chromeos/login/authenticator_unittest.cc', 'browser/chromeos/login/cookie_fetcher_unittest.cc', diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 6b30059..fc3fe3c 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc @@ -1179,6 +1179,9 @@ const char kEnableDevicePolicy[] = "enable-device-policy"; // Viewer. const char kEnableGView[] = "enable-gview"; +// Enable Kiosk mode for ChromeOS +const char kEnableKioskMode[] = "enable-kiosk-mode"; + // Enables mobile setup in a dialog. const char kEnableMobileSetupDialog[] = "enable-mobile-dialog"; @@ -1193,6 +1196,9 @@ const char kEnableSensors[] = "enable-sensors"; // default. const char kEnableStaticIPConfig[] = "enable-static-ip-config"; +// Path for the screensaver used in Kiosk mode +const char kKioskModeScreensaverPath[] = "kiosk-mode-screensaver-path"; + // Enables Chrome-as-a-login-manager behavior. const char kLoginManager[] = "login-manager"; diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index e65ff7c..370630d 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h @@ -324,10 +324,12 @@ extern const char kSkipOAuthLogin[]; extern const char kEnableBluetooth[]; extern const char kEnableDevicePolicy[]; extern const char kEnableGView[]; +extern const char kEnableKioskMode[]; extern const char kEnableMobileSetupDialog[]; extern const char kEnableONCPolicy[]; extern const char kEnableSensors[]; extern const char kEnableStaticIPConfig[]; +extern const char kKioskModeScreensaverPath[]; extern const char kLoginManager[]; // TODO(avayvod): Remove this flag when it's unnecessary for testing // purposes. |