Replace deprecated base::NonThreadSafe in extensions in favor of SequenceChecker.

Note to crash team: This CL is a refactor and has no intended behavior change.

This change was scripted by https://crbug.com/676387#c8.

Note-worthy for the reviewer:
 * SequenceChecker enforces thread-safety but not thread-affinity!
   If the classes that were updated are thread-affine (use thread local
   storage or a third-party API that does) they should be migrated to
   ThreadChecker instead.
 * ~NonThreadSafe() used to implicitly check in its destructor
   ~Sequence/ThreadChecker() doesn't by design. To keep this CL a
   no-op, an explicit check was added to the destructor of migrated
   classes.
 * NonThreadSafe used to provide access to subclasses, as such
   the |sequence_checker_| member was made protected rather than
   private where necessary.

BUG=676387
This CL was uploaded by git cl split.

[email protected]

Review-Url: https://codereview.chromium.org/2915523002
Cr-Commit-Position: refs/heads/master@{#476280}
diff --git a/extensions/browser/api/api_resource_manager.h b/extensions/browser/api/api_resource_manager.h
index 064e7454..8626e21 100644
--- a/extensions/browser/api/api_resource_manager.h
+++ b/extensions/browser/api/api_resource_manager.h
@@ -14,7 +14,6 @@
 #include "base/scoped_observer.h"
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
-#include "base/threading/non_thread_safe.h"
 #include "base/threading/sequenced_worker_pool.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "content/public/browser/browser_thread.h"
@@ -89,7 +88,6 @@
 // }
 template <class T, typename ThreadingTraits = NamedThreadTraits<T>>
 class ApiResourceManager : public BrowserContextKeyedAPI,
-                           public base::NonThreadSafe,
                            public ExtensionRegistryObserver,
                            public ProcessManagerObserver {
  public:
@@ -102,7 +100,7 @@
   }
 
   virtual ~ApiResourceManager() {
-    DCHECK(CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     DCHECK(ThreadingTraits::IsMessageLoopValid())
         << "A unit test is using an ApiResourceManager but didn't provide "
            "the thread message loop needed for that kind of resource. "
@@ -365,6 +363,8 @@
       extension_registry_observer_;
   ScopedObserver<ProcessManager, ProcessManagerObserver>
       process_manager_observer_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
 };
 
 template <class T>
diff --git a/extensions/browser/extension_throttle_manager.cc b/extensions/browser/extension_throttle_manager.cc
index c33d0207..bc3a810a 100644
--- a/extensions/browser/extension_throttle_manager.cc
+++ b/extensions/browser/extension_throttle_manager.cc
@@ -40,6 +40,7 @@
 }
 
 ExtensionThrottleManager::~ExtensionThrottleManager() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   net::NetworkChangeNotifier::RemoveIPAddressObserver(this);
   net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
 
@@ -69,7 +70,9 @@
 
 scoped_refptr<ExtensionThrottleEntryInterface>
 ExtensionThrottleManager::RegisterRequestUrl(const GURL& url) {
-  DCHECK(!enable_thread_checks_ || CalledOnValidThread());
+#if DCHECK_IS_ON()
+  DCHECK(!enable_thread_checks_ || sequence_checker_.CalledOnValidSequence());
+#endif  // DCHECK_IS_ON()
 
   // Normalize the url.
   std::string url_id = GetIdFromUrl(url);
diff --git a/extensions/browser/extension_throttle_manager.h b/extensions/browser/extension_throttle_manager.h
index cad766b..6b4723a 100644
--- a/extensions/browser/extension_throttle_manager.h
+++ b/extensions/browser/extension_throttle_manager.h
@@ -11,7 +11,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/sequence_checker.h"
 #include "base/threading/platform_thread.h"
 #include "extensions/browser/extension_throttle_entry.h"
 #include "net/base/backoff_entry.h"
@@ -40,8 +40,7 @@
 // clean out outdated entries. URL ID consists of lowercased scheme, host, port
 // and path. All URLs converted to the same ID will share the same entry.
 class ExtensionThrottleManager
-    : NON_EXPORTED_BASE(public base::NonThreadSafe),
-      public net::NetworkChangeNotifier::IPAddressObserver,
+    : public net::NetworkChangeNotifier::IPAddressObserver,
       public net::NetworkChangeNotifier::ConnectionTypeObserver {
  public:
   ExtensionThrottleManager();
@@ -178,6 +177,8 @@
   // This is NULL when it is not set for tests.
   std::unique_ptr<net::BackoffEntry::Policy> backoff_policy_for_tests_;
 
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(ExtensionThrottleManager);
 };
 
diff --git a/extensions/browser/quota_service.cc b/extensions/browser/quota_service.cc
index 99967d7..3d53713 100644
--- a/extensions/browser/quota_service.cc
+++ b/extensions/browser/quota_service.cc
@@ -33,7 +33,7 @@
 }
 
 QuotaService::~QuotaService() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   purge_timer_.Stop();
   Purge();
 }
@@ -42,7 +42,7 @@
                                  ExtensionFunction* function,
                                  const base::ListValue* args,
                                  const base::TimeTicks& event_time) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   if (function->ShouldSkipQuotaLimiting())
     return std::string();
@@ -86,7 +86,7 @@
 }
 
 void QuotaService::Purge() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   for (auto it = function_heuristics_.begin(); it != function_heuristics_.end();
        function_heuristics_.erase(it++)) {
     it->second.clear();
diff --git a/extensions/browser/quota_service.h b/extensions/browser/quota_service.h
index 433ea32..ef71f3c 100644
--- a/extensions/browser/quota_service.h
+++ b/extensions/browser/quota_service.h
@@ -24,7 +24,7 @@
 #include "base/compiler_specific.h"
 #include "base/containers/hash_tables.h"
 #include "base/macros.h"
-#include "base/threading/non_thread_safe.h"
+#include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "base/values.h"
@@ -44,7 +44,7 @@
 // called and destroyed on the same thread, due to its use of a RepeatingTimer.
 // It is not a KeyedService because instances exist on both the UI
 // and IO threads.
-class QuotaService : public base::NonThreadSafe {
+class QuotaService {
  public:
   // Some concrete heuristics (declared below) that ExtensionFunctions can
   // use to help the service make decisions about quota violations.
@@ -91,6 +91,8 @@
   // Each heuristic will be evaluated and ANDed together to get a final answer.
   std::map<ExtensionId, FunctionHeuristicsMap> function_heuristics_;
 
+  THREAD_CHECKER(thread_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(QuotaService);
 };
 
diff --git a/extensions/browser/value_store/value_store_frontend.cc b/extensions/browser/value_store/value_store_frontend.cc
index 964fdbe..cf2379a 100644
--- a/extensions/browser/value_store/value_store_frontend.cc
+++ b/extensions/browser/value_store/value_store_frontend.cc
@@ -109,15 +109,17 @@
 ValueStoreFrontend::ValueStoreFrontend(
     const scoped_refptr<ValueStoreFactory>& store_factory,
     BackendType backend_type)
-    : backend_(new Backend(store_factory, backend_type)) {}
+    : backend_(new Backend(store_factory, backend_type)) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+}
 
 ValueStoreFrontend::~ValueStoreFrontend() {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 }
 
 void ValueStoreFrontend::Get(const std::string& key,
                              const ReadCallback& callback) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
       base::Bind(&ValueStoreFrontend::Backend::Get,
@@ -126,7 +128,7 @@
 
 void ValueStoreFrontend::Set(const std::string& key,
                              std::unique_ptr<base::Value> value) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
       base::Bind(&ValueStoreFrontend::Backend::Set,
@@ -134,7 +136,7 @@
 }
 
 void ValueStoreFrontend::Remove(const std::string& key) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
       base::Bind(&ValueStoreFrontend::Backend::Remove,
diff --git a/extensions/browser/value_store/value_store_frontend.h b/extensions/browser/value_store/value_store_frontend.h
index 015c6f3..82d0a99 100644
--- a/extensions/browser/value_store/value_store_frontend.h
+++ b/extensions/browser/value_store/value_store_frontend.h
@@ -12,7 +12,6 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
-#include "base/threading/non_thread_safe.h"
 #include "base/values.h"
 #include "extensions/browser/value_store/value_store.h"
 
@@ -21,9 +20,7 @@
 }  // namespace extensions
 
 // A frontend for a LeveldbValueStore, for use on the UI thread.
-class ValueStoreFrontend
-    : public base::SupportsWeakPtr<ValueStoreFrontend>,
-      public base::NonThreadSafe {
+class ValueStoreFrontend : public base::SupportsWeakPtr<ValueStoreFrontend> {
  public:
   // The kind of extensions data stored in a backend.
   enum class BackendType { RULES, STATE };
diff --git a/extensions/browser/warning_service.cc b/extensions/browser/warning_service.cc
index c6f643b..1f5cf12 100644
--- a/extensions/browser/warning_service.cc
+++ b/extensions/browser/warning_service.cc
@@ -16,14 +16,16 @@
 
 WarningService::WarningService(content::BrowserContext* browser_context)
     : browser_context_(browser_context), extension_registry_observer_(this) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (browser_context_) {
     extension_registry_observer_.Add(ExtensionRegistry::Get(
         ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context_)));
   }
 }
 
-WarningService::~WarningService() {}
+WarningService::~WarningService() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+}
 
 // static
 WarningService* WarningService::Get(content::BrowserContext* browser_context) {
@@ -32,7 +34,7 @@
 
 void WarningService::ClearWarnings(
     const std::set<Warning::WarningType>& types) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   ExtensionIdSet affected_extensions;
   for (WarningSet::iterator i = warnings_.begin();
        i != warnings_.end();) {
@@ -50,7 +52,7 @@
 
 std::set<Warning::WarningType> WarningService::
     GetWarningTypesAffectingExtension(const std::string& extension_id) const {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   std::set<Warning::WarningType> result;
   for (WarningSet::const_iterator i = warnings_.begin();
        i != warnings_.end(); ++i) {
@@ -62,7 +64,7 @@
 
 std::vector<std::string> WarningService::GetWarningMessagesForExtension(
     const std::string& extension_id) const {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   std::vector<std::string> result;
 
   const ExtensionSet& extension_set =
@@ -77,7 +79,7 @@
 }
 
 void WarningService::AddWarnings(const WarningSet& warnings) {
-  DCHECK(CalledOnValidThread());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   ExtensionIdSet affected_extensions;
   for (const Warning& warning : warnings) {
diff --git a/extensions/browser/warning_service.h b/extensions/browser/warning_service.h
index 8fd3b633..5accc0d 100644
--- a/extensions/browser/warning_service.h
+++ b/extensions/browser/warning_service.h
@@ -11,7 +11,6 @@
 
 #include "base/observer_list.h"
 #include "base/scoped_observer.h"
-#include "base/threading/non_thread_safe.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "extensions/browser/extension_registry_observer.h"
 #include "extensions/browser/warning_set.h"
@@ -30,9 +29,7 @@
 // conflicting modifications of network requests by extensions, slow extensions,
 // etc.) trigger a warning badge in the UI and and provide means to resolve
 // them. This class must be used on the UI thread only.
-class WarningService : public KeyedService,
-                       public ExtensionRegistryObserver,
-                       public base::NonThreadSafe {
+class WarningService : public KeyedService, public ExtensionRegistryObserver {
  public:
   class Observer {
    public:
diff --git a/extensions/browser/warning_service_unittest.cc b/extensions/browser/warning_service_unittest.cc
index 83a3ea0..96b6c5d3 100644
--- a/extensions/browser/warning_service_unittest.cc
+++ b/extensions/browser/warning_service_unittest.cc
@@ -5,6 +5,7 @@
 #include "extensions/browser/warning_service.h"
 
 #include "content/public/test/test_browser_context.h"
+#include "content/public/test/test_browser_thread_bundle.h"
 #include "extensions/browser/extensions_test.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -45,6 +46,7 @@
 // Check that inserting a warning triggers notifications, whereas inserting
 // the same warning again is silent.
 TEST_F(WarningServiceTest, SetWarning) {
+  content::TestBrowserThreadBundle thread_bundle_;
   content::TestBrowserContext browser_context;
   TestWarningService warning_service(&browser_context);
   MockObserver observer;
@@ -68,6 +70,7 @@
 // Check that ClearWarnings deletes exactly the specified warnings and
 // triggers notifications where appropriate.
 TEST_F(WarningServiceTest, ClearWarnings) {
+  content::TestBrowserThreadBundle thread_bundle_;
   content::TestBrowserContext browser_context;
   TestWarningService warning_service(&browser_context);
   MockObserver observer;