diff options
author | grt@chromium.org <grt@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-12 18:22:37 +0000 |
---|---|---|
committer | grt@chromium.org <grt@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-12 18:22:37 +0000 |
commit | adb8b22d8dd4e079645f000e009627ec18068de2 (patch) | |
tree | b37115727f52fa66a5c3671768d53febbd39ebc9 /chrome_frame | |
parent | 3ae91a5a47721627154834818abfe0c9201a3e89 (diff) | |
download | chromium_src-adb8b22d8dd4e079645f000e009627ec18068de2.zip chromium_src-adb8b22d8dd4e079645f000e009627ec18068de2.tar.gz chromium_src-adb8b22d8dd4e079645f000e009627ec18068de2.tar.bz2 |
Remove Chrome Frame ready-mode.
BUG=316496
TBR=jcivelli@chromium.org
Review URL: https://codereview.chromium.org/110163004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@240363 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame')
-rw-r--r-- | chrome_frame/chrome_frame.gyp | 10 | ||||
-rw-r--r-- | chrome_frame/ready_mode/internal/ready_mode_state.h | 23 | ||||
-rw-r--r-- | chrome_frame/ready_mode/internal/ready_prompt_content.cc | 103 | ||||
-rw-r--r-- | chrome_frame/ready_mode/internal/ready_prompt_content.h | 41 | ||||
-rw-r--r-- | chrome_frame/ready_mode/internal/ready_prompt_window.cc | 124 | ||||
-rw-r--r-- | chrome_frame/ready_mode/internal/ready_prompt_window.h | 106 | ||||
-rw-r--r-- | chrome_frame/ready_mode/internal/registry_ready_mode_state.cc | 254 | ||||
-rw-r--r-- | chrome_frame/ready_mode/internal/registry_ready_mode_state.h | 90 | ||||
-rw-r--r-- | chrome_frame/ready_mode/ready_mode.cc | 400 | ||||
-rw-r--r-- | chrome_frame/ready_mode/ready_mode.h | 41 | ||||
-rw-r--r-- | chrome_frame/test/ready_mode_unittest.cc | 286 |
11 files changed, 0 insertions, 1478 deletions
diff --git a/chrome_frame/chrome_frame.gyp b/chrome_frame/chrome_frame.gyp index 9b33acb..cd7d278 100644 --- a/chrome_frame/chrome_frame.gyp +++ b/chrome_frame/chrome_frame.gyp @@ -133,7 +133,6 @@ 'test/http_negotiate_unittest.cc', 'test/infobar_unittests.cc', 'test/policy_settings_unittest.cc', - 'test/ready_mode_unittest.cc', 'test/registry_watcher_unittest.cc', 'test/simulate_input.h', 'test/simulate_input.cc', @@ -742,18 +741,9 @@ 'policy_settings.h', 'protocol_sink_wrap.cc', 'protocol_sink_wrap.h', - 'ready_mode/internal/ready_mode_state.h', 'ready_mode/internal/ready_mode_web_browser_adapter.cc', 'ready_mode/internal/ready_mode_web_browser_adapter.h', - 'ready_mode/internal/ready_prompt_content.cc', - 'ready_mode/internal/ready_prompt_content.h', - 'ready_mode/internal/ready_prompt_window.cc', - 'ready_mode/internal/ready_prompt_window.h', - 'ready_mode/internal/registry_ready_mode_state.cc', - 'ready_mode/internal/registry_ready_mode_state.h', 'ready_mode/internal/url_launcher.h', - 'ready_mode/ready_mode.cc', - 'ready_mode/ready_mode.h', 'register_bho.rgs', 'registry_list_preferences_holder.cc', 'registry_list_preferences_holder.h', diff --git a/chrome_frame/ready_mode/internal/ready_mode_state.h b/chrome_frame/ready_mode/internal/ready_mode_state.h deleted file mode 100644 index 625cb08..0000000 --- a/chrome_frame/ready_mode/internal/ready_mode_state.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2010 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_FRAME_READY_MODE_INTERNAL_READY_MODE_STATE_H_ -#define CHROME_FRAME_READY_MODE_INTERNAL_READY_MODE_STATE_H_ - -// Allows the UI element to signal the user's response to a Ready Mode prompt. -class ReadyModeState { - public: - virtual ~ReadyModeState() {} - - // Indicates that the user has temporarily declined the product. - virtual void TemporarilyDeclineChromeFrame() = 0; - - // Indicates that the user has permanently declined the product. - virtual void PermanentlyDeclineChromeFrame() = 0; - - // Indicates that the user has accepted the product. - virtual void AcceptChromeFrame() = 0; -}; // class ReadyModeState - -#endif // CHROME_FRAME_READY_MODE_INTERNAL_READY_MODE_STATE_H_ diff --git a/chrome_frame/ready_mode/internal/ready_prompt_content.cc b/chrome_frame/ready_mode/internal/ready_prompt_content.cc deleted file mode 100644 index 52ab70f..0000000 --- a/chrome_frame/ready_mode/internal/ready_prompt_content.cc +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2010 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/internal/ready_prompt_content.h" - -#include "base/logging.h" -#include "chrome_frame/ready_mode/internal/ready_mode_state.h" -#include "chrome_frame/ready_mode/internal/ready_prompt_window.h" -#include "chrome_frame/ready_mode/internal/url_launcher.h" - -ReadyPromptContent::ReadyPromptContent(ReadyModeState* ready_mode_state, - UrlLauncher* url_launcher) - : ready_mode_state_(ready_mode_state), - url_launcher_(url_launcher) { -} - -ReadyPromptContent::~ReadyPromptContent() { - if (window_ != NULL && window_->IsWindow()) { - // The window must discard its ContentFrame pointer at this time. - window_->DestroyWindow(); - window_.reset(); - } -} - -bool ReadyPromptContent::InstallInFrame(Frame* frame) { - DCHECK(window_ == NULL); - DCHECK(ready_mode_state_ != NULL); - DCHECK(url_launcher_ != NULL); - - // Pass ownership of our ready_mode_state_ and url_launcher_ to the window. - window_ = ReadyPromptWindow::CreateInstance( - frame, ready_mode_state_.release(), url_launcher_.release()); - - return window_ != NULL; -} - -void ReadyPromptContent::SetDimensions(const RECT& dimensions) { - if (window_ != NULL && window_->IsWindow()) { - window_->SetWindowPos(HWND_TOP, &dimensions, - ::IsRectEmpty(&dimensions) ? SWP_HIDEWINDOW : - SWP_SHOWWINDOW); - } -} - -bool GetDialogTemplateDimensions(ReadyPromptWindow* window, RECT* dimensions) { - HRSRC resource = ::FindResource(_AtlBaseModule.GetResourceInstance(), - MAKEINTRESOURCE(ReadyPromptWindow::IDD), - RT_DIALOG); - - HGLOBAL handle = NULL; - DLGTEMPLATE* dlgtemplate = NULL; - _DialogSplitHelper::DLGTEMPLATEEX* dlgtemplateex = NULL; - - if (resource == NULL) { - DPLOG(ERROR) << "Failed to find resource for ReadyPromptWindow::IDD"; - return false; - } - - handle = ::LoadResource(_AtlBaseModule.GetResourceInstance(), resource); - - if (handle == NULL) { - DPLOG(ERROR) << "Failed to load resource for ReadyPromptWindow::IDD"; - return false; - } - - dlgtemplate = reinterpret_cast<DLGTEMPLATE*>(::LockResource(handle)); - if (dlgtemplate == NULL) { - DPLOG(ERROR) << "Failed to lock resource for ReadyPromptWindow::IDD"; - return false; - } - - if (!_DialogSplitHelper::IsDialogEx(dlgtemplate)) { - DLOG(ERROR) << "Resource ReadyPromptWindow::IDD is not a DLGTEMPLATEEX"; - return false; - } - - dlgtemplateex = - reinterpret_cast<_DialogSplitHelper::DLGTEMPLATEEX*>(dlgtemplate); - - RECT dlgdimensions = {0, 0, dlgtemplateex->cx, dlgtemplateex->cy}; - if (!window->MapDialogRect(&dlgdimensions)) { - DPLOG(ERROR) << "Failure in MapDialogRect"; - return false; - } - - *dimensions = dlgdimensions; - return true; -} - -size_t ReadyPromptContent::GetDesiredSize(size_t width, size_t height) { - DCHECK(window_ != NULL && window_->IsWindow()); - - if (window_ == NULL || !window_->IsWindow()) { - return 0; - } - RECT dialog_dimensions = {0, 0, 0, 0}; - - if (GetDialogTemplateDimensions(window_.get(), &dialog_dimensions)) - return width == 0 ? dialog_dimensions.right : dialog_dimensions.bottom; - else - return width == 0 ? 0 : 39; -} diff --git a/chrome_frame/ready_mode/internal/ready_prompt_content.h b/chrome_frame/ready_mode/internal/ready_prompt_content.h deleted file mode 100644 index 7593c6c..0000000 --- a/chrome_frame/ready_mode/internal/ready_prompt_content.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2011 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_FRAME_READY_MODE_INTERNAL_READY_PROMPT_CONTENT_H_ -#define CHROME_FRAME_READY_MODE_INTERNAL_READY_PROMPT_CONTENT_H_ - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "chrome_frame/infobars/infobar_content.h" - -class ReadyModeState; -class ReadyPromptWindow; -class UrlLauncher; - -// Encapsulates the Ready Mode prompt inviting users to permanently activate -// Chrome Frame, temporarily disable Ready Mode, or permanently disable Ready -// Mode. -class ReadyPromptContent : public InfobarContent { - public: - // Takes ownership of the ReadyModeState and UrlLauncher instances, which - // will be freed upon destruction of the ReadyPromptContent. - ReadyPromptContent(ReadyModeState* ready_mode_state, - UrlLauncher* url_launcher); - virtual ~ReadyPromptContent(); - - // InfobarContent implementation - virtual bool InstallInFrame(Frame* frame); - virtual void SetDimensions(const RECT& dimensions); - virtual size_t GetDesiredSize(size_t width, size_t height); - - private: - base::WeakPtr<ReadyPromptWindow> window_; - scoped_ptr<ReadyModeState> ready_mode_state_; - scoped_ptr<UrlLauncher> url_launcher_; - - DISALLOW_COPY_AND_ASSIGN(ReadyPromptContent); -}; // class ReadyPromptContent - -#endif // CHROME_FRAME_READY_MODE_INTERNAL_READY_PROMPT_CONTENT_H_ diff --git a/chrome_frame/ready_mode/internal/ready_prompt_window.cc b/chrome_frame/ready_mode/internal/ready_prompt_window.cc deleted file mode 100644 index 7cb13214..0000000 --- a/chrome_frame/ready_mode/internal/ready_prompt_window.cc +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2010 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/internal/ready_prompt_window.h" - -#include <atlctrls.h> -#include <Shellapi.h> - -#include "base/compiler_specific.h" -#include "base/win/scoped_bstr.h" -#include "base/win/scoped_comptr.h" -#include "chrome_frame/ready_mode/internal/ready_mode_state.h" -#include "chrome_frame/ready_mode/internal/url_launcher.h" -#include "chrome_frame/simple_resource_loader.h" -#include "grit/chrome_frame_dialogs.h" -#include "grit/chromium_strings.h" - -// atlctrlx.h requires 'min' and 'max' macros, the definition of which conflicts -// with STL headers. Hence we include them out of the order defined by style -// guidelines. As a result you may not refer to std::min or std::max in this -// file. -#include <minmax.h> // NOLINT -#include <atlctrlx.h> // NOLINT - -ReadyPromptWindow::ReadyPromptWindow( - InfobarContent::Frame* frame, ReadyModeState* ready_mode_state, - UrlLauncher* url_launcher) - : frame_(frame), - ready_mode_state_(ready_mode_state), - url_launcher_(url_launcher), - icon_(NULL), - weak_ptr_factory_(this) { -} -ReadyPromptWindow::~ReadyPromptWindow() { - if (icon_) - ::DestroyIcon(icon_); -} - -base::WeakPtr<ReadyPromptWindow> ReadyPromptWindow::CreateInstance( - InfobarContent::Frame* frame, ReadyModeState* ready_mode_state, - UrlLauncher* url_launcher) { - DCHECK(frame != NULL); - DCHECK(ready_mode_state != NULL); - DCHECK(url_launcher != NULL); - - base::WeakPtr<ReadyPromptWindow> instance((new ReadyPromptWindow( - frame, ready_mode_state, url_launcher))->weak_ptr_factory_.GetWeakPtr()); - - DCHECK(!instance->IsWindow()); - - if (instance->Create(frame->GetFrameWindow()) == NULL) { - DPLOG(ERROR) << "Failed to create HWND for ReadyPromptWindow."; - return base::WeakPtr<ReadyPromptWindow>(); - } - - // Subclass the "Learn more." text to make it behave like a link. Clicks are - // routed to OnLearnMore(). - CWindow rte = instance->GetDlgItem(IDC_PROMPT_LINK); - instance->link_.reset(new CHyperLink()); - instance->link_->SubclassWindow(rte); - instance->link_->SetHyperLinkExtendedStyle(HLINK_NOTIFYBUTTON, - HLINK_NOTIFYBUTTON); - - CStatic icon_control(instance->GetDlgItem(IDC_PROMPT_ICON)); - - instance->icon_ = static_cast<HICON>( - ::LoadImage(_AtlBaseModule.GetResourceInstance(), - MAKEINTRESOURCE(IDI_CHROME_FRAME_ICON), - IMAGE_ICON, 16, 16, 0)); - - if (instance->icon_) - icon_control.SetIcon(instance->icon_); - - return instance; -} - -void ReadyPromptWindow::OnDestroy() { - frame_ = NULL; -} - -BOOL ReadyPromptWindow::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) { - DlgResize_Init(false); // false => 'no gripper' - return TRUE; -} - -LRESULT ReadyPromptWindow::OnYes(WORD /*wNotifyCode*/, - WORD /*wID*/, - HWND /*hWndCtl*/, - BOOL& /*bHandled*/) { - frame_->CloseInfobar(); - ready_mode_state_->AcceptChromeFrame(); - return 0; -} - -LRESULT ReadyPromptWindow::OnRemindMeLater(WORD /*wNotifyCode*/, - WORD /*wID*/, - HWND /*hWndCtl*/, - BOOL& /*bHandled*/) { - frame_->CloseInfobar(); - ready_mode_state_->TemporarilyDeclineChromeFrame(); - return 0; -} - -LRESULT ReadyPromptWindow::OnNo(WORD /*wNotifyCode*/, - WORD /*wID*/, - HWND /*hWndCtl*/, - BOOL& /*bHandled*/) { - frame_->CloseInfobar(); - ready_mode_state_->PermanentlyDeclineChromeFrame(); - return 0; -} - -LRESULT ReadyPromptWindow::OnLearnMore(WORD /*wParam*/, - LPNMHDR /*lParam*/, - BOOL& /*bHandled*/) { - url_launcher_->LaunchUrl(SimpleResourceLoader::Get( - IDS_CHROME_FRAME_READY_MODE_LEARN_MORE_URL)); - return 0; -} - -void ReadyPromptWindow::OnFinalMessage(HWND) { - delete this; -} diff --git a/chrome_frame/ready_mode/internal/ready_prompt_window.h b/chrome_frame/ready_mode/internal/ready_prompt_window.h deleted file mode 100644 index 1673371..0000000 --- a/chrome_frame/ready_mode/internal/ready_prompt_window.h +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) 2011 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_FRAME_READY_MODE_INTERNAL_READY_PROMPT_WINDOW_H_ -#define CHROME_FRAME_READY_MODE_INTERNAL_READY_PROMPT_WINDOW_H_ - -#include <atlbase.h> -#include <atlapp.h> -#include <atlcrack.h> -#include <atlframe.h> -#include <atlwin.h> - -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "base/win/scoped_comptr.h" -#include "chrome_frame/infobars/infobar_content.h" -#include "chrome_frame/resource.h" -#include "grit/chrome_frame_dialogs.h" - -class ReadyModeState; -class UrlLauncher; - -namespace WTL { -class CHyperLink; -} // namespace WTL - -// Implements a dialog with text and buttons inviting the user to permanently -// activate the product or temporarily/permanently disable Ready Mode. -class ReadyPromptWindow - : public CDialogImpl<ReadyPromptWindow, CWindow>, - public CDialogResize<ReadyPromptWindow> { - public: - enum { IDD = IDD_CHROME_FRAME_READY_PROMPT }; - - // Creates and initializes a dialog for display in the provided frame. The - // ReadyModeState will be invoked to capture the user's response, if any. - // The UrlLauncher may be used to launch a new tab containing a - // knowledge-base article about Ready Mode. - // - // Upon success, takes ownership of itself (to be deleted upon WM_DESTROY) and - // returns a weak pointer to this dialog. Upon failure, returns a null weak - // pointer and deletes self. - // - // In either case, takes ownership of the ReadyModeState and UrlLauncher, but - // not the frame. - static base::WeakPtr<ReadyPromptWindow> CreateInstance( - InfobarContent::Frame* frame, - ReadyModeState* ready_mode_state, - UrlLauncher* url_launcher); - - BEGIN_MSG_MAP(InfobarWindow) - MSG_WM_INITDIALOG(OnInitDialog) - MSG_WM_DESTROY(OnDestroy) - NOTIFY_HANDLER(IDC_PROMPT_LINK, NM_CLICK, OnLearnMore) - COMMAND_HANDLER(IDACTIVATE, BN_CLICKED, OnYes) - COMMAND_HANDLER(IDNEVER, BN_CLICKED, OnNo) - CHAIN_MSG_MAP(CDialogResize<ReadyPromptWindow>) - END_MSG_MAP() - - BEGIN_DLGRESIZE_MAP(InfobarWindow) - DLGRESIZE_CONTROL(IDACTIVATE, DLSZ_CENTER_Y | DLSZ_MOVE_X) - DLGRESIZE_CONTROL(IDNEVER, DLSZ_CENTER_Y | DLSZ_MOVE_X) - DLGRESIZE_CONTROL(IDC_PROMPT_MESSAGE, DLSZ_SIZE_Y | DLSZ_SIZE_X) - DLGRESIZE_CONTROL(IDC_PROMPT_LINK, DLSZ_CENTER_Y | DLSZ_MOVE_X) - END_DLGRESIZE_MAP() - - virtual void OnFinalMessage(HWND); - - private: - // Call CreateInstance() to get an initialized ReadyPromptWindow. - ReadyPromptWindow(InfobarContent::Frame* frame, - ReadyModeState* ready_mode_state, - UrlLauncher* url_launcher); - - // The ReadyPromptWindow manages its own destruction. - virtual ~ReadyPromptWindow(); - - // Event handlers. - void OnDestroy(); - BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam); - LRESULT OnYes(WORD wNotifyCode, - WORD wID, - HWND hWndCtl, - BOOL& bHandled); - LRESULT OnRemindMeLater(WORD wNotifyCode, - WORD wID, - HWND hWndCtl, - BOOL& bHandled); - LRESULT OnLearnMore(WORD wParam, LPNMHDR lParam, BOOL& bHandled); // NOLINT - LRESULT OnNo(WORD wNotifyCode, - WORD wID, - HWND hWndCtl, - BOOL& bHandled); - - InfobarContent::Frame* frame_; // Not owned by this instance - scoped_ptr<ReadyModeState> ready_mode_state_; - scoped_ptr<WTL::CHyperLink> link_; - scoped_ptr<UrlLauncher> url_launcher_; - - HICON icon_; - base::WeakPtrFactory<ReadyPromptWindow> weak_ptr_factory_; - DISALLOW_COPY_AND_ASSIGN(ReadyPromptWindow); -}; // class ReadyPromptWindow - -#endif // CHROME_FRAME_READY_MODE_INTERNAL_READY_PROMPT_WINDOW_H_ diff --git a/chrome_frame/ready_mode/internal/registry_ready_mode_state.cc b/chrome_frame/ready_mode/internal/registry_ready_mode_state.cc deleted file mode 100644 index bb1dedc..0000000 --- a/chrome_frame/ready_mode/internal/registry_ready_mode_state.cc +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright (c) 2011 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/internal/registry_ready_mode_state.h" - -#include <windows.h> - -#include "base/logging.h" -#include "base/process/launch.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "base/time/time.h" -#include "base/win/registry.h" -#include "base/win/scoped_comptr.h" -#include "base/win/scoped_handle.h" -#include "base/win/windows_version.h" -#include "chrome/installer/util/browser_distribution.h" -#include "chrome/installer/util/google_update_constants.h" -#include "chrome/installer/util/master_preferences.h" -#include "chrome/installer/util/util_constants.h" -#include "chrome_frame/chrome_launcher_utils.h" -#include "chrome_frame/ready_mode/ready_mode.h" - -namespace { - -// Looks up a command entry in the registry and attempts to execute it directly. -// Returns the new process handle, which the caller is responsible for closing, -// or NULL upon failure. -HANDLE LaunchCommandDirectly(const std::wstring& command_field) { - BrowserDistribution* dist = BrowserDistribution::GetDistribution(); - std::wstring version_key_name(dist->GetVersionKey()); - - HKEY roots[] = {HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE}; - - for (int i = 0; i < arraysize(roots); i++) { - base::win::RegKey version_key; - if (version_key.Open(roots[i], version_key_name.c_str(), - KEY_QUERY_VALUE) == ERROR_SUCCESS) { - std::wstring command_line; - if (version_key.ReadValue(command_field.c_str(), - &command_line) == ERROR_SUCCESS) { - base::win::ScopedHandle launched_process; - base::LaunchOptions options; - options.start_hidden = true; - if (base::LaunchProcess(command_line, options, &launched_process)) { - return launched_process.Take(); - } - } - } - } - return NULL; -} - -// Attempts to launch a command using the ProcessLauncher. Returns a handle to -// the launched process, which the caller is responsible for closing, or NULL -// upon failure. -HANDLE LaunchCommandViaProcessLauncher(const std::wstring& command_field) { - HANDLE launched_process = NULL; - - scoped_ptr<CommandLine> command_line; - if (chrome_launcher::CreateUpdateCommandLine(command_field, &command_line)) { - DCHECK(command_line != NULL); - base::LaunchOptions options; - options.start_hidden = true; - base::LaunchProcess(*command_line, options, &launched_process); - } - - return launched_process; -} - -// Waits for the provided process to exit, and verifies that its exit code -// corresponds to one of the known "success" codes for the installer. If the -// exit code cannot be retrieved, or if it signals failure, returns false. -bool CheckProcessExitCode(HANDLE handle) { - // TODO(erikwright): Use RegisterWaitForSingleObject to wait - // asynchronously. - DWORD wait_result = WaitForSingleObject(handle, 5000); // (ms) - - if (wait_result == WAIT_OBJECT_0) { - DWORD exit_code = 0; - if (!::GetExitCodeProcess(handle, &exit_code)) { - DPLOG(ERROR) << "GetExitCodeProcess failed."; - return false; - } - - // These are the only two success codes returned by the installer. - // All other codes are errors. - if (exit_code != 0 && exit_code != installer::UNINSTALL_REQUIRES_REBOOT) { - DLOG(ERROR) << "Process failed with exit code " << exit_code << "."; - return false; - } - - return true; - } - - if (wait_result == WAIT_FAILED) - DPLOG(ERROR) << "Error while waiting for elevated child process."; - - if (wait_result == WAIT_ABANDONED) - DLOG(ERROR) << "Unexpeced WAIT_ABANDONED while waiting on child process."; - - if (wait_result == WAIT_TIMEOUT) - DLOG(ERROR) << "Timeout while waiting on child process."; - - return false; -} - -// If we are running on XP (no protected mode) or in a high-integrity process, -// we can invoke the installer directly. If not, we will have to go via the -// ProcessLauncher. -bool CanLaunchDirectly() { - if (base::win::GetVersion() < base::win::VERSION_VISTA) - return true; - - base::IntegrityLevel integrity_level = base::INTEGRITY_UNKNOWN; - if (!base::GetProcessIntegrityLevel(base::GetCurrentProcessHandle(), - &integrity_level)) { - DLOG(ERROR) << "Failed to determine process integrity level."; - return false; - } - - return integrity_level == base::HIGH_INTEGRITY; -} - -// Attempts to launch the specified command either directly or via the -// ProcessLauncher. Returns true if the command is launched and returns a -// success code. -bool LaunchAndCheckCommand(const std::wstring& command_field) { - base::win::ScopedHandle handle; - - if (CanLaunchDirectly()) - handle.Set(LaunchCommandDirectly(command_field)); - else - handle.Set(LaunchCommandViaProcessLauncher(command_field)); - - if (handle.IsValid() && CheckProcessExitCode(handle)) - return true; - - DLOG(ERROR) << "Command " << command_field << " could not be launched."; - return false; -} - -} // namespace - -RegistryReadyModeState::RegistryReadyModeState( - const std::wstring& key_name, base::TimeDelta temporary_decline_duration, - Observer* observer) - : key_name_(key_name), - temporary_decline_duration_(temporary_decline_duration), - observer_(observer) { -} - -RegistryReadyModeState::~RegistryReadyModeState() { -} - -base::Time RegistryReadyModeState::GetNow() { - return base::Time::Now(); -} - -ReadyModeStatus RegistryReadyModeState::GetStatus() { - bool exists = false; - int64 value = 0; - - if (!GetStateFromRegistry(&value, &exists)) - return READY_MODE_ACTIVE; - - if (!exists) - return READY_MODE_ACCEPTED; - - if (value == 0) - return READY_MODE_PERMANENTLY_DECLINED; - - if (value == 1) - return READY_MODE_ACTIVE; - - base::Time when_declined(base::Time::FromInternalValue(value)); - base::Time now(GetNow()); - - // If the decline duration has passed, or is further in the future than - // the total timeout, consider it expired. - bool expired = (now - when_declined) > temporary_decline_duration_ || - (when_declined - now) > temporary_decline_duration_; - - if (expired) - return READY_MODE_TEMPORARY_DECLINE_EXPIRED; - else - return READY_MODE_TEMPORARILY_DECLINED; -} - -void RegistryReadyModeState::NotifyObserver() { - if (observer_ != NULL) - observer_->OnStateChange(GetStatus()); -} - -bool RegistryReadyModeState::GetStateFromRegistry(int64* value, bool* exists) { - *exists = false; - *value = 0; - - HKEY roots[] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE }; - LONG result = ERROR_SUCCESS; - for (int i = 0; i < arraysize(roots); i++) { - base::win::RegKey config_key; - result = config_key.Open(roots[i], key_name_.c_str(), KEY_QUERY_VALUE); - if (result == ERROR_SUCCESS) { - result = config_key.ReadInt64(installer::kChromeFrameReadyModeField, - value); - if (result == ERROR_SUCCESS) { - *exists = true; - return true; - } - if (result != ERROR_FILE_NOT_FOUND) { - DLOG(ERROR) << "Failed to read from registry key " << key_name_ - << " and value " << installer::kChromeFrameReadyModeField - << " error: " << result; - return false; - } - } - } - - return true; -} - -void RegistryReadyModeState::RefreshStateAndNotify() { - HRESULT hr = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT_REFRESH, - NULL, 0, 0); - if (FAILED(hr)) { - DLOG(ERROR) << "Failed to refresh user agent string from registry. " - << "UrlMkSetSessionOption returned " - << base::StringPrintf("0x%08x", hr); - } else { - NotifyObserver(); - } -} - -void RegistryReadyModeState::ExpireTemporaryDecline() { - if (LaunchAndCheckCommand(google_update::kRegCFEndTempOptOutCmdField)) - RefreshStateAndNotify(); -} - -void RegistryReadyModeState::TemporarilyDeclineChromeFrame() { - if (LaunchAndCheckCommand(google_update::kRegCFTempOptOutCmdField)) - RefreshStateAndNotify(); -} - -void RegistryReadyModeState::PermanentlyDeclineChromeFrame() { - if (LaunchAndCheckCommand(google_update::kRegCFOptOutCmdField)) - RefreshStateAndNotify(); -} - -void RegistryReadyModeState::AcceptChromeFrame() { - if (LaunchAndCheckCommand(google_update::kRegCFOptInCmdField)) - NotifyObserver(); -} diff --git a/chrome_frame/ready_mode/internal/registry_ready_mode_state.h b/chrome_frame/ready_mode/internal/registry_ready_mode_state.h deleted file mode 100644 index a125b68..0000000 --- a/chrome_frame/ready_mode/internal/registry_ready_mode_state.h +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2011 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_FRAME_READY_MODE_INTERNAL_REGISTRY_READY_MODE_STATE_H_ -#define CHROME_FRAME_READY_MODE_INTERNAL_REGISTRY_READY_MODE_STATE_H_ - -#include <string> - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/time/time.h" -#include "chrome_frame/ready_mode/internal/ready_mode_state.h" - -// Defines the possible Ready Mode states. -enum ReadyModeStatus { - // Chrome Frame is permanently disabled and should be uninstalled. - READY_MODE_PERMANENTLY_DECLINED, - // Chrome Frame is temporarily disabled. - READY_MODE_TEMPORARILY_DECLINED, - // Chrome Frame is disabled, but should be enabled by calling - // ExpireTemporaryDecline(). - READY_MODE_TEMPORARY_DECLINE_EXPIRED, - // Chrome Frame is enabled, but not permanently (the user should be prompted). - READY_MODE_ACTIVE, - // Chrome Frame is permanently enabled. - READY_MODE_ACCEPTED -}; - -// Implements ReadyModeState, reading state from the Registry and delegating -// to the installer to effect state changes. -// -// If the current process is running at high integrity the installer is -// launched directly. Otherwise, it is launched by invoking a helper exe -// (chrome_launcher) at medium integrity (thanks to an elevation policy) that, -// in turn, delegates to Omaha's ProcessLauncher to reach high integrity. -class RegistryReadyModeState : public ReadyModeState { - public: - // Receives notification when the Ready Mode state changes in response to a - // user interaction. Does not receive notification when a temporary decline of - // Ready Mode expires. - class Observer { - public: - virtual ~Observer() {} - // Indicates that a state change has occurred, passing the new status. - virtual void OnStateChange(ReadyModeStatus status) = 0; - }; - - // Constructs an instance backed by the specified key (pre-existing under - // HKCU or HKLM). The provided duration indicates how long, after a temporary - // decline, Ready Mode re-activates. - // - // Takes ownership of the Observer instance, which may be null if the client - // does not need to be notified of changes. - RegistryReadyModeState(const std::wstring& key_name, - base::TimeDelta temporary_decline_duration, - Observer* observer); - virtual ~RegistryReadyModeState(); - - // Returns the current Ready Mode status. - ReadyModeStatus GetStatus(); - - // Transitions from temporarily declined to active Ready Mode. - void ExpireTemporaryDecline(); - - // ReadyModeState implementation - virtual void TemporarilyDeclineChromeFrame(); - virtual void PermanentlyDeclineChromeFrame(); - virtual void AcceptChromeFrame(); - - protected: - // Allows dependency replacement via derivation for tests. - virtual base::Time GetNow(); - - private: - // Sends the result of GetStatus() to our observer. - void NotifyObserver(); - // Retrieves state from the registry. Returns true upon success. - bool GetStateFromRegistry(int64* value, bool* exists); - // Refreshes the process state after mutating installation state. - void RefreshStateAndNotify(); - - base::TimeDelta temporary_decline_duration_; - std::wstring key_name_; - scoped_ptr<Observer> observer_; - - DISALLOW_COPY_AND_ASSIGN(RegistryReadyModeState); -}; - -#endif // CHROME_FRAME_READY_MODE_INTERNAL_REGISTRY_READY_MODE_STATE_H_ diff --git a/chrome_frame/ready_mode/ready_mode.cc b/chrome_frame/ready_mode/ready_mode.cc deleted file mode 100644 index 1285329..0000000 --- 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 diff --git a/chrome_frame/ready_mode/ready_mode.h b/chrome_frame/ready_mode/ready_mode.h deleted file mode 100644 index 007beeb..0000000 --- a/chrome_frame/ready_mode/ready_mode.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2011 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_FRAME_READY_MODE_READY_MODE_H_ -#define CHROME_FRAME_READY_MODE_READY_MODE_H_ - -#include <atlbase.h> -#include <atlcom.h> - -#include "base/basictypes.h" - -interface IWebBrowser2; - -// Integrates Ready Mode functionality with a specified IWebBrowser2 instance. -// Displays prompts allowing the user to permanently activate, permanently -// disable, or temporarily disable Chrome Frame whenever a Chrome Frame-enabled -// site is rendered in the browser. -namespace ready_mode { - -// Defines an interface for disabling Chrome Frame based on user interaction -// with Ready Mode. -class Delegate { - public: - virtual ~Delegate() {} - - // Disables Chrome Frame functionality in the current process. Will be - // called after the installer has been invoked to manipulate the system or - // user-level state. - virtual void DisableChromeFrame() = 0; -}; // class Delegate - -// Enables Ready Mode for the specified IWebBrowser2 instance, if Chrome Frame -// is currently in Ready Mode. If Chrome Frame is temporarily or permanently -// declined, will invoke chrome_frame->DisableChromeFrame() to synchronize the -// process state with the system- / user-level state. -void Configure(Delegate* chrome_frame, IWebBrowser2* web_browser); - -}; // namespace ready_mode - -#endif // CHROME_FRAME_READY_MODE_READY_MODE_H_ diff --git a/chrome_frame/test/ready_mode_unittest.cc b/chrome_frame/test/ready_mode_unittest.cc deleted file mode 100644 index 6a508a2..0000000 --- a/chrome_frame/test/ready_mode_unittest.cc +++ /dev/null @@ -1,286 +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 <atlbase.h> -#include <atlapp.h> -#include <atlmisc.h> -#include <atlwin.h> - -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/gmock/include/gmock/gmock.h" - -#include "base/logging.h" -#include "base/memory/scoped_ptr.h" -#include "base/win/registry.h" -#include "chrome_frame/infobars/infobar_content.h" -#include "chrome_frame/ready_mode/internal/ready_mode_state.h" -#include "chrome_frame/ready_mode/internal/ready_prompt_content.h" -#include "chrome_frame/ready_mode/internal/ready_prompt_window.h" -#include "chrome_frame/ready_mode/internal/registry_ready_mode_state.h" -#include "chrome_frame/ready_mode/internal/url_launcher.h" -#include "chrome_frame/simple_resource_loader.h" -#include "chrome_frame/test/chrome_frame_test_utils.h" - -namespace { - -class SetResourceInstance { - public: - SetResourceInstance() : res_dll_(NULL), old_res_dll_(NULL) { - SimpleResourceLoader* loader_instance = SimpleResourceLoader::GetInstance(); - EXPECT_TRUE(loader_instance != NULL); - if (loader_instance != NULL) { - res_dll_ = loader_instance->GetResourceModuleHandle(); - EXPECT_TRUE(res_dll_ != NULL); - if (res_dll_ != NULL) { - old_res_dll_ = ATL::_AtlBaseModule.SetResourceInstance(res_dll_); - } - } - } - - ~SetResourceInstance() { - if (old_res_dll_ != NULL) { - CHECK_EQ(res_dll_, ATL::_AtlBaseModule.SetResourceInstance(old_res_dll_)); - } - } - - private: - HMODULE res_dll_; - HMODULE old_res_dll_; -}; // class SetResourceInstance - -class SimpleWindow : public CWindowImpl<SimpleWindow, - CWindow, - CFrameWinTraits> { - public: - virtual ~SimpleWindow() { - if (IsWindow()) - DestroyWindow(); - } - - static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM l_param) { - HWND* out = reinterpret_cast<HWND*>(l_param); - EXPECT_TRUE(out != NULL); - - if (out == NULL) - return FALSE; - - EXPECT_TRUE(*out == NULL || ::IsChild(*out, hwnd)); - - if (*out == NULL) - *out = hwnd; - - return TRUE; - } - - HWND GetZeroOrOneChildWindows() { - HWND child = NULL; - EnumChildWindows(m_hWnd, EnumChildProc, reinterpret_cast<LPARAM>(&child)); - return child; - } - - BEGIN_MSG_MAP(SimpleWindow) - END_MSG_MAP() -}; // class SimpleWindow - -class MockInfobarContentFrame : public InfobarContent::Frame { - public: - // InfobarContent::Frame implementation - MOCK_METHOD0(GetFrameWindow, HWND(void)); - MOCK_METHOD0(CloseInfobar, void(void)); -}; // class Frame - -class MockReadyModeState : public ReadyModeState { - public: - // ReadyModeState implementation - MOCK_METHOD0(TemporarilyDeclineChromeFrame, void(void)); - MOCK_METHOD0(PermanentlyDeclineChromeFrame, void(void)); - MOCK_METHOD0(AcceptChromeFrame, void(void)); -}; // class MockReadyModeState - -class MockUrlLauncher : public UrlLauncher { - public: - // UrlLauncher implementation - MOCK_METHOD1(LaunchUrl, void(const std::wstring& url)); -}; // class MockUrlLauncher - -} // namespace - -class ReadyPromptTest : public testing::Test { - public: - ReadyPromptTest() : hwnd_(NULL) {} - - void SetUp() { - hwnd_ = window_.Create(NULL); - EXPECT_TRUE(hwnd_ != NULL); - window_.ShowWindow(SW_SHOW); - EXPECT_TRUE(window_.IsWindowVisible()); - EXPECT_CALL(frame_, GetFrameWindow()).Times(testing::AnyNumber()) - .WillRepeatedly(testing::Return(hwnd_)); - } - - protected: - SimpleWindow window_; - HWND hwnd_; - MockInfobarContentFrame frame_; - SetResourceInstance set_resource_instance_; -}; // class ReadyPromptTest - -class ReadyPromptWindowTest : public ReadyPromptTest { - public: - void SetUp() { - ReadyPromptTest::SetUp(); - - // owned by ReadyPromptWindow - state_ = new MockReadyModeState(); - url_launcher_ = new MockUrlLauncher(); - - ready_prompt_window_ = ReadyPromptWindow::CreateInstance( - &frame_, state_, url_launcher_); - - ASSERT_TRUE(ready_prompt_window_ != NULL); - RECT position = {0, 0, 800, 39}; - ASSERT_TRUE(ready_prompt_window_->SetWindowPos(HWND_TOP, &position, - SWP_SHOWWINDOW)); - } - - protected: - MockReadyModeState* state_; - MockUrlLauncher* url_launcher_; - base::WeakPtr<ReadyPromptWindow> ready_prompt_window_; -}; // class ReadyPromptWindowTest - -class ReadyPromptWindowButtonTest : public ReadyPromptWindowTest { - public: - void TearDown() { - ASSERT_TRUE(ready_prompt_window_ != NULL); - ASSERT_TRUE(ready_prompt_window_->DestroyWindow()); - ASSERT_TRUE(ready_prompt_window_ == NULL); - ASSERT_FALSE(message_loop_.WasTimedOut()); - - ReadyPromptWindowTest::TearDown(); - } - - protected: - struct ClickOnCaptionData { - const wchar_t* target_caption; - bool found; - }; // struct ClickOnCaptionData - - static BOOL CALLBACK ClickOnCaptionProc(HWND hwnd, LPARAM l_param) { - wchar_t window_caption[256] = {0}; - size_t buffer_length = arraysize(window_caption); - - ClickOnCaptionData* data = reinterpret_cast<ClickOnCaptionData*>(l_param); - EXPECT_TRUE(data->target_caption != NULL); - - if (data->target_caption == NULL) - return FALSE; - - if (wcsnlen(data->target_caption, buffer_length + 1) == buffer_length + 1) - return FALSE; - - if (::GetWindowText(hwnd, window_caption, buffer_length) == - static_cast<int>(buffer_length)) { - return TRUE; - } - - if (wcscmp(data->target_caption, window_caption) == 0) { - EXPECT_FALSE(data->found); - - CRect client_rect; - EXPECT_TRUE(::GetClientRect(hwnd, client_rect)); - - CPoint center_point(client_rect.CenterPoint()); - LPARAM coordinates = (center_point.y << 16) | center_point.x; - - ::PostMessage(hwnd, WM_LBUTTONDOWN, 0, coordinates); - ::PostMessage(hwnd, WM_LBUTTONUP, 0, coordinates); - - data->found = true; - } - - return TRUE; - } - - bool ClickOnCaption(const std::wstring& caption) { - ClickOnCaptionData data = {caption.c_str(), false}; - - ::EnumChildWindows(hwnd_, ClickOnCaptionProc, - reinterpret_cast<LPARAM>(&data)); - return data.found; - } - - void RunUntilCloseInfobar() { - EXPECT_CALL(frame_, CloseInfobar()).WillOnce(QUIT_LOOP(message_loop_)); - ASSERT_NO_FATAL_FAILURE(message_loop_.RunFor( - base::TimeDelta::FromSeconds(5))); - } - - chrome_frame_test::TimedMsgLoop message_loop_; -}; // class ReadyPromptWindowButtonTest - -TEST_F(ReadyPromptTest, ReadyPromptContentTest) { - // owned by ReadyPromptContent - MockReadyModeState* state = new MockReadyModeState(); - MockUrlLauncher* url_launcher = new MockUrlLauncher(); - - scoped_ptr<ReadyPromptContent> content_(new ReadyPromptContent(state, - url_launcher)); - - content_->InstallInFrame(&frame_); - - // Ensure that, if a child is created, it is not visible yet. - HWND child_hwnd = window_.GetZeroOrOneChildWindows(); - if (child_hwnd != NULL) { - CWindow child(child_hwnd); - RECT child_dimensions; - EXPECT_TRUE(child.GetClientRect(&child_dimensions)); - EXPECT_FALSE(child.IsWindowVisible() && !::IsRectEmpty(&child_dimensions)); - } - - int desired_height = content_->GetDesiredSize(400, 0); - EXPECT_GT(desired_height, 0); - RECT dimensions = {10, 15, 410, 20}; - content_->SetDimensions(dimensions); - - child_hwnd = window_.GetZeroOrOneChildWindows(); - EXPECT_TRUE(child_hwnd != NULL); - - if (child_hwnd != NULL) { - CWindow child(child_hwnd); - EXPECT_TRUE(child.IsWindowVisible()); - RECT child_dimensions; - EXPECT_TRUE(child.GetWindowRect(&child_dimensions)); - EXPECT_TRUE(window_.ScreenToClient(&child_dimensions)); - EXPECT_TRUE(::EqualRect(&child_dimensions, &dimensions)); - } - - // Being visible doesn't change the desired height - EXPECT_EQ(desired_height, content_->GetDesiredSize(400, 0)); - - content_.reset(); - - EXPECT_TRUE(window_.GetZeroOrOneChildWindows() == NULL); -} - -TEST_F(ReadyPromptWindowTest, Destroy) { - // Should delete associated mocks, not invoke on ReadyModeState - ready_prompt_window_->DestroyWindow(); -} - -TEST_F(ReadyPromptWindowButtonTest, ClickEnable) { - EXPECT_CALL(*state_, AcceptChromeFrame()); - ASSERT_TRUE(ClickOnCaption(L"Enable")); - RunUntilCloseInfobar(); -} - -TEST_F(ReadyPromptWindowButtonTest, ClickIgnore) { - EXPECT_CALL(*state_, PermanentlyDeclineChromeFrame()); - ASSERT_TRUE(ClickOnCaption(L"Ignore")); - RunUntilCloseInfobar(); -} - -// TODO(erikwright): test WebBrowserAdapter -// TODO(erikwright): an integration test of ReadyMode::Configure with a mock -// IWebBrowser2? |