summaryrefslogtreecommitdiffstats
path: root/chrome_frame/chrome_active_document.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome_frame/chrome_active_document.cc')
-rw-r--r--chrome_frame/chrome_active_document.cc77
1 files changed, 12 insertions, 65 deletions
diff --git a/chrome_frame/chrome_active_document.cc b/chrome_frame/chrome_active_document.cc
index 899ec80..e4c61a6 100644
--- a/chrome_frame/chrome_active_document.cc
+++ b/chrome_frame/chrome_active_document.cc
@@ -18,7 +18,6 @@
#include "base/command_line.h"
#include "base/file_util.h"
-#include "base/file_version_info.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/process_util.h"
@@ -39,6 +38,7 @@
#include "chrome/test/automation/tab_proxy.h"
#include "chrome_frame/bho.h"
#include "chrome_frame/bind_context_info.h"
+#include "chrome_frame/buggy_bho_handling.h"
#include "chrome_frame/crash_reporting/crash_metrics.h"
#include "chrome_frame/utils.h"
@@ -50,7 +50,6 @@ static const wchar_t kHandleTopLevelRequests[] = L"HandleTopLevelRequests";
DEFINE_GUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0,
0x46);
-
base::ThreadLocalPointer<ChromeActiveDocument> g_active_doc_cache;
bool g_first_launch_by_process_ = true;
@@ -724,6 +723,15 @@ void ChromeActiveDocument::UpdateNavigationState(
ScopedComPtr<IDocObjectService> doc_object_svc;
ScopedComPtr<IWebBrowserEventsService> web_browser_events_svc;
+ buggy_bho::BuggyBhoTls bad_bho_tls;
+ if (GetConfigBool(true, kEnableBuggyBhoIntercept)) {
+ ScopedComPtr<IWebBrowser2> wb2;
+ DoQueryService(SID_SWebBrowserApp, m_spClientSite, wb2.Receive());
+ if (wb2) {
+ buggy_bho::BuggyBhoTls::PatchBuggyBHOs(wb2);
+ }
+ }
+
DoQueryService(__uuidof(web_browser_events_svc), m_spClientSite,
web_browser_events_svc.Receive());
@@ -764,12 +772,10 @@ void ChromeActiveDocument::UpdateNavigationState(
// Now call the FireNavigateCompleteEvent which makes IE update the text
// in the address-bar.
doc_object_svc->FireNavigateComplete2(this, 0);
- if (ShouldFireDocumentComplete())
- doc_object_svc->FireDocumentComplete(this, 0);
+ doc_object_svc->FireDocumentComplete(this, 0);
} else if (web_browser_events_svc) {
web_browser_events_svc->FireNavigateComplete2Event();
- if (ShouldFireDocumentComplete())
- web_browser_events_svc->FireDocumentCompleteEvent();
+ web_browser_events_svc->FireDocumentCompleteEvent();
}
}
@@ -1264,62 +1270,3 @@ LRESULT ChromeActiveDocument::OnFirePrivacyChange(UINT message, WPARAM wparam,
return 0;
}
-namespace {
-struct ModuleAndVersion {
- const char* module_name_;
- const uint32 major_version_;
- const uint32 minor_version_;
-};
-} // end namespace
-
-// static
-bool ChromeActiveDocument::ShouldFireDocumentComplete() {
- typedef enum ModuleCheckResult {
- CHECK_NOT_DONE,
- DOCUMENT_COMPLETE_OK,
- DOCUMENT_COMPLETE_NOT_OK
- };
-
- static ModuleCheckResult results = CHECK_NOT_DONE;
-
- if (results == CHECK_NOT_DONE) {
- // These modules are missing some checks in their DocumentComplete
- // implementation that causes a crash.
- static const ModuleAndVersion buggy_modules[] = {
- { "askbar.dll", 4, 1 }, // biggest troublemaker: 4.1.0.5.
- { "gbieh.dll", 3, 8 }, // biggest troublemaker: 3.8.14.12
- { "gbiehcef.dll", 3, 8 }, // biggest troublemaker: 3.8.11.23
- { "gbiehUni.dll", 3, 8 }, // Another Banco DLL.
- };
-
- for (size_t i = 0; results == CHECK_NOT_DONE &&
- i < arraysize(buggy_modules); ++i) {
- const ModuleAndVersion& module = buggy_modules[i];
- HMODULE mod = ::GetModuleHandleA(module.module_name_);
- if (mod) {
- wchar_t path[MAX_PATH * 2] = {0};
- ::GetModuleFileNameW(mod, path, arraysize(path));
- scoped_ptr<FileVersionInfo> version_info(
- FileVersionInfo::CreateFileVersionInfo(FilePath(path)));
- DCHECK(version_info.get());
- if (version_info.get()) {
- uint32 major = 0, minor = 0;
- if (!ParseVersion(version_info->file_version(), &major, &minor))
- ParseVersion(version_info->product_version(), &major, &minor);
- if (major < module.major_version_ ||
- (major == module.major_version_ &&
- minor <= module.minor_version_)) {
- DLOG(WARNING) << "Buggy module found: " << module.module_name_;
- results = DOCUMENT_COMPLETE_NOT_OK;
- }
- }
- }
- }
-
- if (results == CHECK_NOT_DONE)
- results = DOCUMENT_COMPLETE_OK;
- }
-
- return results == DOCUMENT_COMPLETE_OK;
-}
-