diff options
author | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-09 23:53:26 +0000 |
---|---|---|
committer | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-09 23:53:26 +0000 |
commit | ffec6bf36fb4527d051960d4871623a5b91ec122 (patch) | |
tree | ebe555761e809e0733955482b3f8581f74e4b171 /chrome_frame/urlmon_moniker.cc | |
parent | 443f856cef514cbfd1a17d486f66c3d3530946c5 (diff) | |
download | chromium_src-ffec6bf36fb4527d051960d4871623a5b91ec122.zip chromium_src-ffec6bf36fb4527d051960d4871623a5b91ec122.tar.gz chromium_src-ffec6bf36fb4527d051960d4871623a5b91ec122.tar.bz2 |
Fix IE6 switching issues
Fixes for issues with new moniker patch.
BUG=none
TEST=covered by existing tests
Review URL: http://codereview.chromium.org/1625010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44160 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/urlmon_moniker.cc')
-rw-r--r-- | chrome_frame/urlmon_moniker.cc | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/chrome_frame/urlmon_moniker.cc b/chrome_frame/urlmon_moniker.cc index fc66e9f..e3993d4 100644 --- a/chrome_frame/urlmon_moniker.cc +++ b/chrome_frame/urlmon_moniker.cc @@ -208,17 +208,43 @@ void MonikerPatch::Uninitialize() { vtable_patch::UnpatchInterfaceMethods(IMoniker_PatchInfo); } -bool ShouldWrapCallback(IMoniker* moniker, IBindCtx* bind_context) { +bool ShouldWrapCallback(IMoniker* moniker, REFIID iid, IBindCtx* bind_context) { + CComHeapPtr<WCHAR> url; + HRESULT hr = moniker->GetDisplayName(bind_context, NULL, &url); + if (!url) { + DLOG(INFO) << __FUNCTION__ << StringPrintf( + "GetDisplayName failed. Error: 0x%x", hr); + return false; + } + + if (!IsEqualIID(IID_IStream, iid)) { + DLOG(INFO) << __FUNCTION__ << "Url: " << url << + "Not wrapping: IID is not IStream."; + return false; + } + + ScopedComPtr<IUnknown> our_request; + hr = bind_context->GetObjectParam(L"_CHROMEFRAME_REQUEST_", + our_request.Receive()); + if (our_request) { + DLOG(INFO) << __FUNCTION__ << "Url: " << url << + "Not wrapping: request from chrome frame."; + return false; + } + NavigationManager* mgr = NavigationManager::GetThreadInstance(); if (!mgr) { - DLOG(INFO) << __FUNCTION__ << "No navitation manager to wrap"; + DLOG(INFO) << __FUNCTION__ << "Url: " << url << + "No navitagion manager to wrap"; return false; } - CComHeapPtr<WCHAR> url; - HRESULT hr = moniker->GetDisplayName(bind_context, NULL, &url); - DCHECK(SUCCEEDED(hr)); bool should_wrap = mgr->IsTopLevelUrl(url); + if (!should_wrap) { + DLOG(INFO) << __FUNCTION__ << "Url: " << url << + "Not wrapping: Not top level url."; + } + return should_wrap; } @@ -255,12 +281,11 @@ HRESULT MonikerPatch::BindToObject(IMoniker_BindToObject_Fn original, HRESULT MonikerPatch::BindToStorage(IMoniker_BindToStorage_Fn original, IMoniker* me, IBindCtx* bind_ctx, IMoniker* to_left, REFIID iid, void** obj) { - DLOG(INFO) << __FUNCTION__; DCHECK(to_left == NULL); HRESULT hr = S_OK; CComObject<BSCBStorageBind>* callback = NULL; - if ((IsEqualIID(IID_IStream, iid)) && ShouldWrapCallback(me, bind_ctx)) { + if (ShouldWrapCallback(me, iid, bind_ctx)) { hr = CComObject<BSCBStorageBind>::CreateInstance(&callback); callback->AddRef(); hr = callback->Initialize(me, bind_ctx); @@ -274,6 +299,5 @@ HRESULT MonikerPatch::BindToStorage(IMoniker_BindToStorage_Fn original, // and then it's too late. if ((S_OK == hr) && callback) callback->MayPlayBack(BSCF_LASTDATANOTIFICATION); - return hr; }
\ No newline at end of file |