| Index: chrome_frame/bho_loader.cc
|
| diff --git a/chrome_frame/bho_loader.cc b/chrome_frame/bho_loader.cc
|
| deleted file mode 100644
|
| index d76898cf8f31813e6706bee88198b44548b3a664..0000000000000000000000000000000000000000
|
| --- a/chrome_frame/bho_loader.cc
|
| +++ /dev/null
|
| @@ -1,132 +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/bho_loader.h"
|
| -
|
| -#include <atlbase.h>
|
| -#include <atlcomcli.h>
|
| -#include <exdisp.h>
|
| -
|
| -#include "chrome_frame/chrome_frame_helper_util.h"
|
| -#include "chrome_frame/chrome_tab.h"
|
| -#include "chrome_frame/event_hooker.h"
|
| -
|
| -
|
| -// Describes the window class we look for.
|
| -const wchar_t kStatusBarWindowClass[] = L"msctls_statusbar32";
|
| -
|
| -// On IE9, the status bar is disabled by default, so we look for an
|
| -// AsyncBoundaryLayer window instead.
|
| -const wchar_t kAsyncBoundaryDnWindow[] = L"asynclayerboundarydn\0";
|
| -
|
| -BHOLoader::BHOLoader() : hooker_(new EventHooker()) {
|
| -}
|
| -
|
| -BHOLoader::~BHOLoader() {
|
| - if (hooker_) {
|
| - delete hooker_;
|
| - hooker_ = NULL;
|
| - }
|
| -}
|
| -
|
| -void BHOLoader::OnHookEvent(DWORD event, HWND window) {
|
| - // Step 1: Make sure that we are in a process named iexplore.exe.
|
| - if (IsNamedProcess(L"iexplore.exe")) {
|
| - if (!IsWindowOfClass(window, kStatusBarWindowClass) &&
|
| - !IsWindowOfClass(window, kAsyncBoundaryDnWindow)) {
|
| - return;
|
| - } else {
|
| - // We have the right sort of window, check to make sure it was created
|
| - // on the current thread.
|
| - DWORD thread_id = GetWindowThreadProcessId(window, NULL);
|
| - _ASSERTE(thread_id == GetCurrentThreadId());
|
| - }
|
| -
|
| - // Step 2: Check to see if the window is of the right class.
|
| - HWND browser_hwnd = NULL;
|
| - if (IsWindowOfClass(window, kStatusBarWindowClass)) {
|
| - // For IE8 and under, IE loads BHOs in the WM_CREATE handler of the tab
|
| - // window approximately after it creates the status bar window. To be as
|
| - // close to IE as possible in our simulation on BHO loading, we watch for
|
| - // the status bar to be created and do our simulated BHO loading at that
|
| - // time.
|
| - browser_hwnd = GetParent(window);
|
| - } else if (IsWindowOfClass(window, kAsyncBoundaryDnWindow)) {
|
| - // For IE9, the status bar is disabled by default, so we look for an
|
| - // AsyncBoundaryWindow to be created. When we find that, look for a
|
| - // child window owned by the current thread named "tabwindowclass".
|
| - // That will be our browser window.
|
| - browser_hwnd = RecurseFindWindow(NULL, L"tabwindowclass", NULL,
|
| - GetCurrentThreadId(),
|
| - GetCurrentProcessId());
|
| - _ASSERTE(NULL != browser_hwnd);
|
| - }
|
| -
|
| - if (browser_hwnd != NULL) {
|
| - // Step 3:
|
| - // Parent window of status bar window is the web browser window. Try to
|
| - // get its IWebBrowser2 interface
|
| - CComPtr<IWebBrowser2> browser;
|
| - UtilGetWebBrowserObjectFromWindow(browser_hwnd, __uuidof(browser),
|
| - reinterpret_cast<void**>(&browser));
|
| - if (browser) {
|
| - if (IsSystemLevelChromeFrameInstalled()) {
|
| - // We're in the right place, but a system-level installation has
|
| - // appeared. We should leave now.
|
| - return;
|
| - }
|
| -
|
| - // Figure out if we're already in the property map.
|
| - wchar_t bho_clsid_as_string[MAX_PATH] = {0};
|
| - StringFromGUID2(CLSID_ChromeFrameBHO, bho_clsid_as_string,
|
| - ARRAYSIZE(bho_clsid_as_string));
|
| - CComBSTR bho_clsid_as_string_bstr(bho_clsid_as_string);
|
| -
|
| - CComVariant existing_bho;
|
| - HRESULT hr = browser->GetProperty(bho_clsid_as_string_bstr,
|
| - &existing_bho);
|
| -
|
| - if (V_VT(&existing_bho) != VT_DISPATCH &&
|
| - V_VT(&existing_bho) != VT_UNKNOWN) {
|
| - // Step 4:
|
| - // We have the IWebBrowser2 interface. Now create the BHO instance
|
| - CComPtr<IObjectWithSite> bho_object;
|
| - hr = bho_object.CoCreateInstance(CLSID_ChromeFrameBHO,
|
| - NULL,
|
| - CLSCTX_INPROC_SERVER);
|
| -
|
| - _ASSERTE(bho_object);
|
| - if (SUCCEEDED(hr) && bho_object) {
|
| - // Step 5:
|
| - // Initialize the BHO by calling SetSite and passing it IWebBrowser2
|
| - hr = bho_object->SetSite(browser);
|
| - _ASSERTE(bho_object);
|
| - if (SUCCEEDED(hr)) {
|
| - // Step 6:
|
| - // Now add the BHO to the collection of automation objects. This
|
| - // will ensure that BHO will be accessible from the web pages as
|
| - // any other BHO. Importantly, it will make sure that our BHO
|
| - // will be cleaned up at the right time along with other BHOs.
|
| - CComVariant object_variant(bho_object);
|
| - browser->PutProperty(bho_clsid_as_string_bstr, object_variant);
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -bool BHOLoader::StartHook() {
|
| - return hooker_->StartHook();
|
| -}
|
| -
|
| -void BHOLoader::StopHook() {
|
| - hooker_->StopHook();
|
| -}
|
| -
|
| -BHOLoader* BHOLoader::GetInstance() {
|
| - static BHOLoader loader;
|
| - return &loader;
|
| -}
|
|
|