diff options
Diffstat (limited to 'chrome/browser/chromeos/ui')
-rw-r--r-- | chrome/browser/chromeos/ui/screensaver_extension_dialog.cc | 158 | ||||
-rw-r--r-- | chrome/browser/chromeos/ui/screensaver_extension_dialog.h | 65 |
2 files changed, 223 insertions, 0 deletions
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_ |