| Index: chrome/browser/extensions/webstore_inline_installer_browsertest.cc
|
| diff --git a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
|
| index 5ae1fef25b502cbf5e6f054515e27b3e6612fa2b..35d5edc9ad59df5294548ebf227a1646a024bf0b 100644
|
| --- a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
|
| +++ b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
|
| @@ -4,9 +4,11 @@
|
|
|
| #include "chrome/browser/extensions/webstore_inline_installer.h"
|
|
|
| +#include "base/json/json_reader.h"
|
| #include "base/macros.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "base/values.h"
|
| #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
|
| #include "chrome/browser/extensions/extension_install_prompt.h"
|
| #include "chrome/browser/extensions/extension_service.h"
|
| @@ -25,6 +27,8 @@
|
| #include "extensions/browser/extension_registry.h"
|
| #include "extensions/browser/extension_system.h"
|
| #include "extensions/common/permissions/permission_set.h"
|
| +#include "net/dns/mock_host_resolver.h"
|
| +#include "net/test/embedded_test_server/http_request.h"
|
| #include "url/gurl.h"
|
|
|
| using content::WebContents;
|
| @@ -40,6 +44,9 @@ const char kTestExtensionId[] = "ecglahbcnmdpdciemllbhojghbkagdje";
|
| const char kTestDataPath[] = "extensions/api_test/webstore_inline_install";
|
| const char kCrxFilename[] = "extension.crx";
|
|
|
| +const char kRedirect1Domain[] = "redirect1.com";
|
| +const char kRedirect2Domain[] = "redirect2.com";
|
| +
|
| // A struct for letting us store the actual parameters that were passed to
|
| // the install callback.
|
| struct InstallResult {
|
| @@ -363,6 +370,75 @@ IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerTest, DoubleInlineInstallTest) {
|
| RunTest("runTest");
|
| }
|
|
|
| +class WebstoreInlineInstallerRedirectTest : public WebstoreInlineInstallerTest {
|
| + public:
|
| + WebstoreInlineInstallerRedirectTest() : cws_request_received_(false) {}
|
| + ~WebstoreInlineInstallerRedirectTest() override {}
|
| +
|
| + void SetUpInProcessBrowserTestFixture() override {
|
| + WebstoreInstallerTest::SetUpInProcessBrowserTestFixture();
|
| + host_resolver()->AddRule(kRedirect1Domain, "127.0.0.1");
|
| + host_resolver()->AddRule(kRedirect2Domain, "127.0.0.1");
|
| + }
|
| +
|
| + void ProcessServerRequest(
|
| + const net::test_server::HttpRequest& request) override {
|
| + if (request.content.find("redirect_chain") != std::string::npos) {
|
| + cws_request_received_ = true;
|
| +
|
| + std::unique_ptr<base::Value> contents =
|
| + base::JSONReader::Read(request.content);
|
| + ASSERT_EQ(base::Value::Type::DICTIONARY, contents->GetType());
|
| + cws_request_json_data_ = base::DictionaryValue::From(std::move(contents));
|
| + }
|
| + }
|
| +
|
| + bool cws_request_received_;
|
| + std::unique_ptr<base::DictionaryValue> cws_request_json_data_;
|
| +};
|
| +
|
| +// Test that an install from a page arrived at via redirects includes the
|
| +// redirect information in the webstore request.
|
| +IN_PROC_BROWSER_TEST_F(WebstoreInlineInstallerRedirectTest,
|
| + IncludesRedirectData) {
|
| + // Hand craft a url that will cause the test server to issue redirects.
|
| + const std::vector<std::string> redirects = {kRedirect1Domain,
|
| + kRedirect2Domain};
|
| + net::HostPortPair host_port = embedded_test_server()->host_port_pair();
|
| + std::string redirect_chain;
|
| + for (const auto& redirect : redirects) {
|
| + std::string redirect_url = base::StringPrintf(
|
| + "http://%s:%d/server-redirect?", redirect.c_str(), host_port.port());
|
| + redirect_chain += redirect_url;
|
| + }
|
| + const GURL install_url =
|
| + GURL(redirect_chain +
|
| + GenerateTestServerUrl(kAppDomain, "install.html").spec());
|
| +
|
| + AutoAcceptInstall();
|
| + ui_test_utils::NavigateToURL(browser(), install_url);
|
| + RunTest("runTest");
|
| +
|
| + EXPECT_TRUE(cws_request_received_);
|
| + ASSERT_NE(nullptr, cws_request_json_data_);
|
| +
|
| + base::ListValue* redirect_list = nullptr;
|
| + cws_request_json_data_->GetList("redirect_chain", &redirect_list);
|
| + ASSERT_NE(nullptr, redirect_list);
|
| +
|
| + // Check that the expected domains are in the redirect list.
|
| + const std::vector<std::string> expected_redirect_domains = {
|
| + kRedirect1Domain, kRedirect2Domain, kAppDomain};
|
| + ASSERT_EQ(expected_redirect_domains.size(), redirect_list->GetSize());
|
| + int i = 0;
|
| + for (const auto& value : *redirect_list) {
|
| + std::string value_string;
|
| + ASSERT_TRUE(value->GetAsString(&value_string));
|
| + GURL redirect_url(value_string);
|
| + EXPECT_EQ(expected_redirect_domains[i++], redirect_url.host());
|
| + }
|
| +}
|
| +
|
| class WebstoreInlineInstallerListenerTest : public WebstoreInlineInstallerTest {
|
| public:
|
| WebstoreInlineInstallerListenerTest() {}
|
|
|