summaryrefslogtreecommitdiffstats
path: root/chrome_frame/chrome_active_document.cc
diff options
context:
space:
mode:
authortommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-16 14:44:32 +0000
committertommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-07-16 14:44:32 +0000
commit00aebd7077fba59430dc4d2bada1aa8b56b548f9 (patch)
tree367727f4a8af89d9b9b43e3013279ad7fa5d7211 /chrome_frame/chrome_active_document.cc
parentf274a1c114c24dadddfbbeb51049a655cb075d90 (diff)
downloadchromium_src-00aebd7077fba59430dc4d2bada1aa8b56b548f9.zip
chromium_src-00aebd7077fba59430dc4d2bada1aa8b56b548f9.tar.gz
chromium_src-00aebd7077fba59430dc4d2bada1aa8b56b548f9.tar.bz2
Not firing DocumentComplete in the presence of buggy BHOs.
TEST=should be no functional change except if there are buggy BHOs that we know of loaded in IE. BUG=44463 Review URL: http://codereview.chromium.org/2906011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52668 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/chrome_active_document.cc')
-rw-r--r--chrome_frame/chrome_active_document.cc74
1 files changed, 68 insertions, 6 deletions
diff --git a/chrome_frame/chrome_active_document.cc b/chrome_frame/chrome_active_document.cc
index fc896a0..bd8d7a4 100644
--- a/chrome_frame/chrome_active_document.cc
+++ b/chrome_frame/chrome_active_document.cc
@@ -18,6 +18,7 @@
#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"
@@ -432,7 +433,7 @@ STDMETHODIMP ChromeActiveDocument::Reset() {
return S_OK;
}
-STDMETHODIMP ChromeActiveDocument::GetSize(unsigned long* size) {
+STDMETHODIMP ChromeActiveDocument::GetSize(DWORD* size) {
if (!size)
return E_POINTER;
@@ -449,7 +450,7 @@ STDMETHODIMP ChromeActiveDocument::GetPrivacyImpacted(BOOL* privacy_impacted) {
}
STDMETHODIMP ChromeActiveDocument::Next(BSTR* url, BSTR* policy,
- long* reserved, unsigned long* flags) {
+ LONG* reserved, DWORD* flags) {
if (!url || !policy || !flags)
return E_POINTER;
@@ -754,10 +755,12 @@ void ChromeActiveDocument::UpdateNavigationState(
// Now call the FireNavigateCompleteEvent which makes IE update the text
// in the address-bar.
doc_object_svc->FireNavigateComplete2(this, 0);
- doc_object_svc->FireDocumentComplete(this, 0);
+ if (ShouldFireDocumentComplete())
+ doc_object_svc->FireDocumentComplete(this, 0);
} else if (web_browser_events_svc) {
web_browser_events_svc->FireNavigateComplete2Event();
- web_browser_events_svc->FireDocumentCompleteEvent();
+ if (ShouldFireDocumentComplete())
+ web_browser_events_svc->FireDocumentCompleteEvent();
}
}
@@ -916,8 +919,8 @@ HRESULT ChromeActiveDocument::IEExec(const GUID* cmd_group_guid,
return hr;
}
-unsigned long ChromeActiveDocument::MapUrlToZone(const wchar_t* url) {
- unsigned long zone = URLZONE_INVALID;
+DWORD ChromeActiveDocument::MapUrlToZone(const wchar_t* url) {
+ DWORD zone = URLZONE_INVALID;
if (security_manager_.get() == NULL) {
HRESULT hr = CoCreateInstance(
CLSID_InternetSecurityManager,
@@ -1251,3 +1254,62 @@ LRESULT ChromeActiveDocument::OnFirePrivacyChange(UINT message, WPARAM wparam,
NOTREACHED() << "Failed to retrieve IWebBrowser2 interface.";
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
+ };
+
+ 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;
+}
+