diff options
Diffstat (limited to 'chrome_frame/chrome_active_document.cc')
-rw-r--r-- | chrome_frame/chrome_active_document.cc | 77 |
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; -} - |