| Index: ash/screensaver/screensaver_view.cc
|
| diff --git a/ash/screensaver/screensaver_view.cc b/ash/screensaver/screensaver_view.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..858ae9ce8452ad3d3dfa0f8a05b7b3278b715464
|
| --- /dev/null
|
| +++ b/ash/screensaver/screensaver_view.cc
|
| @@ -0,0 +1,140 @@
|
| +// 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 "ash/screensaver/screensaver_view.h"
|
| +
|
| +#include "ash/shell.h"
|
| +#include "ash/shell_delegate.h"
|
| +#include "base/bind.h"
|
| +#include "base/logging.h"
|
| +#include "content/public/browser/browser_context.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "ui/gfx/screen.h"
|
| +#include "ui/aura/root_window.h"
|
| +#include "ui/views/layout/fill_layout.h"
|
| +#include "ui/views/controls/webview/webview.h"
|
| +#include "ui/views/widget/widget.h"
|
| +
|
| +using content::BrowserThread;
|
| +
|
| +namespace {
|
| +
|
| +ash::internal::ScreensaverView* g_instance = NULL;
|
| +
|
| +} // namespace
|
| +
|
| +namespace ash {
|
| +
|
| +void ShowScreensaver(const GURL& url) {
|
| + internal::ScreensaverView::ShowScreensaver(url);
|
| +}
|
| +
|
| +void CloseScreensaver() {
|
| + internal::ScreensaverView::CloseScreensaver();
|
| +}
|
| +
|
| +namespace internal {
|
| +
|
| +// static
|
| +void ScreensaverView::ShowScreensaver(const GURL& url) {
|
| + if (!g_instance) {
|
| + g_instance = new ScreensaverView(url);
|
| + g_instance->Show();
|
| + }
|
| +}
|
| +
|
| +// static
|
| +void ScreensaverView::CloseScreensaver() {
|
| + if (g_instance) {
|
| + g_instance->Close();
|
| + g_instance = NULL;
|
| + }
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// ScreensaverView, views::WidgetDelegateView implementation.
|
| +views::View* ScreensaverView::GetContentsView() {
|
| + return this;
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// ScreensaverView, content::WebContentsObserver implementation.
|
| +void ScreensaverView::RenderViewGone(
|
| + base::TerminationStatus status) {
|
| + LOG(ERROR) << "Screensaver terminated with status " << status
|
| + << ", reloading.";
|
| + // Reload the screensaver url into the webcontents.
|
| + LoadScreensaver();
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// ScreensaverView private methods.
|
| +ScreensaverView::ScreensaverView(const GURL& url)
|
| + : url_(url),
|
| + screensaver_webview_(NULL),
|
| + container_window_(NULL) {
|
| +}
|
| +
|
| +ScreensaverView::~ScreensaverView() {
|
| +}
|
| +
|
| +void ScreensaverView::Show() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + // Add the WebView to our view.
|
| + AddChildWebContents();
|
| + // Show the window.
|
| + ShowWindow();
|
| +}
|
| +
|
| +void ScreensaverView::Close() {
|
| + DCHECK(GetWidget());
|
| + GetWidget()->Close();
|
| +}
|
| +
|
| +void ScreensaverView::AddChildWebContents() {
|
| + content::BrowserContext* context =
|
| + Shell::GetInstance()->delegate()->GetCurrentBrowserContext();
|
| + screensaver_webview_ = new views::WebView(context);
|
| + SetLayoutManager(new views::FillLayout);
|
| + AddChildView(screensaver_webview_);
|
| +
|
| + LoadScreensaver();
|
| + content::WebContentsObserver::Observe(
|
| + screensaver_webview_->GetWebContents());
|
| +}
|
| +
|
| +void ScreensaverView::LoadScreensaver() {
|
| + screensaver_webview_->GetWebContents()->GetController().LoadURL(
|
| + url_,
|
| + content::Referrer(),
|
| + content::PAGE_TRANSITION_START_PAGE,
|
| + std::string());
|
| +}
|
| +
|
| +void ScreensaverView::ShowWindow() {
|
| + aura::RootWindow* root_window = ash::Shell::GetRootWindow();
|
| + gfx::Rect screen_rect =
|
| + gfx::Screen::GetMonitorNearestWindow(root_window).bounds();
|
| +
|
| + // We want to be the fullscreen topmost child of the root window.
|
| + // There should be nothing ever really that should show up on top of us.
|
| + container_window_ = new views::Widget();
|
| + views::Widget::InitParams params(
|
| + views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
| + params.delegate = this;
|
| + params.parent = root_window;
|
| + container_window_->Init(params);
|
| +
|
| + container_window_->StackAtTop();
|
| + container_window_->SetBounds(screen_rect);
|
| + container_window_->Show();
|
| +}
|
| +
|
| +// static
|
| +ScreensaverView* ScreensaverView::GetInstance() {
|
| + return g_instance;
|
| +}
|
| +
|
| +} // namespace internal
|
| +} // namespace ash
|
|
|