summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortwiz@google.com <twiz@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-08 22:36:09 +0000
committertwiz@google.com <twiz@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-08 22:36:09 +0000
commit8103c7fa6b614bf834b080962bdc28465ebe612b (patch)
tree0d0df40bff18ed832060bdd85969bf232f91117f
parenta19124714ececf0de3c5b7b69b013fbbdec9a1b3 (diff)
downloadchromium_src-8103c7fa6b614bf834b080962bdc28465ebe612b.zip
chromium_src-8103c7fa6b614bf834b080962bdc28465ebe612b.tar.gz
chromium_src-8103c7fa6b614bf834b080962bdc28465ebe612b.tar.bz2
Change correcting the profile used when performing top-level navigations of the host browser with a ChromeFrame instance. If a ChromeFrame instance was loaded with a given profile, the bho used to always forward top-level navigation requests to a CF full-tab instance using the default (iexplore) profile. This caused problems with the automation channel, and the navigation would not complete.
I also cleaned up the gcf and host networking registry keys used by Chrome-Frame so that ActiveX instances will also respect their values. TEST=None BUG=None Review URL: http://codereview.chromium.org/3295019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58884 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/external_tab_container_win.cc2
-rw-r--r--chrome/test/automation/automation_messages.h7
-rw-r--r--chrome_frame/chrome_active_document.cc14
-rw-r--r--chrome_frame/chrome_frame_activex_base.h16
-rw-r--r--chrome_frame/test/util_unittests.cc36
-rw-r--r--chrome_frame/utils.cc8
-rw-r--r--chrome_frame/utils.h5
7 files changed, 65 insertions, 23 deletions
diff --git a/chrome/browser/external_tab_container_win.cc b/chrome/browser/external_tab_container_win.cc
index f645793..1af539b 100644
--- a/chrome/browser/external_tab_container_win.cc
+++ b/chrome/browser/external_tab_container_win.cc
@@ -383,6 +383,8 @@ void ExternalTabContainer::AddNewContents(TabContents* source,
attach_params_.dimensions = initial_pos;
attach_params_.user_gesture = user_gesture;
attach_params_.disposition = disposition;
+ attach_params_.profile_name = WideToUTF8(
+ tab_contents()->profile()->GetPath().DirName().BaseName().value());
automation_->Send(new AutomationMsg_AttachExternalTab(0,
tab_handle_, attach_params_));
} else {
diff --git a/chrome/test/automation/automation_messages.h b/chrome/test/automation/automation_messages.h
index f4f7032..714c527 100644
--- a/chrome/test/automation/automation_messages.h
+++ b/chrome/test/automation/automation_messages.h
@@ -580,6 +580,7 @@ struct AttachExternalTabParams {
gfx::Rect dimensions;
int disposition;
bool user_gesture;
+ std::string profile_name;
};
template <>
@@ -591,6 +592,7 @@ struct ParamTraits<AttachExternalTabParams> {
WriteParam(m, p.dimensions);
WriteParam(m, p.disposition);
WriteParam(m, p.user_gesture);
+ WriteParam(m, p.profile_name);
}
static bool Read(const Message* m, void** iter, param_type* p) {
@@ -598,7 +600,8 @@ struct ParamTraits<AttachExternalTabParams> {
ReadParam(m, iter, &p->url) &&
ReadParam(m, iter, &p->dimensions) &&
ReadParam(m, iter, &p->disposition) &&
- ReadParam(m, iter, &p->user_gesture);
+ ReadParam(m, iter, &p->user_gesture) &&
+ ReadParam(m, iter, &p->profile_name);
}
static void Log(const param_type& p, std::string* l) {
@@ -612,6 +615,8 @@ struct ParamTraits<AttachExternalTabParams> {
LogParam(p.disposition, l);
l->append(", ");
LogParam(p.user_gesture, l);
+ l->append(",");
+ LogParam(p.profile_name, l);
l->append(")");
}
};
diff --git a/chrome_frame/chrome_active_document.cc b/chrome_frame/chrome_active_document.cc
index b083982..e48a8b8 100644
--- a/chrome_frame/chrome_active_document.cc
+++ b/chrome_frame/chrome_active_document.cc
@@ -43,9 +43,6 @@
#include "chrome_frame/crash_reporting/crash_metrics.h"
#include "chrome_frame/utils.h"
-static const wchar_t kUseChromeNetworking[] = L"UseChromeNetworking";
-static const wchar_t kHandleTopLevelRequests[] = L"HandleTopLevelRequests";
-
DEFINE_GUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0,
0x46);
@@ -96,11 +93,6 @@ HRESULT ChromeActiveDocument::FinalConstruct() {
return hr;
}
- bool chrome_network = GetConfigBool(false, kUseChromeNetworking);
- bool top_level_requests = GetConfigBool(true, kHandleTopLevelRequests);
- automation_client_->set_use_chrome_network(chrome_network);
- automation_client_->set_handle_top_level_requests(top_level_requests);
-
find_dialog_.Init(automation_client_.get());
OLECMDF flags = static_cast<OLECMDF>(OLECMDF_ENABLED | OLECMDF_SUPPORTED);
@@ -1023,7 +1015,11 @@ bool ChromeActiveDocument::LaunchUrl(const ChromeFrameUrl& cf_url,
if (launch_params_) {
return automation_client_->Initialize(this, launch_params_);
} else {
- return InitializeAutomation(GetHostProcessName(false), L"", IsIEInPrivate(),
+ std::wstring profile = UTF8ToWide(cf_url.profile_name());
+ // If no profile was given, then make use of the host process's name.
+ if (profile.empty())
+ profile = GetHostProcessName(false);
+ return InitializeAutomation(profile, L"", IsIEInPrivate(),
false, cf_url.gurl(), GURL(referrer));
}
}
diff --git a/chrome_frame/chrome_frame_activex_base.h b/chrome_frame/chrome_frame_activex_base.h
index c2c4035..de08d9a 100644
--- a/chrome_frame/chrome_frame_activex_base.h
+++ b/chrome_frame/chrome_frame_activex_base.h
@@ -37,6 +37,9 @@
// Include without path to make GYP build see it.
#include "chrome_tab.h" // NOLINT
+static const wchar_t kUseChromeNetworking[] = L"UseChromeNetworking";
+static const wchar_t kHandleTopLevelRequests[] = L"HandleTopLevelRequests";
+
// Connection point class to support firing IChromeFrameEvents (dispinterface).
template<class T>
class ATL_NO_VTABLE ProxyDIChromeFrameEvents
@@ -264,6 +267,14 @@ END_MSG_MAP()
IE_8,
IE_8 + 1);
}
+
+ // Query and assign the host networking and top-level-request settings
+ // from the registry.
+ bool chrome_network = GetConfigBool(false, kUseChromeNetworking);
+ bool top_level_requests = GetConfigBool(true, kHandleTopLevelRequests);
+ automation_client_->set_use_chrome_network(chrome_network);
+ automation_client_->set_handle_top_level_requests(top_level_requests);
+
return S_OK;
}
@@ -510,7 +521,7 @@ END_MSG_MAP()
GURL parsed_url(WideToUTF8(wide_url));
std::string url =
- StringPrintf("%hs:%hs?attach_external_tab&%I64u&%d&%d&%d&%d&%d",
+ StringPrintf("%hs:%hs?attach_external_tab&%I64u&%d&%d&%d&%d&%d&%hs",
parsed_url.scheme().c_str(),
parsed_url.host().c_str(),
params.cookie,
@@ -518,7 +529,8 @@ END_MSG_MAP()
params.dimensions.x(),
params.dimensions.y(),
params.dimensions.width(),
- params.dimensions.height());
+ params.dimensions.height(),
+ params.profile_name.c_str());
HostNavigate(GURL(url), GURL(), params.disposition);
}
diff --git a/chrome_frame/test/util_unittests.cc b/chrome_frame/test/util_unittests.cc
index 8d91434..e265567 100644
--- a/chrome_frame/test/util_unittests.cc
+++ b/chrome_frame/test/util_unittests.cc
@@ -121,20 +121,26 @@ TEST(UtilTests, GetTempInternetFiles) {
TEST(UtilTests, ParseAttachTabUrlTest) {
ChromeFrameUrl cf_url;
- EXPECT_TRUE(cf_url.Parse(L"http://f/?attach_external_tab&10&1&2&3&123&321"));
+ static const std::string kProfileName("iexplore");
+
+ EXPECT_TRUE(cf_url.Parse(
+ L"http://f/?attach_external_tab&10&1&2&3&123&321&iexplore"));
EXPECT_TRUE(cf_url.attach_to_external_tab());
EXPECT_FALSE(cf_url.is_chrome_protocol());
EXPECT_EQ(10, cf_url.cookie());
EXPECT_EQ(1, cf_url.disposition());
EXPECT_EQ(gfx::Rect(2, 3, 123, 321), cf_url.dimensions());
+ EXPECT_EQ(kProfileName, cf_url.profile_name());
- EXPECT_TRUE(cf_url.Parse(L"http://www.foobar.com?&10&1&2&3&123&321"));
+ EXPECT_TRUE(cf_url.Parse(
+ L"http://www.foobar.com?&10&1&2&3&123&321&iexplore"));
EXPECT_FALSE(cf_url.attach_to_external_tab());
EXPECT_FALSE(cf_url.is_chrome_protocol());
EXPECT_EQ(0, cf_url.cookie());
EXPECT_EQ(0, cf_url.disposition());
EXPECT_EQ(gfx::Rect(0, 0, 0, 0), cf_url.dimensions());
+ EXPECT_TRUE(cf_url.profile_name().empty());
EXPECT_FALSE(cf_url.Parse(L"attach_external_tab&10&1"));
EXPECT_FALSE(cf_url.attach_to_external_tab());
@@ -142,13 +148,16 @@ TEST(UtilTests, ParseAttachTabUrlTest) {
EXPECT_EQ(0, cf_url.cookie());
EXPECT_EQ(0, cf_url.disposition());
EXPECT_EQ(gfx::Rect(0, 0, 0, 0), cf_url.dimensions());
+ EXPECT_TRUE(cf_url.profile_name().empty());
- EXPECT_TRUE(cf_url.Parse(L"gcf:http://f/?attach_tab&10&1&2&3&123&321"));
+ EXPECT_TRUE(cf_url.Parse(
+ L"gcf:http://f/?attach_tab&10&1&2&3&123&321&iexplore"));
EXPECT_FALSE(cf_url.attach_to_external_tab());
EXPECT_TRUE(cf_url.is_chrome_protocol());
EXPECT_EQ(0, cf_url.cookie());
EXPECT_EQ(0, cf_url.disposition());
EXPECT_EQ(gfx::Rect(0, 0, 0, 0), cf_url.dimensions());
+ EXPECT_TRUE(cf_url.profile_name().empty());
EXPECT_TRUE(cf_url.Parse(L"gcf:http://google.com"));
EXPECT_FALSE(cf_url.attach_to_external_tab());
@@ -157,6 +166,7 @@ TEST(UtilTests, ParseAttachTabUrlTest) {
EXPECT_EQ(0, cf_url.disposition());
EXPECT_EQ(gfx::Rect(0, 0, 0, 0), cf_url.dimensions());
EXPECT_EQ(cf_url.gurl(), GURL("http://google.com"));
+ EXPECT_TRUE(cf_url.profile_name().empty());
}
// Mock for the IInternetSecurityManager interface
@@ -226,33 +236,37 @@ TEST(UtilTests, CanNavigateTest) {
{ " ", false, false, false },
{ "foo bar", true, false, false },
- //non-privileged test cases
- { "http://blah/?attach_external_tab&10&1&0&0&100&100", false, true, true },
+ // non-privileged test cases
+ { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore", false,
+ true, true },
{ "http://untrusted/bar.html", false, false, true },
- { "http://blah/?attach_external_tab&10&1&0&0&100&100", false, true, true },
+ { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore", false,
+ true, true },
{ "view-source:http://www.google.ca", false, true, true },
{ "view-source:javascript:alert('foo');", false, false, true },
{ "about:blank", false, true, true },
{ "About:Version", false, true, true },
{ "about:config", false, false, true },
{ "chrome-extension://aaaaaaaaaaaaaaaaaaa/toolstrip.html", false, false,
- true },
+ true },
{ "ftp://www.google.ca", false, false, true },
{ "file://www.google.ca", false, false, true },
{ "file://C:\boot.ini", false, false, true },
{ "SIP:someone@10.1.2.3", false, false, true },
- //privileged test cases
- { "http://blah/?attach_external_tab&10&1&0&0&100&100", true, true, true },
+ // privileged test cases
+ { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore", true, true,
+ true },
{ "http://untrusted/bar.html", true, false, true },
- { "http://blah/?attach_external_tab&10&1&0&0&100&100", true, true, true },
+ { "http://blah/?attach_external_tab&10&1&0&0&100&100&iexplore", true, true,
+ true },
{ "view-source:http://www.google.ca", true, true, true },
{ "view-source:javascript:alert('foo');", true, false, true },
{ "about:blank", true, true, true },
{ "About:Version", true, true, true },
{ "about:config", true, false, true },
{ "chrome-extension://aaaaaaaaaaaaaaaaaaa/toolstrip.html", true, true,
- true },
+ true },
{ "ftp://www.google.ca", true, false, true },
{ "file://www.google.ca", true, false, true },
{ "file://C:\boot.ini", true, false, true },
diff --git a/chrome_frame/utils.cc b/chrome_frame/utils.cc
index 31cf389..26bab06 100644
--- a/chrome_frame/utils.cc
+++ b/chrome_frame/utils.cc
@@ -1355,6 +1355,13 @@ bool ChromeFrameUrl::ParseAttachExternalTabUrl() {
} else {
return false;
}
+
+ if (tokenizer.GetNext()) {
+ profile_name_ = tokenizer.token();
+ } else {
+ return false;
+ }
+
return true;
}
@@ -1364,6 +1371,7 @@ void ChromeFrameUrl::Reset() {
cookie_ = 0;
dimensions_.SetRect(0, 0, 0, 0);
disposition_ = 0;
+ profile_name_.clear();
}
bool CanNavigate(const GURL& url, IInternetSecurityManager* security_manager,
diff --git a/chrome_frame/utils.h b/chrome_frame/utils.h
index 0587fdd..e0da6ac 100644
--- a/chrome_frame/utils.h
+++ b/chrome_frame/utils.h
@@ -517,6 +517,10 @@ class ChromeFrameUrl {
return parsed_url_;
}
+ const std::string& profile_name() const {
+ return profile_name_;
+ }
+
private:
// If we are attaching to an existing external tab, this function parses the
// suffix portion of the URL which contains the attach_external_tab prefix.
@@ -532,6 +536,7 @@ class ChromeFrameUrl {
int disposition_;
GURL parsed_url_;
+ std::string profile_name_;
};
// Returns true if we can navigate to this URL.