diff options
author | stoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-08 16:26:11 +0000 |
---|---|---|
committer | stoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-08 16:26:11 +0000 |
commit | b1c5563861d33febd3ba84dfac70c7b6921bda26 (patch) | |
tree | 8f7f9747e59f42cf0878edb8e599a3151e944045 /chrome_frame/chrome_active_document.cc | |
parent | 57fc471c6864dea93852742643e32d35a30c8559 (diff) | |
download | chromium_src-b1c5563861d33febd3ba84dfac70c7b6921bda26.zip chromium_src-b1c5563861d33febd3ba84dfac70c7b6921bda26.tar.gz chromium_src-b1c5563861d33febd3ba84dfac70c7b6921bda26.tar.bz2 |
ChromeFrame now uses host provided popup blocker.
It does not work in all scenarions since from Chrome side an empty string is passed as target url.
Note in IE6 "Tools/Popup Blocker" menu is not visible if ChromeFrame is the activedocument. Have to support some IOleCommandTarget command..
BUG=34823
Review URL: http://codereview.chromium.org/668168
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40897 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/chrome_active_document.cc')
-rw-r--r-- | chrome_frame/chrome_active_document.cc | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/chrome_frame/chrome_active_document.cc b/chrome_frame/chrome_active_document.cc index 4da4056e..ce1897f 100644 --- a/chrome_frame/chrome_active_document.cc +++ b/chrome_frame/chrome_active_document.cc @@ -207,6 +207,8 @@ STDMETHODIMP ChromeActiveDocument::Load(BOOL fully_avalable, if (client_site) { SetClientSite(client_site); + DoQueryService(IID_INewWindowManager, client_site, + popup_manager_.Receive()); } Bho* chrome_frame_bho = Bho::GetCurrentThreadBhoInstance(); @@ -678,7 +680,7 @@ void ChromeActiveDocument::OnViewSource() { DCHECK(navigation_info_.url.is_valid()); std::string url_to_open = "view-source:"; url_to_open += navigation_info_.url.spec(); - OnOpenURL(0, GURL(url_to_open), GURL(), NEW_WINDOW); + HostNavigate(GURL(url_to_open), GURL(), NEW_WINDOW); } void ChromeActiveDocument::OnDetermineSecurityZone(const GUID* cmd_group_guid, @@ -710,6 +712,27 @@ void ChromeActiveDocument::OnOpenURL(int tab_handle, Base::OnOpenURL(tab_handle, url_to_open, referrer, open_disposition); } +void ChromeActiveDocument::OnAttachExternalTab(int tab_handle, + const IPC::AttachExternalTabParams& params) { + DWORD flags = 0; + if (params.user_gesture) + flags = NWMF_USERREQUESTED; + + HRESULT hr = S_OK; + if (popup_manager_) { + hr = popup_manager_->EvaluateNewWindow( + UTF8ToWide(params.url.spec()).c_str(), NULL, url_, NULL, FALSE, flags, + 0); + } + // Allow popup + if (hr == S_OK) { + Base::OnAttachExternalTab(tab_handle, params); + return; + } + + automation_client_->BlockExternalTab(params.cookie); +} + bool ChromeActiveDocument::PreProcessContextMenu(HMENU menu) { ScopedComPtr<IBrowserService> browser_service; ScopedComPtr<ITravelLog> travel_log; @@ -867,11 +890,11 @@ bool ChromeActiveDocument::LaunchUrl(const std::wstring& url, // Skip over kChromeAttachExternalTabPrefix tokenizer.GetNext(); - intptr_t external_tab_cookie = 0; - - if (tokenizer.GetNext()) - StringToInt(tokenizer.token(), - reinterpret_cast<int*>(&external_tab_cookie)); + uint64 external_tab_cookie = 0; + if (tokenizer.GetNext()) { + wchar_t* end_ptr = 0; + external_tab_cookie = _wcstoui64(tokenizer.token().c_str(), &end_ptr, 10); + } if (external_tab_cookie == 0) { NOTREACHED() << "invalid url for attach tab: " << url; |