diff options
Diffstat (limited to 'ios')
-rw-r--r-- | ios/chrome/browser/BUILD.gn | 6 | ||||
-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.cc | 98 | ||||
-rw-r--r-- | ios/chrome/browser/browsing_data/browsing_data_remover_helper.h | 71 | ||||
-rw-r--r-- | ios/chrome/browser/net/chrome_cookie_store_ios_client.mm | 2 | ||||
-rw-r--r-- | ios/chrome/ios_chrome.gyp | 8 |
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', |