| Index: chrome_frame/ready_mode/ready_mode.cc
|
| diff --git a/chrome_frame/ready_mode/ready_mode.cc b/chrome_frame/ready_mode/ready_mode.cc
|
| deleted file mode 100644
|
| index 12853292dc960e6c21c9739def278970915eb782..0000000000000000000000000000000000000000
|
| --- a/chrome_frame/ready_mode/ready_mode.cc
|
| +++ /dev/null
|
| @@ -1,400 +0,0 @@
|
| -// 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_frame/ready_mode/ready_mode.h"
|
| -
|
| -#include <atlbase.h>
|
| -#include <shlguid.h>
|
| -
|
| -#include "base/compiler_specific.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/linked_ptr.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/win/scoped_bstr.h"
|
| -#include "base/win/scoped_comptr.h"
|
| -#include "base/win/win_util.h"
|
| -#include "chrome/installer/util/browser_distribution.h"
|
| -#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
|
| -#include "chrome_frame/infobars/infobar_manager.h"
|
| -#include "chrome_frame/ready_mode/internal/ready_mode_web_browser_adapter.h"
|
| -#include "chrome_frame/ready_mode/internal/ready_prompt_content.h"
|
| -#include "chrome_frame/ready_mode/internal/registry_ready_mode_state.h"
|
| -#include "chrome_frame/ready_mode/internal/url_launcher.h"
|
| -#include "chrome_frame/utils.h"
|
| -
|
| -namespace {
|
| -
|
| -// Temporarily disable Ready Mode for 36 hours when the user so indicates.
|
| -const int kTemporaryDeclineDurationMinutes = 60 * 36;
|
| -
|
| -class BrowserObserver;
|
| -
|
| -// A helper for BrowserObserver to observe the user's choice in the Ready Mode
|
| -// prompt.
|
| -class StateObserver : public RegistryReadyModeState::Observer {
|
| - public:
|
| - explicit StateObserver(const base::WeakPtr<BrowserObserver>& ready_mode_ui);
|
| - ~StateObserver();
|
| -
|
| - // RegistryReadyModeState::Observer implementation
|
| - virtual void OnStateChange(ReadyModeStatus status);
|
| -
|
| - private:
|
| - base::WeakPtr<BrowserObserver> ready_mode_ui_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(StateObserver);
|
| -}; // class StateObserver
|
| -
|
| -// Manages the Ready Mode UI in response to browsing ChromeFrame- or Host-
|
| -// rendered pages. Shows the Ready Mode prompt when the user browses to a GCF-
|
| -// enabled page. Hides the prompt when the user begins navigating to a new
|
| -// domain or when they navigate to a new page in the same domain that is not
|
| -// GCF enabled.
|
| -//
|
| -// Uses InstallerAdapter and RegistryReadyMode to query and update the
|
| -// installation state. Uninstalls the ReadyModeWebBrowserAdapter when the user
|
| -// temporarily or permanently exits Ready Mode (decline or accept Chrome Frame).
|
| -// If the user declines Chrome Frame, the current page is reloaded in the Host
|
| -// renderer.
|
| -class BrowserObserver : public ReadyModeWebBrowserAdapter::Observer {
|
| - public:
|
| - BrowserObserver(ready_mode::Delegate* chrome_frame,
|
| - IWebBrowser2* web_browser,
|
| - ReadyModeWebBrowserAdapter* adapter);
|
| -
|
| - // ReadyModeWebBrowserAdapter::Observer implementation
|
| - virtual void OnNavigateTo(const std::wstring& url);
|
| - virtual void OnRenderInChromeFrame(const std::wstring& url);
|
| - virtual void OnRenderInHost(const std::wstring& url);
|
| -
|
| - private:
|
| - friend class StateObserver;
|
| -
|
| - // Called by the StateObserver
|
| - void OnReadyModeDisabled();
|
| - void OnReadyModeAccepted();
|
| -
|
| - // Helpers for showing infobar prompts
|
| - void ShowPrompt();
|
| - void Hide();
|
| - InfobarManager* GetInfobarManager();
|
| -
|
| - GURL rendered_url_;
|
| - linked_ptr<ready_mode::Delegate> chrome_frame_;
|
| - base::win::ScopedComPtr<IWebBrowser2> web_browser_;
|
| - // The adapter owns us, so we use a weak reference
|
| - ReadyModeWebBrowserAdapter* adapter_;
|
| - base::WeakPtrFactory<BrowserObserver> weak_ptr_factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(BrowserObserver);
|
| -}; // class BrowserObserver
|
| -
|
| -// Implements launching of a URL in an instance of IWebBrowser2.
|
| -class UrlLauncherImpl : public UrlLauncher {
|
| - public:
|
| - explicit UrlLauncherImpl(IWebBrowser2* web_browser);
|
| -
|
| - // UrlLauncher implementation
|
| - void LaunchUrl(const std::wstring& url);
|
| -
|
| - private:
|
| - base::win::ScopedComPtr<IWebBrowser2> web_browser_;
|
| -}; // class UrlLaucherImpl
|
| -
|
| -UrlLauncherImpl::UrlLauncherImpl(IWebBrowser2* web_browser) {
|
| - DCHECK(web_browser);
|
| - web_browser_ = web_browser;
|
| -}
|
| -
|
| -void UrlLauncherImpl::LaunchUrl(const std::wstring& url) {
|
| - VARIANT flags = { VT_I4 };
|
| - V_I4(&flags) = navOpenInNewWindow;
|
| - base::win::ScopedBstr location(url.c_str());
|
| -
|
| - HRESULT hr = web_browser_->Navigate(location, &flags, NULL, NULL, NULL);
|
| - DLOG_IF(ERROR, FAILED(hr)) << "Failed to invoke Navigate on IWebBrowser2. "
|
| - << "Error: " << hr;
|
| -}
|
| -
|
| -StateObserver::StateObserver(
|
| - const base::WeakPtr<BrowserObserver>& ready_mode_ui)
|
| - : ready_mode_ui_(ready_mode_ui) {
|
| -}
|
| -
|
| -StateObserver::~StateObserver() {
|
| -}
|
| -
|
| -void StateObserver::OnStateChange(ReadyModeStatus status) {
|
| - if (ready_mode_ui_ == NULL)
|
| - return;
|
| -
|
| - switch (status) {
|
| - case READY_MODE_PERMANENTLY_DECLINED:
|
| - case READY_MODE_TEMPORARILY_DECLINED:
|
| - ready_mode_ui_->OnReadyModeDisabled();
|
| - break;
|
| -
|
| - case READY_MODE_ACCEPTED:
|
| - ready_mode_ui_->OnReadyModeAccepted();
|
| - break;
|
| -
|
| - case READY_MODE_ACTIVE:
|
| - break;
|
| -
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -}
|
| -
|
| -BrowserObserver::BrowserObserver(ready_mode::Delegate* chrome_frame,
|
| - IWebBrowser2* web_browser,
|
| - ReadyModeWebBrowserAdapter* adapter)
|
| - : web_browser_(web_browser),
|
| - chrome_frame_(chrome_frame),
|
| - adapter_(adapter),
|
| - weak_ptr_factory_(this) {
|
| -}
|
| -
|
| -void BrowserObserver::OnNavigateTo(const std::wstring& url) {
|
| - if (!net::registry_controlled_domains::SameDomainOrHost(
|
| - GURL(url),
|
| - rendered_url_,
|
| - net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES)) {
|
| - rendered_url_ = GURL();
|
| - Hide();
|
| - }
|
| -}
|
| -
|
| -void BrowserObserver::OnRenderInChromeFrame(const std::wstring& url) {
|
| - ShowPrompt();
|
| - rendered_url_ = GURL(url);
|
| -}
|
| -
|
| -void BrowserObserver::OnRenderInHost(const std::wstring& url) {
|
| - Hide();
|
| - rendered_url_ = GURL(url);
|
| -}
|
| -
|
| -void BrowserObserver::OnReadyModeDisabled() {
|
| - // We don't hold a reference to the adapter, since it owns us (in order to
|
| - // break circular dependency). But we should still AddRef it before
|
| - // invocation.
|
| - base::win::ScopedComPtr<ReadyModeWebBrowserAdapter, NULL> reference(adapter_);
|
| -
|
| - // adapter_->Uninitialize may delete us, so we should not refer to members
|
| - // after that point.
|
| - base::win::ScopedComPtr<IWebBrowser2> web_browser(web_browser_);
|
| -
|
| - chrome_frame_->DisableChromeFrame();
|
| - adapter_->Uninitialize();
|
| -
|
| - VARIANT flags = { VT_I4 };
|
| - V_I4(&flags) = navNoHistory;
|
| - base::win::ScopedBstr location;
|
| -
|
| - HRESULT hr = web_browser->get_LocationURL(location.Receive());
|
| - DLOG_IF(ERROR, FAILED(hr)) << "Failed to get current location from "
|
| - << "IWebBrowser2. Error: " << hr;
|
| -
|
| - if (SUCCEEDED(hr)) {
|
| - hr = web_browser->Navigate(location, &flags, NULL, NULL, NULL);
|
| - DLOG_IF(ERROR, FAILED(hr)) << "Failed to invoke Navigate on IWebBrowser2. "
|
| - << "Error: " << hr;
|
| - }
|
| -}
|
| -
|
| -void BrowserObserver::OnReadyModeAccepted() {
|
| - // See comment in OnReadyModeDisabled.
|
| - base::win::ScopedComPtr<ReadyModeWebBrowserAdapter, NULL> reference(adapter_);
|
| - adapter_->Uninitialize();
|
| -}
|
| -
|
| -void BrowserObserver::ShowPrompt() {
|
| - // This pointer is self-managed and not guaranteed to survive handling of
|
| - // Windows events.
|
| - InfobarManager* infobar_manager = GetInfobarManager();
|
| -
|
| - if (infobar_manager) {
|
| - // Owned by ready_mode_state
|
| - scoped_ptr<RegistryReadyModeState::Observer> ready_mode_state_observer(
|
| - new StateObserver(weak_ptr_factory_.GetWeakPtr()));
|
| -
|
| - BrowserDistribution* dist =
|
| - BrowserDistribution::GetSpecificDistribution(
|
| - BrowserDistribution::CHROME_BINARIES);
|
| -
|
| - // Owned by infobar_content
|
| - scoped_ptr<ReadyModeState> ready_mode_state(new RegistryReadyModeState(
|
| - dist->GetStateKey(),
|
| - base::TimeDelta::FromMinutes(kTemporaryDeclineDurationMinutes),
|
| - ready_mode_state_observer.release()));
|
| -
|
| - // Owned by infobar_content
|
| - scoped_ptr<UrlLauncher> url_launcher(new UrlLauncherImpl(web_browser_));
|
| -
|
| - // Owned by infobar_manager
|
| - scoped_ptr<InfobarContent> infobar_content(new ReadyPromptContent(
|
| - ready_mode_state.release(), url_launcher.release()));
|
| -
|
| - infobar_manager->Show(infobar_content.release(), TOP_INFOBAR);
|
| - }
|
| -}
|
| -
|
| -void BrowserObserver::Hide() {
|
| - InfobarManager* infobar_manager = GetInfobarManager();
|
| - if (infobar_manager)
|
| - infobar_manager->HideAll();
|
| -}
|
| -
|
| -InfobarManager* BrowserObserver::GetInfobarManager() {
|
| - HRESULT hr = NOERROR;
|
| -
|
| - base::win::ScopedComPtr<IOleWindow> ole_window;
|
| - hr = DoQueryService(SID_SShellBrowser, web_browser_, ole_window.Receive());
|
| - if (FAILED(hr) || ole_window == NULL) {
|
| - DLOG(ERROR) << "Failed to query SID_SShellBrowser from IWebBrowser2. "
|
| - << "Error: " << hr;
|
| - return NULL;
|
| - }
|
| -
|
| - HWND web_browserhwnd = NULL;
|
| - hr = ole_window->GetWindow(&web_browserhwnd);
|
| - if (FAILED(hr) || web_browserhwnd == NULL) {
|
| - DLOG(ERROR) << "Failed to query HWND from IOleWindow. "
|
| - << "Error: " << hr;
|
| - return NULL;
|
| - }
|
| -
|
| - return InfobarManager::Get(web_browserhwnd);
|
| -}
|
| -
|
| -// Wraps an existing Delegate so that ownership may be shared.
|
| -class DelegateWrapper : public ready_mode::Delegate {
|
| - public:
|
| - explicit DelegateWrapper(linked_ptr<ready_mode::Delegate> wrapped);
|
| -
|
| - // ready_mode::Delegate implementation
|
| - virtual void DisableChromeFrame();
|
| -
|
| - private:
|
| - linked_ptr<ready_mode::Delegate> wrapped_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DelegateWrapper);
|
| -}; // class DelegateWrapper
|
| -
|
| -DelegateWrapper::DelegateWrapper(linked_ptr<ready_mode::Delegate> wrapped)
|
| - : wrapped_(wrapped) {
|
| -}
|
| -
|
| -void DelegateWrapper::DisableChromeFrame() {
|
| - wrapped_->DisableChromeFrame();
|
| -}
|
| -
|
| -// Attempts to create a ReadyModeWebBrowserAdapter instance.
|
| -bool CreateWebBrowserAdapter(ReadyModeWebBrowserAdapter** pointer) {
|
| - *pointer = NULL;
|
| -
|
| - CComObject<ReadyModeWebBrowserAdapter>* com_object;
|
| - HRESULT hr =
|
| - CComObject<ReadyModeWebBrowserAdapter>::CreateInstance(&com_object);
|
| -
|
| - if (FAILED(hr)) {
|
| - DLOG(ERROR) << "Failed to create instance of ReadyModeWebBrowserAdapter. "
|
| - << "Error: " << hr;
|
| - return false;
|
| - }
|
| -
|
| - com_object->AddRef();
|
| - *pointer = com_object;
|
| - return true;
|
| -}
|
| -
|
| -// Attempts to install Ready Mode prompts in the provided web browser. Will
|
| -// notify the provided Delegate if the user declines Chrome Frame temporarily or
|
| -// permanently.
|
| -bool InstallPrompts(linked_ptr<ready_mode::Delegate> delegate,
|
| - IWebBrowser2* web_browser) {
|
| - base::win::ScopedComPtr<ReadyModeWebBrowserAdapter, NULL> adapter;
|
| -
|
| - if (!CreateWebBrowserAdapter(adapter.Receive()))
|
| - return false;
|
| -
|
| - // Wrap the original delegate so that we can share it with the
|
| - // ReadyModeWebBrowserAdapter
|
| - scoped_ptr<DelegateWrapper> delegate_wrapper(new DelegateWrapper(delegate));
|
| -
|
| - // Pass ownership of our delegate to the BrowserObserver
|
| - scoped_ptr<ReadyModeWebBrowserAdapter::Observer> browser_observer(
|
| - new BrowserObserver(delegate_wrapper.release(), web_browser, adapter));
|
| -
|
| - // Owns the BrowserObserver
|
| - return adapter->Initialize(web_browser, browser_observer.release());
|
| -}
|
| -
|
| -// Checks if the provided status implies disabling Chrome Frame functionality.
|
| -bool ShouldDisableChromeFrame(ReadyModeStatus status) {
|
| - switch (status) {
|
| - case READY_MODE_PERMANENTLY_DECLINED:
|
| - case READY_MODE_TEMPORARILY_DECLINED:
|
| - case READY_MODE_TEMPORARY_DECLINE_EXPIRED:
|
| - return true;
|
| -
|
| - case READY_MODE_ACCEPTED:
|
| - case READY_MODE_ACTIVE:
|
| - return false;
|
| -
|
| - default:
|
| - NOTREACHED();
|
| - return true;
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace ready_mode {
|
| -
|
| -// Determines the current Ready Mode state. If it is active, attempts to set up
|
| -// prompting. If we cannot set up prompting, attempts to temporarily disable
|
| -// Ready Mode. In the end, if Ready Mode is disabled, pass that information on
|
| -// to the Delegate, so that it may disabled Chrome Frame functionality.
|
| -void Configure(Delegate* chrome_frame, IWebBrowser2* web_browser) {
|
| - // Take ownership of the delegate
|
| - linked_ptr<Delegate> delegate(chrome_frame);
|
| - chrome_frame = NULL;
|
| - BrowserDistribution* dist =
|
| - BrowserDistribution::GetSpecificDistribution(
|
| - BrowserDistribution::CHROME_BINARIES);
|
| -
|
| - RegistryReadyModeState ready_mode_state(
|
| - dist->GetStateKey(),
|
| - base::TimeDelta::FromMinutes(kTemporaryDeclineDurationMinutes),
|
| - NULL); // NULL => no observer required
|
| -
|
| - ReadyModeStatus status = ready_mode_state.GetStatus();
|
| -
|
| - // If the user temporarily declined Chrome Frame, but the timeout has elapsed,
|
| - // attempt to revert to active Ready Mode state.
|
| - if (status == READY_MODE_TEMPORARY_DECLINE_EXPIRED) {
|
| - ready_mode_state.ExpireTemporaryDecline();
|
| - status = ready_mode_state.GetStatus();
|
| - }
|
| -
|
| - // If Ready Mode is active, attempt to set up prompting.
|
| - if (status == READY_MODE_ACTIVE) {
|
| - if (!InstallPrompts(delegate, web_browser)) {
|
| - // Failed to set up prompting. Turn off Ready Mode for now.
|
| - ready_mode_state.TemporarilyDeclineChromeFrame();
|
| - status = ready_mode_state.GetStatus();
|
| - }
|
| - }
|
| -
|
| - // Depending on the state we finally end up in, tell our Delegate to disable
|
| - // Chrome Frame functionality.
|
| - if (ShouldDisableChromeFrame(status))
|
| - delegate->DisableChromeFrame();
|
| -}
|
| -
|
| -} // namespace ready_mode
|
|
|