Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ | 5 #ifndef CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ |
| 6 #define CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ | 6 #define CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <queue> | |
| 10 #include <set> | 11 #include <set> |
| 11 | 12 |
| 12 #include "base/callback_forward.h" | 13 #include "base/callback_forward.h" |
| 13 #include "base/gtest_prod_util.h" | 14 #include "base/gtest_prod_util.h" |
| 14 #include "base/macros.h" | 15 #include "base/macros.h" |
| 15 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
| 16 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
| 17 #include "base/observer_list.h" | 18 #include "base/observer_list.h" |
| 18 #include "base/sequenced_task_runner_helpers.h" | 19 #include "base/sequenced_task_runner_helpers.h" |
| 19 #include "base/synchronization/waitable_event_watcher.h" | 20 #include "base/synchronization/waitable_event_watcher.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 56 } | 57 } |
| 57 | 58 |
| 58 namespace net { | 59 namespace net { |
| 59 class URLRequestContextGetter; | 60 class URLRequestContextGetter; |
| 60 } | 61 } |
| 61 | 62 |
| 62 #if BUILDFLAG(ANDROID_JAVA_UI) | 63 #if BUILDFLAG(ANDROID_JAVA_UI) |
| 63 class WebappRegistry; | 64 class WebappRegistry; |
| 64 #endif | 65 #endif |
| 65 | 66 |
| 67 //////////////////////////////////////////////////////////////////////////////// | |
| 66 // BrowsingDataRemover is responsible for removing data related to browsing: | 68 // BrowsingDataRemover is responsible for removing data related to browsing: |
| 67 // visits in url database, downloads, cookies ... | 69 // visits in url database, downloads, cookies ... |
| 70 // | |
| 71 // USAGE: | |
| 72 // | |
| 73 // 0. Instantiation. | |
| 74 // | |
| 75 // BrowsingDataRemover remover = | |
| 76 // BrowsingDataRemoverFactory::GetForBrowserContext(profile); | |
| 77 // | |
| 78 // 1. No observer. | |
| 79 // | |
| 80 // remover->Remove(Unbounded(), REMOVE_COOKIES, ALL); | |
| 81 // | |
| 82 // 2. Using an observer to report when one's own removal task is finished. | |
| 83 // | |
| 84 // class CookiesDeleter : public BrowsingDataRemover::Observer { | |
| 85 // CookiesDeleter() { remover->AddObserver(this); } | |
| 86 // ~CookiesDeleter() { remover->RemoveObserver(this); } | |
| 87 // | |
| 88 // void DeleteCookies() { | |
| 89 // remover->RemoveAndReply(Unbounded(), REMOVE_COOKIES, ALL, this); | |
| 90 // } | |
| 91 // | |
| 92 // void OnBrowsingDataRemoverDone() { | |
| 93 // LOG(INFO) << "Cookies were deleted."; | |
| 94 // } | |
| 95 // } | |
| 96 // | |
| 97 // 3. Using an observer to report when any removal task started or all removal | |
| 98 // tasks finished (i.e. when BrowsingDataRemover changes state from idle | |
| 99 // to busy and vice versa). | |
| 100 // | |
| 101 // class BrowsingDataRemoverStatusObsever { | |
| 102 // BrowsingDataRemoverStatusObserver() { remover->AddObserver(this); } | |
| 103 // ~BrowsingDataRemoverStatusObserver() { | |
| 104 // remover->RemoveObserver(this); | |
| 105 // } | |
| 106 // | |
| 107 // void OnBrowsingDataRemoving(bool removing) { | |
| 108 // LOG(INFO) << "Remover is now " << (removing ? "busy" : "idle"); | |
| 109 // } | |
| 110 // } | |
| 111 // | |
| 112 //////////////////////////////////////////////////////////////////////////////// | |
| 113 | |
| 68 class BrowsingDataRemover : public KeyedService | 114 class BrowsingDataRemover : public KeyedService |
| 69 #if defined(ENABLE_PLUGINS) | 115 #if defined(ENABLE_PLUGINS) |
| 70 , public PepperFlashSettingsManager::Client | 116 , public PepperFlashSettingsManager::Client |
| 71 #endif | 117 #endif |
| 72 { | 118 { |
| 73 public: | 119 public: |
| 74 // Mask used for Remove. | 120 // Mask used for Remove. |
| 75 enum RemoveDataMask { | 121 enum RemoveDataMask { |
| 76 REMOVE_APPCACHE = 1 << 0, | 122 REMOVE_APPCACHE = 1 << 0, |
| 77 REMOVE_CACHE = 1 << 1, | 123 REMOVE_CACHE = 1 << 1, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 146 | 192 |
| 147 struct TimeRange { | 193 struct TimeRange { |
| 148 TimeRange(base::Time begin, base::Time end) : begin(begin), end(end) {} | 194 TimeRange(base::Time begin, base::Time end) : begin(begin), end(end) {} |
| 149 bool operator==(const TimeRange& other) const; | 195 bool operator==(const TimeRange& other) const; |
| 150 | 196 |
| 151 base::Time begin; | 197 base::Time begin; |
| 152 base::Time end; | 198 base::Time end; |
| 153 }; | 199 }; |
| 154 | 200 |
| 155 // Observer is notified when the removal is active and when it's done. | 201 // Observer is notified when the removal is active and when it's done. |
| 202 // TODO(msramek): The semantics of the two methods are slightly different; | |
| 203 // one is called for every observer at the same time, while the other only | |
| 204 // for one observer at a time. Split the interface or deprecate | |
| 205 // OnBrowsingDataRemoving(). | |
| 156 class Observer { | 206 class Observer { |
| 157 public: | 207 public: |
| 158 // NOTE: DEPRECATED; talk to dbeam/msramek before using this. | 208 // NOTE: DEPRECATED; talk to dbeam/msramek before using this. |
| 159 // | 209 // |
| 160 // Whether removal is active. Note that not having an active removal is not | 210 // Whether removal is active. Note that not having an active removal is not |
| 161 // same as completing a removal. That is why the removing status is separate | 211 // same as completing a removal. That is why the removing status is separate |
| 162 // from the done message. | 212 // from the done message. |
| 163 virtual void OnBrowsingDataRemoving(bool is_removing) {} | 213 virtual void OnBrowsingDataRemoving(bool is_removing) {} |
| 164 | 214 |
| 165 // Done means keywords have been deleted, cache cleared and all other | 215 // Called when a removal task is finished. Note that every removal task can |
| 166 // removal tasks are scheduled. | 216 // only have one observer attached to it, and only that one is called. |
| 167 virtual void OnBrowsingDataRemoverDone() {} | 217 virtual void OnBrowsingDataRemoverDone() {} |
| 168 | 218 |
| 169 protected: | 219 protected: |
| 170 virtual ~Observer() {} | 220 virtual ~Observer() {} |
| 171 }; | 221 }; |
| 172 | 222 |
| 173 // The completion inhibitor can artificially delay completion of the browsing | 223 // The completion inhibitor can artificially delay completion of the browsing |
| 174 // data removal process. It is used during testing to simulate scenarios in | 224 // data removal process. It is used during testing to simulate scenarios in |
| 175 // which the deletion stalls or takes a very long time. | 225 // which the deletion stalls or takes a very long time. |
| 176 class CompletionInhibitor { | 226 class CompletionInhibitor { |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 195 | 245 |
| 196 // Sets a CompletionInhibitor, which will be notified each time an instance is | 246 // Sets a CompletionInhibitor, which will be notified each time an instance is |
| 197 // about to complete a browsing data removal process, and will be able to | 247 // about to complete a browsing data removal process, and will be able to |
| 198 // artificially delay the completion. | 248 // artificially delay the completion. |
| 199 // TODO(crbug.com/483528): Make this non-static. | 249 // TODO(crbug.com/483528): Make this non-static. |
| 200 static void set_completion_inhibitor_for_testing( | 250 static void set_completion_inhibitor_for_testing( |
| 201 CompletionInhibitor* inhibitor) { | 251 CompletionInhibitor* inhibitor) { |
| 202 completion_inhibitor_ = inhibitor; | 252 completion_inhibitor_ = inhibitor; |
| 203 } | 253 } |
| 204 | 254 |
| 205 // Removes the specified items related to browsing for all origins that match | 255 // Removes browsing data within the given |time_range|, with datatypes being |
| 206 // the provided |origin_type_mask| (see BrowsingDataHelper::OriginTypeMask). | 256 // specified by |remove_mask| and origin types by |origin_type_mask|. |
| 207 void Remove(const TimeRange& time_range, | 257 void Remove(const TimeRange& time_range, |
| 208 int remove_mask, | 258 int remove_mask, |
| 209 int origin_type_mask); | 259 int origin_type_mask); |
| 210 | 260 |
| 211 // Removes the specified items related to browsing for all origins that match | 261 // A version of the above that in addition informs the |observer| when the |
| 212 // the provided |origin_type_mask| (see BrowsingDataHelper::OriginTypeMask). | 262 // removal task is finished. |
| 213 // The |origin_filter| is used as a final filter for clearing operations. | 263 void RemoveAndReply(const TimeRange& time_range, |
| 264 int remove_mask, | |
| 265 int origin_type_mask, | |
| 266 Observer* observer); | |
| 267 | |
| 268 // Like Remove(), but in case of URL-keyed only removes data whose URL match | |
| 269 // |filter_builder| (e.g. are on certain origin or domain). | |
| 214 // TODO(dmurph): Support all backends with filter (crbug.com/113621). | 270 // TODO(dmurph): Support all backends with filter (crbug.com/113621). |
| 215 // DO NOT USE THIS METHOD UNLESS CALLER KNOWS WHAT THEY'RE DOING. NOT ALL | 271 // DO NOT USE THIS METHOD UNLESS CALLER KNOWS WHAT THEY'RE DOING. NOT ALL |
| 216 // BACKENDS ARE SUPPORTED YET, AND MORE DATA THAN EXPECTED COULD BE DELETED. | 272 // BACKENDS ARE SUPPORTED YET, AND MORE DATA THAN EXPECTED COULD BE DELETED. |
| 217 virtual void RemoveWithFilter(const TimeRange& time_range, | 273 virtual void RemoveWithFilter( |
| 218 int remove_mask, | 274 const TimeRange& time_range, |
| 219 int origin_type_mask, | 275 int remove_mask, |
| 220 const BrowsingDataFilterBuilder& origin_filter); | 276 int origin_type_mask, |
| 277 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder); | |
| 278 | |
| 279 // A version of the above that in addition informs the |observer| when the | |
| 280 // removal task is finished. | |
| 281 virtual void RemoveWithFilterAndReply( | |
| 282 const TimeRange& time_range, | |
| 283 int remove_mask, | |
| 284 int origin_type_mask, | |
| 285 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | |
| 286 Observer* observer); | |
|
Bernhard Bauer
2016/08/04 12:30:51
You might want to make these non-virtual anymore.
msramek
2016/08/04 12:48:57
It's actually "not yet" rather than "anymore". Thi
Bernhard Bauer
2016/08/04 12:57:41
Could you just declare the Internal method as virt
Bernhard Bauer
2016/08/04 12:57:41
Could you just declare the Internal method as virt
msramek
2016/08/04 13:20:27
...yes :) Apparently I'm a bit slow today. Done. A
| |
| 221 | 287 |
| 222 void AddObserver(Observer* observer); | 288 void AddObserver(Observer* observer); |
| 223 void RemoveObserver(Observer* observer); | 289 void RemoveObserver(Observer* observer); |
| 224 | 290 |
| 225 // Used for testing. | 291 // Used for testing. |
| 226 void OverrideStoragePartitionForTesting( | 292 void OverrideStoragePartitionForTesting( |
| 227 content::StoragePartition* storage_partition); | 293 content::StoragePartition* storage_partition); |
| 228 | 294 |
| 229 #if BUILDFLAG(ANDROID_JAVA_UI) | 295 #if BUILDFLAG(ANDROID_JAVA_UI) |
| 230 void OverrideWebappRegistryForTesting( | 296 void OverrideWebappRegistryForTesting( |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 245 // this class. The constructor is protected so that the class is mockable. | 311 // this class. The constructor is protected so that the class is mockable. |
| 246 BrowsingDataRemover(content::BrowserContext* browser_context); | 312 BrowsingDataRemover(content::BrowserContext* browser_context); |
| 247 ~BrowsingDataRemover() override; | 313 ~BrowsingDataRemover() override; |
| 248 | 314 |
| 249 private: | 315 private: |
| 250 // The clear API needs to be able to toggle removing_ in order to test that | 316 // The clear API needs to be able to toggle removing_ in order to test that |
| 251 // only one BrowsingDataRemover instance can be called at a time. | 317 // only one BrowsingDataRemover instance can be called at a time. |
| 252 FRIEND_TEST_ALL_PREFIXES(ExtensionBrowsingDataTest, OneAtATime); | 318 FRIEND_TEST_ALL_PREFIXES(ExtensionBrowsingDataTest, OneAtATime); |
| 253 // Testing our static method, ClearSettingsForOneTypeWithPredicate. | 319 // Testing our static method, ClearSettingsForOneTypeWithPredicate. |
| 254 FRIEND_TEST_ALL_PREFIXES(BrowsingDataRemoverTest, ClearWithPredicate); | 320 FRIEND_TEST_ALL_PREFIXES(BrowsingDataRemoverTest, ClearWithPredicate); |
| 321 // Testing the private RemovalTask. | |
| 322 FRIEND_TEST_ALL_PREFIXES(BrowsingDataRemoverTest, MultipleTasks); | |
| 255 | 323 |
| 256 // The BrowsingDataRemover tests need to be able to access the implementation | 324 // The BrowsingDataRemover tests need to be able to access the implementation |
| 257 // of Remove(), as it exposes details that aren't yet available in the public | 325 // of Remove(), as it exposes details that aren't yet available in the public |
| 258 // API. As soon as those details are exposed via new methods, this should be | 326 // API. As soon as those details are exposed via new methods, this should be |
| 259 // removed. | 327 // removed. |
| 260 // | 328 // |
| 261 // TODO(mkwst): See http://crbug.com/113621 | 329 // TODO(mkwst): See http://crbug.com/113621 |
| 262 friend class BrowsingDataRemoverTest; | 330 friend class BrowsingDataRemoverTest; |
| 263 | 331 |
| 264 friend class BrowsingDataRemoverFactory; | 332 friend class BrowsingDataRemoverFactory; |
| 265 | 333 |
| 334 // Represents a single removal task. Contains all parameters needed to execute | |
| 335 // it and a pointer to the observer that added it. | |
| 336 struct RemovalTask { | |
| 337 RemovalTask(const TimeRange& time_range, | |
| 338 int remove_mask, | |
| 339 int origin_type_mask, | |
| 340 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | |
| 341 Observer* observer); | |
| 342 ~RemovalTask(); | |
| 343 | |
| 344 TimeRange time_range; | |
| 345 int remove_mask; | |
| 346 int origin_type_mask; | |
| 347 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder; | |
| 348 Observer* observer; | |
| 349 }; | |
| 350 | |
| 266 // Clears all host-specific settings for one content type that satisfy the | 351 // Clears all host-specific settings for one content type that satisfy the |
| 267 // given predicate. | 352 // given predicate. |
| 268 // | 353 // |
| 269 // This should only be called on the UI thread. | 354 // This should only be called on the UI thread. |
| 270 static void ClearSettingsForOneTypeWithPredicate( | 355 static void ClearSettingsForOneTypeWithPredicate( |
| 271 HostContentSettingsMap* content_settings_map, | 356 HostContentSettingsMap* content_settings_map, |
| 272 ContentSettingsType content_type, | 357 ContentSettingsType content_type, |
| 273 const base::Callback< | 358 const base::Callback< |
| 274 bool(const ContentSettingsPattern& primary_pattern, | 359 bool(const ContentSettingsPattern& primary_pattern, |
| 275 const ContentSettingsPattern& secondary_pattern)>& predicate); | 360 const ContentSettingsPattern& secondary_pattern)>& predicate); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 291 // PepperFlashSettingsManager::Client implementation. | 376 // PepperFlashSettingsManager::Client implementation. |
| 292 void OnDeauthorizeFlashContentLicensesCompleted(uint32_t request_id, | 377 void OnDeauthorizeFlashContentLicensesCompleted(uint32_t request_id, |
| 293 bool success) override; | 378 bool success) override; |
| 294 #endif | 379 #endif |
| 295 | 380 |
| 296 #if defined (OS_CHROMEOS) | 381 #if defined (OS_CHROMEOS) |
| 297 void OnClearPlatformKeys(chromeos::DBusMethodCallStatus call_status, | 382 void OnClearPlatformKeys(chromeos::DBusMethodCallStatus call_status, |
| 298 bool result); | 383 bool result); |
| 299 #endif | 384 #endif |
| 300 | 385 |
| 386 // A common reduction of all public Remove[WithFilter][AndReply] methods. | |
| 387 virtual void RemoveInternal( | |
| 388 const TimeRange& time_range, | |
| 389 int remove_mask, | |
| 390 int origin_type_mask, | |
| 391 std::unique_ptr<BrowsingDataFilterBuilder> filter_builder, | |
| 392 Observer* observer); | |
| 393 | |
| 394 // Executes the next removal task. Called after the previous task was finished | |
| 395 // or directly from Remove() if the task queue was empty. | |
| 396 void RunNextTask(); | |
| 397 | |
| 301 // Removes the specified items related to browsing for a specific host. If the | 398 // Removes the specified items related to browsing for a specific host. If the |
| 302 // provided |remove_url| is empty, data is removed for all origins; otherwise, | 399 // provided |remove_url| is empty, data is removed for all origins; otherwise, |
| 303 // it is restricted by the origin filter origin (where implemented yet). The | 400 // it is restricted by the origin filter origin (where implemented yet). The |
| 304 // |origin_type_mask| parameter defines the set of origins from which data | 401 // |origin_type_mask| parameter defines the set of origins from which data |
| 305 // should be removed (protected, unprotected, or both). | 402 // should be removed (protected, unprotected, or both). |
| 306 // TODO(ttr314): Remove "(where implemented yet)" constraint above once | 403 // TODO(ttr314): Remove "(where implemented yet)" constraint above once |
| 307 // crbug.com/113621 is done. | 404 // crbug.com/113621 is done. |
| 308 // TODO(crbug.com/589586): Support all backends w/ origin filter. | 405 // TODO(crbug.com/589586): Support all backends w/ origin filter. |
| 309 void RemoveImpl(const TimeRange& time_range, | 406 void RemoveImpl(const TimeRange& time_range, |
| 310 int remove_mask, | 407 int remove_mask, |
| 311 const BrowsingDataFilterBuilder& origin_filter, | 408 const BrowsingDataFilterBuilder& filter_builder, |
| 312 int origin_type_mask); | 409 int origin_type_mask); |
| 313 | 410 |
| 314 // Notifies observers and transitions to the idle state. | 411 // Notifies observers and transitions to the idle state. |
| 315 void Notify(); | 412 void Notify(); |
| 316 | 413 |
| 317 // Checks if we are all done, and if so, calls Notify(). | 414 // Checks if we are all done, and if so, calls Notify(). |
| 318 void NotifyIfDone(); | 415 void NotifyIfDone(); |
| 319 | 416 |
| 320 // Called when history deletion is done. | 417 // Called when history deletion is done. |
| 321 void OnHistoryDeletionDone(); | 418 void OnHistoryDeletionDone(); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 404 | 501 |
| 405 // Start time to delete from. | 502 // Start time to delete from. |
| 406 base::Time delete_begin_; | 503 base::Time delete_begin_; |
| 407 | 504 |
| 408 // End time to delete to. | 505 // End time to delete to. |
| 409 base::Time delete_end_; | 506 base::Time delete_end_; |
| 410 | 507 |
| 411 // True if Remove has been invoked. | 508 // True if Remove has been invoked. |
| 412 bool is_removing_; | 509 bool is_removing_; |
| 413 | 510 |
| 511 // Removal tasks to be processed. | |
| 512 std::queue<RemovalTask> task_queue_; | |
| 513 | |
| 414 // If non-NULL, the |completion_inhibitor_| is notified each time an instance | 514 // If non-NULL, the |completion_inhibitor_| is notified each time an instance |
| 415 // is about to complete a browsing data removal process, and has the ability | 515 // is about to complete a browsing data removal process, and has the ability |
| 416 // to artificially delay completion. Used for testing. | 516 // to artificially delay completion. Used for testing. |
| 417 static CompletionInhibitor* completion_inhibitor_; | 517 static CompletionInhibitor* completion_inhibitor_; |
| 418 | 518 |
| 419 #if defined(ENABLE_PLUGINS) | 519 #if defined(ENABLE_PLUGINS) |
| 420 // Used to delete plugin data. | 520 // Used to delete plugin data. |
| 421 std::unique_ptr<content::PluginDataRemover> plugin_data_remover_; | 521 std::unique_ptr<content::PluginDataRemover> plugin_data_remover_; |
| 422 base::WaitableEventWatcher watcher_; | 522 base::WaitableEventWatcher watcher_; |
| 423 | 523 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 459 bool waiting_for_clear_webrtc_logs_ = false; | 559 bool waiting_for_clear_webrtc_logs_ = false; |
| 460 #endif | 560 #endif |
| 461 bool waiting_for_clear_auto_sign_in_ = false; | 561 bool waiting_for_clear_auto_sign_in_ = false; |
| 462 | 562 |
| 463 // The removal mask for the current removal operation. | 563 // The removal mask for the current removal operation. |
| 464 int remove_mask_ = 0; | 564 int remove_mask_ = 0; |
| 465 | 565 |
| 466 // From which types of origins should we remove data? | 566 // From which types of origins should we remove data? |
| 467 int origin_type_mask_ = 0; | 567 int origin_type_mask_ = 0; |
| 468 | 568 |
| 569 // Observers of the global state and individual tasks. | |
| 469 base::ObserverList<Observer, true> observer_list_; | 570 base::ObserverList<Observer, true> observer_list_; |
| 470 | 571 |
| 471 // Used if we need to clear history. | 572 // Used if we need to clear history. |
| 472 base::CancelableTaskTracker history_task_tracker_; | 573 base::CancelableTaskTracker history_task_tracker_; |
| 473 | 574 |
| 474 std::unique_ptr<TemplateURLService::Subscription> template_url_sub_; | 575 std::unique_ptr<TemplateURLService::Subscription> template_url_sub_; |
| 475 | 576 |
| 476 // We do not own this. | 577 // We do not own this. |
| 477 content::StoragePartition* storage_partition_for_testing_ = nullptr; | 578 content::StoragePartition* storage_partition_for_testing_ = nullptr; |
| 478 | 579 |
| 479 #if BUILDFLAG(ANDROID_JAVA_UI) | 580 #if BUILDFLAG(ANDROID_JAVA_UI) |
| 480 // WebappRegistry makes calls across the JNI. In unit tests, the Java side is | 581 // WebappRegistry makes calls across the JNI. In unit tests, the Java side is |
| 481 // not initialised, so the registry must be mocked out. | 582 // not initialised, so the registry must be mocked out. |
| 482 std::unique_ptr<WebappRegistry> webapp_registry_; | 583 std::unique_ptr<WebappRegistry> webapp_registry_; |
| 483 #endif | 584 #endif |
| 484 | 585 |
| 485 base::WeakPtrFactory<BrowsingDataRemover> weak_ptr_factory_; | 586 base::WeakPtrFactory<BrowsingDataRemover> weak_ptr_factory_; |
| 486 | 587 |
| 487 DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover); | 588 DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemover); |
| 488 }; | 589 }; |
| 489 | 590 |
| 490 #endif // CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ | 591 #endif // CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_H_ |
| OLD | NEW |