summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/extensions/api/webstore_private
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/extensions/api/webstore_private')
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc75
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h19
-rw-r--r--chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc47
3 files changed, 137 insertions, 4 deletions
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
index 3a33fe8e797..6d06524c940 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -8,6 +8,7 @@
#include <utility>
#include <vector>
+#include "base/base64.h"
#include "base/bind.h"
#include "base/lazy_instance.h"
#include "base/macros.h"
@@ -17,11 +18,14 @@
#include "base/values.h"
#include "base/version.h"
#include "chrome/browser/bitmap_fetcher/bitmap_fetcher.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/crx_installer.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/extensions/install_tracker.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.h"
+#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/signin/signin_manager_factory.h"
#include "chrome/browser/ui/app_list/app_list_util.h"
#include "chrome/common/extensions/extension_constants.h"
@@ -32,6 +36,7 @@
#include "content/public/browser/gpu_feature_checker.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
+#include "extensions/browser/extension_function_constants.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/extension.h"
@@ -44,6 +49,8 @@
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#endif
+using safe_browsing::SafeBrowsingNavigationObserverManager;
+
namespace extensions {
namespace BeginInstallWithManifest3 =
@@ -60,6 +67,7 @@ namespace IsPendingCustodianApproval =
namespace IsInIncognitoMode = api::webstore_private::IsInIncognitoMode;
namespace LaunchEphemeralApp = api::webstore_private::LaunchEphemeralApp;
namespace SetStoreLogin = api::webstore_private::SetStoreLogin;
+namespace GetReferrerChain = api::webstore_private::GetReferrerChain;
namespace {
@@ -140,6 +148,9 @@ const char kIncognitoError[] =
const char kEphemeralAppLaunchingNotSupported[] =
"Ephemeral launching of apps is no longer supported.";
+// The number of user gestures to trace back for the referrer chain.
+const int kExtensionReferrerUserGestureLimit = 2;
+
WebstoreInstaller::Delegate* test_webstore_installer_delegate = nullptr;
// We allow the web store to set a string containing login information when a
@@ -299,7 +310,7 @@ void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
return;
}
- content::WebContents* web_contents = GetAssociatedWebContents();
+ content::WebContents* web_contents = GetSenderWebContents();
if (!web_contents) {
// The browser window has gone away.
Respond(BuildResponse(api::webstore_private::RESULT_USER_CANCELLED,
@@ -435,6 +446,12 @@ WebstorePrivateCompleteInstallFunction::Run() {
params->expected_id));
}
+ content::WebContents* web_contents = GetSenderWebContents();
+ if (!web_contents) {
+ return RespondNow(
+ Error(function_constants::kCouldNotFindSenderWebContents));
+ }
+
scoped_active_install_.reset(new ScopedActiveInstall(
InstallTracker::Get(browser_context()), params->expected_id));
@@ -444,8 +461,7 @@ WebstorePrivateCompleteInstallFunction::Run() {
// The extension will install through the normal extension install flow, but
// the whitelist entry will bypass the normal permissions install dialog.
scoped_refptr<WebstoreInstaller> installer = new WebstoreInstaller(
- chrome_details_.GetProfile(), this,
- chrome_details_.GetAssociatedWebContents(), params->expected_id,
+ chrome_details_.GetProfile(), this, web_contents, params->expected_id,
std::move(approval_), WebstoreInstaller::INSTALL_SOURCE_OTHER);
installer->Start();
@@ -657,4 +673,57 @@ WebstorePrivateIsPendingCustodianApprovalFunction::BuildResponse(bool result) {
return OneArgument(std::make_unique<base::Value>(result));
}
+WebstorePrivateGetReferrerChainFunction::
+ WebstorePrivateGetReferrerChainFunction()
+ : chrome_details_(this) {}
+
+WebstorePrivateGetReferrerChainFunction::
+ ~WebstorePrivateGetReferrerChainFunction() {}
+
+ExtensionFunction::ResponseAction
+WebstorePrivateGetReferrerChainFunction::Run() {
+ Profile* profile = chrome_details_.GetProfile();
+ if (!SafeBrowsingNavigationObserverManager::IsEnabledAndReady(profile))
+ return RespondNow(ArgumentList(GetReferrerChain::Results::Create("")));
+
+ content::WebContents* web_contents = GetSenderWebContents();
+ if (!web_contents) {
+ return RespondNow(ErrorWithArguments(GetReferrerChain::Results::Create(""),
+ kUserCancelledError));
+ }
+
+ scoped_refptr<SafeBrowsingNavigationObserverManager>
+ navigation_observer_manager = g_browser_process->safe_browsing_service()
+ ->navigation_observer_manager();
+
+ safe_browsing::ReferrerChain referrer_chain;
+ SafeBrowsingNavigationObserverManager::AttributionResult result =
+ navigation_observer_manager->IdentifyReferrerChainByWebContents(
+ web_contents, kExtensionReferrerUserGestureLimit, &referrer_chain);
+
+ // If the referrer chain is incomplete we'll append the most recent
+ // navigations to referrer chain for diagnostic purposes. This only happens if
+ // the user is not in incognito mode and has opted into extended reporting or
+ // Scout reporting. Otherwise, |CountOfRecentNavigationsToAppend| returns 0.
+ int recent_navigations_to_collect =
+ SafeBrowsingNavigationObserverManager::CountOfRecentNavigationsToAppend(
+ *profile, result);
+ if (recent_navigations_to_collect > 0) {
+ navigation_observer_manager->AppendRecentNavigations(
+ recent_navigations_to_collect, &referrer_chain);
+ }
+
+ safe_browsing::ExtensionWebStoreInstallRequest request;
+ request.mutable_referrer_chain()->Swap(&referrer_chain);
+ request.mutable_referrer_chain_options()->set_recent_navigations_to_collect(
+ recent_navigations_to_collect);
+
+ std::string serialized_referrer_proto = request.SerializeAsString();
+ // Base64 encode the proto to avoid issues with base::Value rejecting strings
+ // which are not valid UTF8.
+ base::Base64Encode(serialized_referrer_proto, &serialized_referrer_proto);
+ return RespondNow(ArgumentList(
+ GetReferrerChain::Results::Create(serialized_referrer_proto)));
+}
+
} // namespace extensions
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
index 8af8ccc53a6..c131838423e 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
@@ -304,6 +304,25 @@ class WebstorePrivateIsPendingCustodianApprovalFunction
ChromeExtensionFunctionDetails chrome_details_;
};
+class WebstorePrivateGetReferrerChainFunction
+ : public UIThreadExtensionFunction {
+ public:
+ DECLARE_EXTENSION_FUNCTION("webstorePrivate.getReferrerChain",
+ WEBSTOREPRIVATE_GETREFERRERCHAIN)
+
+ WebstorePrivateGetReferrerChainFunction();
+
+ private:
+ ~WebstorePrivateGetReferrerChainFunction() override;
+
+ // ExtensionFunction:
+ ExtensionFunction::ResponseAction Run() override;
+
+ ChromeExtensionFunctionDetails chrome_details_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebstorePrivateGetReferrerChainFunction);
+};
+
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_WEBSTORE_PRIVATE_WEBSTORE_PRIVATE_API_H_
diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
index f33655acf2d..4819cef550e 100644
--- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -7,7 +7,6 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_restrictions.h"
@@ -432,4 +431,50 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebstoreGetWebGLStatusTest, Blocked) {
RunTest(webgl_allowed);
}
+class ExtensionWebstorePrivateGetReferrerChainApiTest
+ : public ExtensionWebstorePrivateApiTest {
+ public:
+ void SetUpOnMainThread() override {
+ host_resolver()->AddRule("redirect1.com", "127.0.0.1");
+ host_resolver()->AddRule("redirect2.com", "127.0.0.1");
+
+ ExtensionWebstorePrivateApiTest::SetUpOnMainThread();
+ }
+
+ GURL GetTestServerURLWithReferrers(const std::string& path) {
+ // Hand craft a url that will cause the test server to issue redirects.
+ const std::vector<std::string> redirects = {"redirect1.com",
+ "redirect2.com"};
+ 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;
+ }
+
+ return GURL(redirect_chain + GetTestServerURL(path).spec());
+ }
+};
+
+// Tests that the GetReferrerChain API returns the redirect information.
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateGetReferrerChainApiTest,
+ GetReferrerChain) {
+ GURL page_url = GetTestServerURLWithReferrers("referrer_chain.html");
+ ASSERT_TRUE(RunPageTest(page_url.spec()));
+}
+
+// Tests that the GetReferrerChain API returns an empty string for profiles
+// opted out of SafeBrowsing.
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateGetReferrerChainApiTest,
+ GetReferrerChainForNonSafeBrowsingUser) {
+ PrefService* pref_service = browser()->profile()->GetPrefs();
+ EXPECT_TRUE(pref_service->GetBoolean(prefs::kSafeBrowsingEnabled));
+ // Disable SafeBrowsing.
+ pref_service->SetBoolean(prefs::kSafeBrowsingEnabled, false);
+
+ GURL page_url = GetTestServerURLWithReferrers("empty_referrer_chain.html");
+ ASSERT_TRUE(RunPageTest(page_url.spec()));
+}
+
} // namespace extensions