Index: chrome_frame/chrome_active_document.cc |
=================================================================== |
--- chrome_frame/chrome_active_document.cc (revision 53172) |
+++ chrome_frame/chrome_active_document.cc (working copy) |
@@ -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 @@ |
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 @@ |
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 @@ |
// 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 @@ |
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; |
-} |
- |