Delete and count zoom levels in CBD
Add support to delete and count ZoomLevels in order to integrate
them with Site Settings deletion for Clear Browsing Data.
In order to delete ZoomLevels by time period, I'm storing a timestamp
for each zoomlevel to indicate when it was last edited.
The timestamp is only stored if the flag TabsInCBD is activated to
prevent recording it before the new UI for CBD is ready.
Bug: 725401, 137412
Change-Id: I39ad649cf9bc8ab67e998e7a14c85cf7b153dc70
Reviewed-on: https://chromium-review.googlesource.com/623752
Commit-Queue: Christian Dullweber <[email protected]>
Reviewed-by: Charlie Reis <[email protected]>
Reviewed-by: James MacLean <[email protected]>
Reviewed-by: Martin Šrámek <[email protected]>
Cr-Commit-Position: refs/heads/master@{#499464}
diff --git a/content/browser/host_zoom_map_impl.cc b/content/browser/host_zoom_map_impl.cc
index 9c7d78f..788cef3 100644
--- a/content/browser/host_zoom_map_impl.cc
+++ b/content/browser/host_zoom_map_impl.cc
@@ -9,6 +9,7 @@
#include "base/strings/string_piece.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/time/default_clock.h"
#include "base/values.h"
#include "content/browser/frame_host/navigation_entry_impl.h"
#include "content/browser/renderer_host/render_process_host_impl.h"
@@ -114,8 +115,9 @@
}
HostZoomMapImpl::HostZoomMapImpl()
- : default_zoom_level_(0.0) {
-}
+ : default_zoom_level_(0.0),
+ store_last_modified_(false),
+ clock_(new base::DefaultClock) {}
void HostZoomMapImpl::CopyFrom(HostZoomMap* copy_interface) {
// This can only be called on the UI thread to avoid deadlocks, otherwise
@@ -146,7 +148,7 @@
double HostZoomMapImpl::GetZoomLevelForHostInternal(
const std::string& host) const {
HostZoomLevels::const_iterator i(host_zoom_levels_.find(host));
- return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second;
+ return (i == host_zoom_levels_.end()) ? default_zoom_level_ : i->second.level;
}
bool HostZoomMapImpl::HasZoomLevel(const std::string& scheme,
@@ -173,7 +175,7 @@
if (scheme_iterator != scheme_host_zoom_levels_.end()) {
HostZoomLevels::const_iterator i(scheme_iterator->second.find(host));
if (i != scheme_iterator->second.end())
- return i->second;
+ return i->second.level;
}
return GetZoomLevelForHostInternal(host);
@@ -191,29 +193,26 @@
{
base::AutoLock auto_lock(lock_);
result.reserve(host_zoom_levels_.size() + scheme_host_zoom_levels_.size());
- for (HostZoomLevels::const_iterator i = host_zoom_levels_.begin();
- i != host_zoom_levels_.end();
- ++i) {
- ZoomLevelChange change = {HostZoomMap::ZOOM_CHANGED_FOR_HOST,
- i->first, // host
- std::string(), // scheme
- i->second // zoom level
+ for (const auto& entry : host_zoom_levels_) {
+ ZoomLevelChange change = {
+ HostZoomMap::ZOOM_CHANGED_FOR_HOST,
+ entry.first, // host
+ std::string(), // scheme
+ entry.second.level, // zoom level
+ entry.second.last_modified // last modified
};
result.push_back(change);
}
- for (SchemeHostZoomLevels::const_iterator i =
- scheme_host_zoom_levels_.begin();
- i != scheme_host_zoom_levels_.end();
- ++i) {
- const std::string& scheme = i->first;
- const HostZoomLevels& host_zoom_levels = i->second;
- for (HostZoomLevels::const_iterator j = host_zoom_levels.begin();
- j != host_zoom_levels.end();
- ++j) {
- ZoomLevelChange change = {HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST,
- j->first, // host
- scheme, // scheme
- j->second // zoom level
+ for (const auto& scheme_entry : scheme_host_zoom_levels_) {
+ const std::string& scheme = scheme_entry.first;
+ const HostZoomLevels& host_zoom_levels = scheme_entry.second;
+ for (const auto& entry : host_zoom_levels) {
+ ZoomLevelChange change = {
+ HostZoomMap::ZOOM_CHANGED_FOR_SCHEME_AND_HOST,
+ entry.first, // host
+ scheme, // scheme
+ entry.second.level, // zoom level
+ entry.second.last_modified // last modified
};
result.push_back(change);
}
@@ -224,15 +223,32 @@
void HostZoomMapImpl::SetZoomLevelForHost(const std::string& host,
double level) {
+ base::Time last_modified =
+ store_last_modified_ ? clock_->Now() : base::Time();
+ SetZoomLevelForHostInternal(host, level, last_modified);
+}
+
+void HostZoomMapImpl::InitializeZoomLevelForHost(const std::string& host,
+ double level,
+ base::Time last_modified) {
+ SetZoomLevelForHostInternal(host, level, last_modified);
+}
+
+void HostZoomMapImpl::SetZoomLevelForHostInternal(const std::string& host,
+ double level,
+ base::Time last_modified) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
{
base::AutoLock auto_lock(lock_);
- if (ZoomValuesEqual(level, default_zoom_level_))
+ if (ZoomValuesEqual(level, default_zoom_level_)) {
host_zoom_levels_.erase(host);
- else
- host_zoom_levels_[host] = level;
+ } else {
+ ZoomLevel& zoomLevel = host_zoom_levels_[host];
+ zoomLevel.level = level;
+ zoomLevel.last_modified = last_modified;
+ }
}
// TODO(wjmaclean) Should we use a GURL here? crbug.com/384486
@@ -242,6 +258,7 @@
change.mode = HostZoomMap::ZOOM_CHANGED_FOR_HOST;
change.host = host;
change.zoom_level = level;
+ change.last_modified = last_modified;
zoom_level_changed_callbacks_.Notify(change);
}
@@ -252,7 +269,9 @@
DCHECK_CURRENTLY_ON(BrowserThread::UI);
{
base::AutoLock auto_lock(lock_);
- scheme_host_zoom_levels_[scheme][host] = level;
+ // No last_modified timestamp for scheme and host because they are
+ // not persistet and are used for special cases only.
+ scheme_host_zoom_levels_[scheme][host].level = level;
}
SendZoomLevelChange(scheme, host, level);
@@ -262,6 +281,7 @@
change.host = host;
change.scheme = scheme;
change.zoom_level = level;
+ change.last_modified = base::Time();
zoom_level_changed_callbacks_.Notify(change);
}
@@ -283,7 +303,7 @@
{
base::AutoLock auto_lock(lock_);
for (auto it = host_zoom_levels_.begin(); it != host_zoom_levels_.end(); ) {
- if (ZoomValuesEqual(it->second, default_zoom_level_))
+ if (ZoomValuesEqual(it->second.level, default_zoom_level_))
it = host_zoom_levels_.erase(it);
else
it++;
@@ -485,6 +505,21 @@
net::GetHostOrSpecFromURL(url));
}
+void HostZoomMapImpl::ClearZoomLevels(base::Time delete_begin,
+ base::Time delete_end) {
+ double default_zoom_level = GetDefaultZoomLevel();
+ for (auto& zoom_level : GetAllZoomLevels()) {
+ if (zoom_level.scheme.empty() && delete_begin <= zoom_level.last_modified &&
+ (delete_end.is_null() || zoom_level.last_modified < delete_end)) {
+ SetZoomLevelForHost(zoom_level.host, default_zoom_level);
+ }
+ }
+}
+
+void HostZoomMapImpl::SetStoreLastModified(bool store_last_modified) {
+ store_last_modified_ = store_last_modified;
+}
+
void HostZoomMapImpl::ClearTemporaryZoomLevel(int render_process_id,
int render_view_id) {
{
@@ -541,4 +576,8 @@
DCHECK_CURRENTLY_ON(BrowserThread::UI);
}
+void HostZoomMapImpl::SetClockForTesting(std::unique_ptr<base::Clock> clock) {
+ clock_ = std::move(clock);
+}
+
} // namespace content