summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/chrome_browser_main_chromeos.cc6
-rw-r--r--chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.cc105
-rw-r--r--chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver.h43
-rw-r--r--chrome/browser/chromeos/kiosk_mode/kiosk_mode_screensaver_unittest.cc78
-rw-r--r--chrome/browser/chromeos/ui/screensaver_extension_dialog.cc158
-rw-r--r--chrome/browser/chromeos/ui/screensaver_extension_dialog.h65
-rw-r--r--chrome/browser/ui/views/extensions/extension_dialog.cc76
-rw-r--r--chrome/browser/ui/views/extensions/extension_dialog.h13
-rw-r--r--chrome/chrome_browser.gypi4
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--chrome/common/chrome_switches.cc6
-rw-r--r--chrome/common/chrome_switches.h2
12 files changed, 518 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..b105ef0 100644
--- a/chrome/browser/ui/views/extensions/extension_dialog.h
+++ b/chrome/browser/ui/views/extensions/extension_dialog.h
@@ -15,6 +15,7 @@ class Browser;
class ExtensionDialogObserver;
class ExtensionHost;
class GURL;
+class Profile;
namespace content {
class WebContents;
@@ -43,11 +44,10 @@ 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);
#endif
@@ -86,7 +86,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 +94,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 9340de5..dd66b99 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 2665410..2fe04e3 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 3c409071..7576779 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -1170,6 +1170,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";
@@ -1184,6 +1187,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 877d7db..9fda124 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -321,10 +321,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.