Commit a9c769de authored by shahriar rostami's avatar shahriar rostami Committed by Commit Bot

Make default options in Page Info remain there until the page is reloaded or navigated

When non-default content settings changed to default, they should be kept in
Page Info because user might need to change them again.

If the navigation or refresh happens, content settings with default value
should not be shown in Page Info anymore.

Bug: 777275
Change-Id: Ica986ee6646b833bf47da05fb39abb786ce2259a
Reviewed-on: https://chromium-review.googlesource.com/792790
Commit-Queue: Raymes Khoury <raymes@chromium.org>
Reviewed-by: default avatarRaymes Khoury <raymes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#522006}
parent 931c894e
...@@ -840,6 +840,7 @@ void TabSpecificContentSettings::DidStartNavigation( ...@@ -840,6 +840,7 @@ void TabSpecificContentSettings::DidStartNavigation(
ClearGeolocationContentSettings(); ClearGeolocationContentSettings();
ClearMidiContentSettings(); ClearMidiContentSettings();
ClearPendingProtocolHandler(); ClearPendingProtocolHandler();
ClearContentSettingsChangedViaPageInfo();
} }
void TabSpecificContentSettings::DidFinishNavigation( void TabSpecificContentSettings::DidFinishNavigation(
...@@ -895,6 +896,10 @@ void TabSpecificContentSettings::ClearMidiContentSettings() { ...@@ -895,6 +896,10 @@ void TabSpecificContentSettings::ClearMidiContentSettings() {
midi_usages_state_.ClearStateMap(); midi_usages_state_.ClearStateMap();
} }
void TabSpecificContentSettings::ClearContentSettingsChangedViaPageInfo() {
content_settings_changed_via_page_info_.clear();
}
void TabSpecificContentSettings::GeolocationDidNavigate( void TabSpecificContentSettings::GeolocationDidNavigate(
content::NavigationHandle* navigation_handle) { content::NavigationHandle* navigation_handle) {
geolocation_usages_state_.DidNavigate(navigation_handle->GetURL(), geolocation_usages_state_.DidNavigate(navigation_handle->GetURL(),
...@@ -933,3 +938,14 @@ void TabSpecificContentSettings::BlockAllContentForTesting() { ...@@ -933,3 +938,14 @@ void TabSpecificContentSettings::BlockAllContentForTesting() {
media_blocked, media_blocked,
std::string(), std::string(), std::string(), std::string()); std::string(), std::string(), std::string(), std::string());
} }
void TabSpecificContentSettings::ContentSettingChangedViaPageInfo(
ContentSettingsType type) {
content_settings_changed_via_page_info_.insert(type);
}
bool TabSpecificContentSettings::HasContentSettingChangedViaPageInfo(
ContentSettingsType type) const {
return content_settings_changed_via_page_info_.find(type) !=
content_settings_changed_via_page_info_.end();
}
...@@ -383,6 +383,13 @@ class TabSpecificContentSettings ...@@ -383,6 +383,13 @@ class TabSpecificContentSettings
// Block all content. Used for testing content setting bubbles. // Block all content. Used for testing content setting bubbles.
void BlockAllContentForTesting(); void BlockAllContentForTesting();
// Stores content settings changed by the user via PageInfo.
void ContentSettingChangedViaPageInfo(ContentSettingsType type);
// Returns true if the user changed the given ContentSettingsType via PageInfo
// since the last navigation.
bool HasContentSettingChangedViaPageInfo(ContentSettingsType type) const;
private: private:
friend class content::WebContentsUserData<TabSpecificContentSettings>; friend class content::WebContentsUserData<TabSpecificContentSettings>;
...@@ -415,6 +422,9 @@ class TabSpecificContentSettings ...@@ -415,6 +422,9 @@ class TabSpecificContentSettings
// Clears the MIDI settings. // Clears the MIDI settings.
void ClearMidiContentSettings(); void ClearMidiContentSettings();
// Clears settings changed by the user via PageInfo since the last navigation.
void ClearContentSettingsChangedViaPageInfo();
// Updates Geolocation settings on navigation. // Updates Geolocation settings on navigation.
void GeolocationDidNavigate(content::NavigationHandle* navigation_handle); void GeolocationDidNavigate(content::NavigationHandle* navigation_handle);
...@@ -479,6 +489,10 @@ class TabSpecificContentSettings ...@@ -479,6 +489,10 @@ class TabSpecificContentSettings
// Observer to watch for content settings changed. // Observer to watch for content settings changed.
ScopedObserver<HostContentSettingsMap, content_settings::Observer> observer_; ScopedObserver<HostContentSettingsMap, content_settings::Observer> observer_;
// Stores content settings changed by the user via page info since the last
// navigation. Used to determine whether to display the settings in page info.
std::set<ContentSettingsType> content_settings_changed_via_page_info_;
DISALLOW_COPY_AND_ASSIGN(TabSpecificContentSettings); DISALLOW_COPY_AND_ASSIGN(TabSpecificContentSettings);
}; };
......
...@@ -140,10 +140,12 @@ bool IsPermissionFactoryDefault(HostContentSettingsMap* content_settings, ...@@ -140,10 +140,12 @@ bool IsPermissionFactoryDefault(HostContentSettingsMap* content_settings,
// Determines whether to show permission |type| in the Page Info UI. Only // Determines whether to show permission |type| in the Page Info UI. Only
// applies to permissions listed in |kPermissionType|. // applies to permissions listed in |kPermissionType|.
bool ShouldShowPermission(const PageInfoUI::PermissionInfo& info, bool ShouldShowPermission(
const PageInfoUI::PermissionInfo& info,
const GURL& site_url, const GURL& site_url,
HostContentSettingsMap* content_settings, HostContentSettingsMap* content_settings,
content::WebContents* web_contents) { content::WebContents* web_contents,
TabSpecificContentSettings* tab_specific_content_settings) {
// Note |CONTENT_SETTINGS_TYPE_ADS| will show up regardless of its default // Note |CONTENT_SETTINGS_TYPE_ADS| will show up regardless of its default
// value when it has been activated on the current origin. // value when it has been activated on the current origin.
if (info.type == CONTENT_SETTINGS_TYPE_ADS) { if (info.type == CONTENT_SETTINGS_TYPE_ADS) {
...@@ -181,18 +183,24 @@ bool ShouldShowPermission(const PageInfoUI::PermissionInfo& info, ...@@ -181,18 +183,24 @@ bool ShouldShowPermission(const PageInfoUI::PermissionInfo& info,
return true; return true;
#endif #endif
// All other content settings only show when they are non-factory-default.
if (IsPermissionFactoryDefault(content_settings, info)) {
return false;
}
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
// Autoplay is Android-only at the moment. // Autoplay is Android-only at the moment.
if (info.type == CONTENT_SETTINGS_TYPE_AUTOPLAY) if (info.type == CONTENT_SETTINGS_TYPE_AUTOPLAY)
return false; return false;
#endif #endif
// Show the content setting if it has been changed by the user since the last
// page load.
if (tab_specific_content_settings->HasContentSettingChangedViaPageInfo(
info.type)) {
return true; return true;
}
// Show the content setting when it has a non-default value.
if (!IsPermissionFactoryDefault(content_settings, info))
return true;
return false;
} }
void CheckContentStatus(security_state::ContentStatus content_status, void CheckContentStatus(security_state::ContentStatus content_status,
...@@ -399,6 +407,8 @@ void PageInfo::RecordPageInfoAction(PageInfoAction action) { ...@@ -399,6 +407,8 @@ void PageInfo::RecordPageInfoAction(PageInfoAction action) {
void PageInfo::OnSitePermissionChanged(ContentSettingsType type, void PageInfo::OnSitePermissionChanged(ContentSettingsType type,
ContentSetting setting) { ContentSetting setting) {
tab_specific_content_settings()->ContentSettingChangedViaPageInfo(type);
// Count how often a permission for a specific content type is changed using // Count how often a permission for a specific content type is changed using
// the Page Info UI. // the Page Info UI.
size_t num_values; size_t num_values;
...@@ -840,7 +850,7 @@ void PageInfo::PresentSitePermissions() { ...@@ -840,7 +850,7 @@ void PageInfo::PresentSitePermissions() {
} }
if (ShouldShowPermission(permission_info, site_url_, content_settings_, if (ShouldShowPermission(permission_info, site_url_, content_settings_,
web_contents())) { web_contents(), tab_specific_content_settings())) {
permission_info_list.push_back(permission_info); permission_info_list.push_back(permission_info);
} }
} }
......
...@@ -185,9 +185,9 @@ class PageInfo : public TabSpecificContentSettings::SiteDataObserver, ...@@ -185,9 +185,9 @@ class PageInfo : public TabSpecificContentSettings::SiteDataObserver,
void OnSiteDataAccessed() override; void OnSiteDataAccessed() override;
private: private:
FRIEND_TEST_ALL_PREFIXES(PageInfoTest, NonFactoryDefaultPermissionsShown); FRIEND_TEST_ALL_PREFIXES(PageInfoTest,
NonFactoryDefaultAndRecentlyChangedPermissionsShown);
friend class PageInfoBubbleViewBrowserTest; friend class PageInfoBubbleViewBrowserTest;
// Initializes the |PageInfo|. // Initializes the |PageInfo|.
void Init(const GURL& url, const security_state::SecurityInfo& security_info); void Init(const GURL& url, const security_state::SecurityInfo& security_info);
......
...@@ -211,7 +211,7 @@ bool PermissionInfoListContainsPermission(const PermissionInfoList& permissions, ...@@ -211,7 +211,7 @@ bool PermissionInfoListContainsPermission(const PermissionInfoList& permissions,
} // namespace } // namespace
TEST_F(PageInfoTest, NonFactoryDefaultPermissionsShown) { TEST_F(PageInfoTest, NonFactoryDefaultAndRecentlyChangedPermissionsShown) {
page_info()->PresentSitePermissions(); page_info()->PresentSitePermissions();
// By default, the number of permissions shown should be 0, except on Android, // By default, the number of permissions shown should be 0, except on Android,
// where Geolocation needs to be checked for DSE settings. // where Geolocation needs to be checked for DSE settings.
...@@ -221,7 +221,7 @@ TEST_F(PageInfoTest, NonFactoryDefaultPermissionsShown) { ...@@ -221,7 +221,7 @@ TEST_F(PageInfoTest, NonFactoryDefaultPermissionsShown) {
EXPECT_EQ(0uL, last_permission_info_list().size()); EXPECT_EQ(0uL, last_permission_info_list().size());
#endif #endif
std::vector<ContentSettingsType> non_default_permissions = { std::vector<ContentSettingsType> expected_visible_permissions = {
CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
}; };
...@@ -232,46 +232,54 @@ TEST_F(PageInfoTest, NonFactoryDefaultPermissionsShown) { ...@@ -232,46 +232,54 @@ TEST_F(PageInfoTest, NonFactoryDefaultPermissionsShown) {
CONTENT_SETTING_ALLOW); CONTENT_SETTING_ALLOW);
page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
CONTENT_SETTING_ALLOW); CONTENT_SETTING_ALLOW);
EXPECT_EQ(non_default_permissions.size(), last_permission_info_list().size()); EXPECT_EQ(expected_visible_permissions.size(),
last_permission_info_list().size());
non_default_permissions.push_back(CONTENT_SETTINGS_TYPE_POPUPS); expected_visible_permissions.push_back(CONTENT_SETTINGS_TYPE_POPUPS);
// Change a default-block setting to a user-preference block instead. // Change a default-block setting to a user-preference block instead.
page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_POPUPS, page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_POPUPS,
CONTENT_SETTING_BLOCK); CONTENT_SETTING_BLOCK);
EXPECT_EQ(non_default_permissions.size(), last_permission_info_list().size()); EXPECT_EQ(expected_visible_permissions.size(),
last_permission_info_list().size());
non_default_permissions.push_back(CONTENT_SETTINGS_TYPE_JAVASCRIPT); expected_visible_permissions.push_back(CONTENT_SETTINGS_TYPE_JAVASCRIPT);
// Change a default-allow setting away from the default. // Change a default-allow setting away from the default.
page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_JAVASCRIPT, page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_JAVASCRIPT,
CONTENT_SETTING_BLOCK); CONTENT_SETTING_BLOCK);
EXPECT_EQ(non_default_permissions.size(), last_permission_info_list().size()); EXPECT_EQ(expected_visible_permissions.size(),
last_permission_info_list().size());
// Make sure setting a default setting to the default doesn't do anything. // Make sure changing a setting to its default causes it to show up, since it
// has been recently changed.
expected_visible_permissions.push_back(
CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
CONTENT_SETTING_DEFAULT); CONTENT_SETTING_DEFAULT);
EXPECT_EQ(non_default_permissions.size(), last_permission_info_list().size()); EXPECT_EQ(expected_visible_permissions.size(),
last_permission_info_list().size());
non_default_permissions.pop_back(); // Set the Javascript setting to default should keep it shown.
// Clear the Javascript setting.
page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_JAVASCRIPT, page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_JAVASCRIPT,
CONTENT_SETTING_DEFAULT); CONTENT_SETTING_DEFAULT);
EXPECT_EQ(non_default_permissions.size(), last_permission_info_list().size()); EXPECT_EQ(expected_visible_permissions.size(),
last_permission_info_list().size());
non_default_permissions.push_back(CONTENT_SETTINGS_TYPE_JAVASCRIPT);
// Change the default setting for Javascript away from the factory default. // Change the default setting for Javascript away from the factory default.
page_info()->content_settings_->SetDefaultContentSetting( page_info()->content_settings_->SetDefaultContentSetting(
CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK); CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK);
page_info()->PresentSitePermissions(); page_info()->PresentSitePermissions();
EXPECT_EQ(non_default_permissions.size(), last_permission_info_list().size()); EXPECT_EQ(expected_visible_permissions.size(),
last_permission_info_list().size());
// Change it back to ALLOW, which is its factory default, but has a source // Change it back to ALLOW, which is its factory default, but has a source
// from the user preference (i.e. it counts as non-factory default). // from the user preference (i.e. it counts as non-factory default).
page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_JAVASCRIPT, page_info()->OnSitePermissionChanged(CONTENT_SETTINGS_TYPE_JAVASCRIPT,
CONTENT_SETTING_ALLOW); CONTENT_SETTING_ALLOW);
EXPECT_EQ(non_default_permissions.size(), last_permission_info_list().size()); EXPECT_EQ(expected_visible_permissions.size(),
last_permission_info_list().size());
// Sanity check the correct permissions are being shown. // Sanity check the correct permissions are being shown.
for (ContentSettingsType type : non_default_permissions) { for (ContentSettingsType type : expected_visible_permissions) {
EXPECT_TRUE(PermissionInfoListContainsPermission( EXPECT_TRUE(PermissionInfoListContainsPermission(
last_permission_info_list(), type)); last_permission_info_list(), type));
} }
......
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