Chromium Code Reviews| 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..706eb4fd7fb525b0ae381f34e98ae3435b9d2a86 |
| --- /dev/null |
| +++ b/ash/screensaver/screensaver_view.cc |
| @@ -0,0 +1,149 @@ |
| +// 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 { |
| + |
| +WebViewFactory ScreensaverView::webview_factory_ = |
| + base::Bind(ScreensaverView::CreateWebView); |
| + |
| +// 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_ = webview_factory_.Run(context); |
|
Ben Goodger (Google)
2012/05/01 16:57:42
See my note about how to do this without a factory
rkc
2012/05/02 00:51:03
Done.
|
| + 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; |
| +} |
| + |
| +// static |
| +views::WebView* ScreensaverView::CreateWebView( |
| + content::BrowserContext* context) { |
| + return new views::WebView(context); |
| +} |
| + |
| +} // namespace internal |
| +} // namespace ash |