Commit 460dc52d authored by Rayan Kanso's avatar Rayan Kanso Committed by Commit Bot

[PBS] Add flag to bypass install criteria for default SE

With the flag enabled, PBS permissions are no longer tied to
installability for the browser's default engine. The ContentSettings
permission is checked directly.

Tested by creating a PBS registration on the browser's default search
engine (with & without the flag). Also added a unit test.

Bug: 1117598

Change-Id: I11fc91c962f77d761f47b0d25736ed713bb6de09
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2362705
Commit-Queue: Rayan Kanso <rayankans@chromium.org>
Reviewed-by: default avatarPeter Beverloo <peter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799207}
parent 0005e88e
...@@ -4,17 +4,34 @@ ...@@ -4,17 +4,34 @@
#include "chrome/browser/background_sync/periodic_background_sync_permission_context.h" #include "chrome/browser/background_sync/periodic_background_sync_permission_context.h"
#include "base/feature_list.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/installable/installable_utils.h" #include "chrome/browser/installable/installable_utils.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/common/chrome_features.h"
#include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h" #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h"
#include "url/origin.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#include "chrome/browser/android/shortcut_helper.h" #include "chrome/browser/android/shortcut_helper.h"
#endif #endif
namespace features {
// If enabled, the installability criteria for granting PBS permission is
// dropped and the content setting is checked. This only applies if the
// requesting origin matches that of the browser's default search engine.
const base::Feature kPeriodicSyncPermissionForDefaultSearchEngine{
"PeriodicSyncPermissionForDefaultSearchEngine",
base::FEATURE_DISABLED_BY_DEFAULT};
} // namespace features
PeriodicBackgroundSyncPermissionContext:: PeriodicBackgroundSyncPermissionContext::
PeriodicBackgroundSyncPermissionContext( PeriodicBackgroundSyncPermissionContext(
content::BrowserContext* browser_context) content::BrowserContext* browser_context)
...@@ -50,6 +67,19 @@ bool PeriodicBackgroundSyncPermissionContext::IsRestrictedToSecureOrigins() ...@@ -50,6 +67,19 @@ bool PeriodicBackgroundSyncPermissionContext::IsRestrictedToSecureOrigins()
return true; return true;
} }
GURL PeriodicBackgroundSyncPermissionContext::GetDefaultSearchEngineUrl()
const {
auto* template_url_service = TemplateURLServiceFactory::GetForProfile(
Profile::FromBrowserContext(browser_context()));
DCHECK(template_url_service);
const TemplateURL* default_search_engine =
template_url_service->GetDefaultSearchProvider();
return default_search_engine ? default_search_engine->GenerateSearchURL(
template_url_service->search_terms_data())
: GURL();
}
ContentSetting ContentSetting
PeriodicBackgroundSyncPermissionContext::GetPermissionStatusInternal( PeriodicBackgroundSyncPermissionContext::GetPermissionStatusInternal(
content::RenderFrameHost* render_frame_host, content::RenderFrameHost* render_frame_host,
...@@ -62,10 +92,17 @@ PeriodicBackgroundSyncPermissionContext::GetPermissionStatusInternal( ...@@ -62,10 +92,17 @@ PeriodicBackgroundSyncPermissionContext::GetPermissionStatusInternal(
return CONTENT_SETTING_ALLOW; return CONTENT_SETTING_ALLOW;
#endif #endif
if (!IsPwaInstalled(requesting_origin)) bool can_bypass_install_requirement =
base::FeatureList::IsEnabled(
features::kPeriodicSyncPermissionForDefaultSearchEngine) &&
url::IsSameOriginWith(GetDefaultSearchEngineUrl(), requesting_origin);
if (!can_bypass_install_requirement && !IsPwaInstalled(requesting_origin)) {
return CONTENT_SETTING_BLOCK; return CONTENT_SETTING_BLOCK;
}
// PWA installed. Check for one-shot Background Sync content setting. // |requesting_origin| either has an installed PWA or matches the default
// search engine's origin. Check one-shot Background Sync content setting.
// Expected values are CONTENT_SETTING_BLOCK or CONTENT_SETTING_ALLOW. // Expected values are CONTENT_SETTING_BLOCK or CONTENT_SETTING_ALLOW.
auto* host_content_settings_map = auto* host_content_settings_map =
HostContentSettingsMapFactory::GetForProfile(browser_context()); HostContentSettingsMapFactory::GetForProfile(browser_context());
......
...@@ -43,6 +43,7 @@ class PeriodicBackgroundSyncPermissionContext ...@@ -43,6 +43,7 @@ class PeriodicBackgroundSyncPermissionContext
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
virtual bool IsTwaInstalled(const GURL& origin) const; virtual bool IsTwaInstalled(const GURL& origin) const;
#endif #endif
virtual GURL GetDefaultSearchEngineUrl() const;
private: private:
// PermissionContextBase implementation. // PermissionContextBase implementation.
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <string> #include <string>
#include "base/macros.h" #include "base/macros.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/common/web_application_info.h" #include "chrome/common/web_application_info.h"
...@@ -44,11 +45,20 @@ class TestPeriodicBackgroundSyncPermissionContext ...@@ -44,11 +45,20 @@ class TestPeriodicBackgroundSyncPermissionContext
} }
#endif #endif
GURL GetDefaultSearchEngineUrl() const override {
return default_search_engine_url_;
}
void set_default_search_engine_url(const GURL& default_search_engine_url) {
default_search_engine_url_ = default_search_engine_url;
}
private: private:
std::set<GURL> installed_pwas_; std::set<GURL> installed_pwas_;
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
std::set<GURL> installed_twas_; std::set<GURL> installed_twas_;
#endif #endif
GURL default_search_engine_url_;
}; };
class PeriodicBackgroundSyncPermissionContextTest class PeriodicBackgroundSyncPermissionContextTest
...@@ -105,6 +115,10 @@ class PeriodicBackgroundSyncPermissionContextTest ...@@ -105,6 +115,10 @@ class PeriodicBackgroundSyncPermissionContextTest
SetBackgroundSyncContentSetting(url, CONTENT_SETTING_ALLOW); SetBackgroundSyncContentSetting(url, CONTENT_SETTING_ALLOW);
} }
void SetDefaultSearchEngineUrl(const GURL& url) {
permission_context_->set_default_search_engine_url(url);
}
private: private:
std::unique_ptr<TestPeriodicBackgroundSyncPermissionContext> std::unique_ptr<TestPeriodicBackgroundSyncPermissionContext>
permission_context_; permission_context_;
...@@ -163,4 +177,33 @@ TEST_F(PeriodicBackgroundSyncPermissionContextTest, Twa) { ...@@ -163,4 +177,33 @@ TEST_F(PeriodicBackgroundSyncPermissionContextTest, Twa) {
} }
#endif #endif
TEST_F(PeriodicBackgroundSyncPermissionContextTest, DefaultSearchEngine) {
GURL requesting_origin("https://example.com");
// 1. Flag disabled (by default)
SetDefaultSearchEngineUrl(GURL("https://example.com/foo?q=asdf"));
EXPECT_EQ(GetPermissionStatus(requesting_origin), CONTENT_SETTING_BLOCK);
// Enable the flag for the rest of the test
base::test::ScopedFeatureList feature_list;
feature_list.InitFromCommandLine(
"PeriodicSyncPermissionForDefaultSearchEngine", "");
// 2. No default search engine
SetDefaultSearchEngineUrl(GURL());
EXPECT_EQ(GetPermissionStatus(requesting_origin), CONTENT_SETTING_BLOCK);
// 3. Default search engine doesn't match
SetDefaultSearchEngineUrl(GURL("https://differentexample.com"));
EXPECT_EQ(GetPermissionStatus(requesting_origin), CONTENT_SETTING_BLOCK);
// 4. Default search engine matches
SetDefaultSearchEngineUrl(GURL("https://example.com/foo?q=asdf"));
EXPECT_EQ(GetPermissionStatus(requesting_origin), CONTENT_SETTING_ALLOW);
// 5. Default search engine matches but no BACKGROUND_SYNC permission.
SetBackgroundSyncContentSetting(requesting_origin, CONTENT_SETTING_BLOCK);
EXPECT_EQ(GetPermissionStatus(requesting_origin), CONTENT_SETTING_BLOCK);
}
} // namespace } // namespace
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment