summaryrefslogtreecommitdiffstats
path: root/ios
diff options
context:
space:
mode:
authorsdefresne <sdefresne@chromium.org>2016-03-10 09:13:59 -0800
committerCommit bot <commit-bot@chromium.org>2016-03-10 17:15:00 +0000
commit3dc0396d2e33ba209d4de3da5a8c67e2e5f76747 (patch)
treeb921bb2cb104e4ffbd64cd4bdf81181626af8fb5 /ios
parentd3087274234c4250b3919962ae07180fd6fd005a (diff)
downloadchromium_src-3dc0396d2e33ba209d4de3da5a8c67e2e5f76747.zip
chromium_src-3dc0396d2e33ba209d4de3da5a8c67e2e5f76747.tar.gz
chromium_src-3dc0396d2e33ba209d4de3da5a8c67e2e5f76747.tar.bz2
[iOS] Upstream BrowsingDataRemoverHelper.
BrowsingDataRemoverHelper is an helper class that serializes usage of IOSChromeBrowsingDataRemover methods as they are not reentrant. BUG=None Review URL: https://codereview.chromium.org/1778353003 Cr-Commit-Position: refs/heads/master@{#380424}
Diffstat (limited to 'ios')
-rw-r--r--ios/chrome/browser/BUILD.gn6
-rw-r--r--ios/chrome/browser/browsing_data/browsing_data_change_listening.h (renamed from ios/chrome/browser/browsing_data_change_listening.h)6
-rw-r--r--ios/chrome/browser/browsing_data/browsing_data_remover_helper.cc98
-rw-r--r--ios/chrome/browser/browsing_data/browsing_data_remover_helper.h71
-rw-r--r--ios/chrome/browser/net/chrome_cookie_store_ios_client.mm2
-rw-r--r--ios/chrome/ios_chrome.gyp8
6 files changed, 183 insertions, 8 deletions
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn
index f0ee057..84a5d34 100644
--- a/ios/chrome/browser/BUILD.gn
+++ b/ios/chrome/browser/BUILD.gn
@@ -85,7 +85,11 @@ source_set("browser") {
"browser_state/off_the_record_chrome_browser_state_io_data.mm",
"browser_state_metrics/browser_state_metrics.cc",
"browser_state_metrics/browser_state_metrics.h",
- "browsing_data_change_listening.h",
+ "browsing_data/browsing_data_change_listening.h",
+ "browsing_data/browsing_data_remover_helper.cc",
+ "browsing_data/browsing_data_remover_helper.h",
+ "browsing_data/ios_chrome_browsing_data_remover.h",
+ "browsing_data/ios_chrome_browsing_data_remover.mm",
"chrome_constants.cc",
"chrome_constants.h",
"chrome_paths.h",
diff --git a/ios/chrome/browser/browsing_data_change_listening.h b/ios/chrome/browser/browsing_data/browsing_data_change_listening.h
index 2c0afe8..ca5284a 100644
--- a/ios/chrome/browser/browsing_data_change_listening.h
+++ b/ios/chrome/browser/browsing_data/browsing_data_change_listening.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_CHANGE_LISTENING_H_
-#define IOS_CHROME_BROWSER_BROWSING_DATA_CHANGE_LISTENING_H_
+#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_CHANGE_LISTENING_H_
+#define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_CHANGE_LISTENING_H_
// Listener for changes in browsing data.
@protocol BrowsingDataChangeListening
@@ -11,4 +11,4 @@
- (void)didChangeCookieStorage;
@end
-#endif // IOS_CHROME_BROWSER_BROWSING_DATA_CHANGE_LISTENING_H_
+#endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_CHANGE_LISTENING_H_
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover_helper.cc b/ios/chrome/browser/browsing_data/browsing_data_remover_helper.cc
new file mode 100644
index 0000000..3df5741
--- /dev/null
+++ b/ios/chrome/browser/browsing_data/browsing_data_remover_helper.cc
@@ -0,0 +1,98 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/chrome/browser/browsing_data/browsing_data_remover_helper.h"
+
+#include <utility>
+
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+
+BrowsingDataRemoverHelper::BrowsingDataRemoverHelper()
+ : current_remover_(nullptr) {}
+
+BrowsingDataRemoverHelper::~BrowsingDataRemoverHelper() {
+ DCHECK(pending_removals_.empty());
+}
+
+BrowsingDataRemoverHelper::BrowsingDataRemovalInfo::BrowsingDataRemovalInfo(
+ int remove_mask,
+ const base::Closure& callback)
+ : remove_mask(remove_mask) {
+ callbacks.push_back(callback);
+}
+
+BrowsingDataRemoverHelper::BrowsingDataRemovalInfo::~BrowsingDataRemovalInfo() {
+}
+
+void BrowsingDataRemoverHelper::Remove(ios::ChromeBrowserState* browser_state,
+ int remove_mask,
+ const base::Closure& callback) {
+ DCHECK(browser_state);
+ DCHECK(!browser_state->IsOffTheRecord());
+ // IOSChromeBrowsingDataRemover::Callbacks are called before
+ // OnIOSChromeBrowsingDataRemoverDone() and after
+ // IOSChromeBrowsingDataRemover::is_removing() is set to false. In this
+ // window, |current_remover_| needs to be checked as well.
+ if (current_remover_ || IOSChromeBrowsingDataRemover::is_removing()) {
+ // IOSChromeBrowsingDataRemover is not re-entrant. If it is already running,
+ // add the browser_state to |pending_removals_| for later deletion. If the
+ // browser_state is already scheduled for removal of browsing data, update
+ // the remove mask and callbacks.
+ DCHECK(current_remover_);
+ auto pending_removals_iter = pending_removals_.find(browser_state);
+ if (pending_removals_iter == pending_removals_.end()) {
+ scoped_ptr<BrowsingDataRemovalInfo> removal_info(
+ new BrowsingDataRemovalInfo(remove_mask, callback));
+ pending_removals_[browser_state] = std::move(removal_info);
+ } else {
+ pending_removals_iter->second->remove_mask |= remove_mask;
+ pending_removals_iter->second->callbacks.push_back(callback);
+ }
+ } else {
+ scoped_ptr<BrowsingDataRemovalInfo> removal_info(
+ new BrowsingDataRemovalInfo(remove_mask, callback));
+ DoRemove(browser_state, std::move(removal_info));
+ }
+}
+
+void BrowsingDataRemoverHelper::OnIOSChromeBrowsingDataRemoverDone() {
+ current_remover_ = nullptr;
+
+ DCHECK(current_removal_info_);
+ // Inform clients of the currently finished removal operation that browsing
+ // data was removed.
+ for (const auto& callback : current_removal_info_->callbacks) {
+ if (!callback.is_null()) {
+ callback.Run();
+ }
+ }
+ current_removal_info_.reset();
+
+ if (pending_removals_.empty())
+ return;
+
+ ios::ChromeBrowserState* next_browser_state =
+ pending_removals_.begin()->first;
+ scoped_ptr<BrowsingDataRemovalInfo> removal_info =
+ std::move(pending_removals_[next_browser_state]);
+ pending_removals_.erase(next_browser_state);
+ DoRemove(next_browser_state, std::move(removal_info));
+}
+
+void BrowsingDataRemoverHelper::DoRemove(
+ ios::ChromeBrowserState* browser_state,
+ scoped_ptr<BrowsingDataRemovalInfo> removal_info) {
+ DCHECK(!current_remover_ && !IOSChromeBrowsingDataRemover::is_removing());
+
+ current_removal_info_ = std::move(removal_info);
+
+ // IOSChromeBrowsingDataRemover deletes itself.
+ IOSChromeBrowsingDataRemover* remover =
+ IOSChromeBrowsingDataRemover::CreateForPeriod(
+ browser_state, IOSChromeBrowsingDataRemover::EVERYTHING);
+ remover->AddObserver(this);
+ current_remover_ = remover;
+ int remove_mask = current_removal_info_->remove_mask;
+ remover->Remove(remove_mask);
+}
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover_helper.h b/ios/chrome/browser/browsing_data/browsing_data_remover_helper.h
new file mode 100644
index 0000000..9ae632a
--- /dev/null
+++ b/ios/chrome/browser/browsing_data/browsing_data_remover_helper.h
@@ -0,0 +1,71 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_HELPER_H_
+#define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_HELPER_H_
+
+#include <map>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/memory/scoped_ptr.h"
+#include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h"
+
+namespace ios {
+class ChromeBrowserState;
+}
+
+// A helper class that serializes execution of IOSChromeBrowsingDataRemover
+// methods since the IOSChromeBrowsingDataRemover APIs are not re-entrant.
+class BrowsingDataRemoverHelper
+ : public IOSChromeBrowsingDataRemover::Observer {
+ public:
+ BrowsingDataRemoverHelper();
+ ~BrowsingDataRemoverHelper() override;
+
+ // Removes the specified browsing data associated with |browser_state|. Calls
+ // |callback| when the browsing data is actually removed. |browser_state|
+ // cannot be null and must not be off the record.
+ // |callback| is called on the main thread.
+ // Note: Removal operations are not necessarily processed in the sequence that
+ // they are received in.
+ void Remove(ios::ChromeBrowserState* browser_state,
+ int remove_mask,
+ const base::Closure& callback);
+
+ private:
+ // Encapsulates the information that is needed to remove browsing data from
+ // a ChromeBrowserState.
+ struct BrowsingDataRemovalInfo {
+ // Creates a BrowsingDataRemovalInfo with a single callback |callback|.
+ BrowsingDataRemovalInfo(int remove_mask, const base::Closure& callback);
+ ~BrowsingDataRemovalInfo();
+ // The mask of all the types of browsing data that needs to be removed.
+ // Obtained from BrowsingDataRemoved::RemoveDataMask.
+ int remove_mask;
+ // The vector of callbacks that need to be run when browsing data is
+ // actually removed.
+ std::vector<base::Closure> callbacks;
+ };
+
+ // IOSChromeBrowsingDataRemover::Observer methods.
+ void OnIOSChromeBrowsingDataRemoverDone() override;
+
+ // Removes the browsing data using IOSChromeBrowsingDataRemover.
+ // IOSChromeBrowsingDataRemover
+ // must not be running.
+ void DoRemove(ios::ChromeBrowserState* browser_state,
+ scoped_ptr<BrowsingDataRemovalInfo> removal_info);
+
+ // A map that contains the all the ChromeBrowserStates that have a removal
+ // operation pending along with their associated BrowsingDataRemovalInfo.
+ std::map<ios::ChromeBrowserState*, scoped_ptr<BrowsingDataRemovalInfo>>
+ pending_removals_;
+ // The BrowsingDataRemovalInfo of the currently enqueued removal operation.
+ scoped_ptr<BrowsingDataRemovalInfo> current_removal_info_;
+ // The actual object that perfoms the removal of browsing data.
+ IOSChromeBrowsingDataRemover* current_remover_;
+};
+
+#endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_HELPER_H_
diff --git a/ios/chrome/browser/net/chrome_cookie_store_ios_client.mm b/ios/chrome/browser/net/chrome_cookie_store_ios_client.mm
index 9d0e74b..d3b8235 100644
--- a/ios/chrome/browser/net/chrome_cookie_store_ios_client.mm
+++ b/ios/chrome/browser/net/chrome_cookie_store_ios_client.mm
@@ -5,7 +5,7 @@
#include "ios/chrome/browser/net/chrome_cookie_store_ios_client.h"
#include "base/logging.h"
-#import "ios/chrome/browser/browsing_data_change_listening.h"
+#import "ios/chrome/browser/browsing_data/browsing_data_change_listening.h"
#include "ios/web/public/web_thread.h"
ChromeCookieStoreIOSClient::ChromeCookieStoreIOSClient(
diff --git a/ios/chrome/ios_chrome.gyp b/ios/chrome/ios_chrome.gyp
index d6dd668..50d18a7 100644
--- a/ios/chrome/ios_chrome.gyp
+++ b/ios/chrome/ios_chrome.gyp
@@ -220,9 +220,11 @@
'browser/browser_state/off_the_record_chrome_browser_state_io_data.mm',
'browser/browser_state_metrics/browser_state_metrics.cc',
'browser/browser_state_metrics/browser_state_metrics.h',
+ 'browser/browsing_data/browsing_data_change_listening.h',
+ 'browser/browsing_data/browsing_data_remover_helper.cc',
+ 'browser/browsing_data/browsing_data_remover_helper.h',
'browser/browsing_data/ios_chrome_browsing_data_remover.h',
'browser/browsing_data/ios_chrome_browsing_data_remover.mm',
- 'browser/browsing_data_change_listening.h',
'browser/chrome_constants.cc',
'browser/chrome_constants.h',
'browser/chrome_paths.h',
@@ -659,10 +661,10 @@
'browser/variations/ios_chrome_variations_service_client.h',
'browser/web/dom_altering_lock.h',
'browser/web/dom_altering_lock.mm',
- 'browser/web/web_view_type_util.h',
- 'browser/web/web_view_type_util.mm',
'browser/web/resubmit_data_controller.h',
'browser/web/resubmit_data_controller.mm',
+ 'browser/web/web_view_type_util.h',
+ 'browser/web/web_view_type_util.mm',
'browser/web_data_service_factory.cc',
'browser/web_data_service_factory.h',
'browser/web_resource/web_resource_util.cc',