| Index: chrome_frame/protocol_sink_wrap.cc
|
| ===================================================================
|
| --- chrome_frame/protocol_sink_wrap.cc (revision 30697)
|
| +++ chrome_frame/protocol_sink_wrap.cc (working copy)
|
| @@ -3,6 +3,7 @@
|
| // found in the LICENSE file.
|
|
|
| #include <htiframe.h>
|
| +#include <mshtml.h>
|
|
|
| #include "chrome_frame/protocol_sink_wrap.h"
|
|
|
| @@ -609,32 +610,52 @@
|
| return instance;
|
| }
|
|
|
| -HRESULT ProtocolSinkWrap::WebBrowserFromProtocolSink(
|
| - IInternetProtocolSink* sink, IWebBrowser2** web_browser) {
|
| - // TODO(tommi): GUID_NULL doesn't work when loading from history.
|
| - // asking for IID_IHttpNegotiate as the service id works, but
|
| - // getting the IWebBrowser2 interface still doesn't work.
|
| - ScopedComPtr<IHttpNegotiate> http_negotiate;
|
| - HRESULT hr = DoQueryService(GUID_NULL, sink, http_negotiate.Receive());
|
| - if (http_negotiate)
|
| - hr = DoQueryService(IID_ITargetFrame2, http_negotiate, web_browser);
|
| -
|
| - return hr;
|
| -}
|
| -
|
| ScopedComPtr<IInternetProtocolSink> ProtocolSinkWrap::MaybeWrapSink(
|
| IInternetProtocol* protocol, IInternetProtocolSink* prot_sink,
|
| const wchar_t* url) {
|
| ScopedComPtr<IInternetProtocolSink> sink_to_use(prot_sink);
|
| ScopedComPtr<IWebBrowser2> web_browser;
|
| - WebBrowserFromProtocolSink(prot_sink, web_browser.Receive());
|
| +
|
| + // FYI: GUID_NULL doesn't work when the URL is being loaded from history.
|
| + // asking for IID_IHttpNegotiate as the service id works, but
|
| + // getting the IWebBrowser2 interface still doesn't work.
|
| + ScopedComPtr<IHttpNegotiate> http_negotiate;
|
| + HRESULT hr = DoQueryService(GUID_NULL, prot_sink, http_negotiate.Receive());
|
| + if (http_negotiate) {
|
| + hr = DoQueryService(IID_ITargetFrame2, http_negotiate,
|
| + web_browser.Receive());
|
| + }
|
| +
|
| if (web_browser) {
|
| - CComObject<ProtocolSinkWrap>* wrap = NULL;
|
| - CComObject<ProtocolSinkWrap>::CreateInstance(&wrap);
|
| - DCHECK(wrap);
|
| - if (wrap->Initialize(protocol, prot_sink, url)) {
|
| - sink_to_use = wrap;
|
| + // Do one more check to make sure we don't wrap requests that are
|
| + // targeted to sub frames.
|
| + // For a use case, see FullTabModeIE_SubIFrame and FullTabModeIE_SubFrame
|
| + // unit tests.
|
| +
|
| + // Default should_wrap to true in case no window is available.
|
| + // In that case this request is a top level request.
|
| + bool should_wrap = true;
|
| +
|
| + ScopedComPtr<IHTMLWindow2> current_frame, parent_frame;
|
| + hr = DoQueryService(IID_IHTMLWindow2, http_negotiate,
|
| + current_frame.Receive());
|
| + if (current_frame) {
|
| + // Only the top level window will return self when get_parent is called.
|
| + current_frame->get_parent(parent_frame.Receive());
|
| + if (parent_frame != current_frame) {
|
| + DLOG(INFO) << "Sub frame detected";
|
| + should_wrap = false;
|
| + }
|
| }
|
| +
|
| + if (should_wrap) {
|
| + CComObject<ProtocolSinkWrap>* wrap = NULL;
|
| + CComObject<ProtocolSinkWrap>::CreateInstance(&wrap);
|
| + DCHECK(wrap);
|
| + if (wrap->Initialize(protocol, prot_sink, url)) {
|
| + sink_to_use = wrap;
|
| + }
|
| + }
|
| }
|
|
|
| return sink_to_use;
|
|
|