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
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 @@
 
   if (client_site) {
     SetClientSite(client_site);
+    DoQueryService(IID_INewWindowManager, client_site,
+                   popup_manager_.Receive());
   }
 
   Bho* chrome_frame_bho = Bho::GetCurrentThreadBhoInstance();
@@ -678,7 +680,7 @@
   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 @@
   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 @@
     // 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;