Move ExtensionWarningService and ExtensionsWarningSet, which are used by webrequest api, to extensions.

This cl resolve the dependencies of ExtensionsWarningSet of chrome strings:
- move the declarations of IDS_EXTENSION_WARNINGS_XXX to extensions_strings.grd;
- replace the usage of "IDS_PRODUCT_NAME" by creating GetProductName() function in ExtensionsClient and its subclasses.

BUG=352293

Review URL: https://codereview.chromium.org/503033002

Cr-Commit-Position: refs/heads/master@{#292378}
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index a0c53682..44ce2eb9 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -5065,30 +5065,6 @@
       <message name="IDS_EXTENSION_WARNINGS_TITLE" desc="The title of a section in chrome://extensions which contains the warning(s) that relates to one particular extension">
         Warning:
       </message>
-      <message name="IDS_EXTENSION_WARNINGS_NETWORK_DELAY" desc="Warning message indicating that an extension caused excessive network delays for web requests">
-        This extension is slowing down <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>. You should disable it to restore <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>'s performance.
-      </message>
-      <message name="IDS_EXTENSION_WARNINGS_NETWORK_CONFLICT" desc="Warning message which indicates that two or more extensions tried to modify a network request in a conflicting way and the modification of this extension was ignored">
-        This extension failed to modify a network request because the modification conflicted with another extension.
-      </message>
-      <message name="IDS_EXTENSION_WARNINGS_REDIRECT_CONFLICT" desc="Warning message indicating that two extensions tried to redirect to different destinations">
-        This extension failed to redirect a network request to <ph name="ATTEMPTED_REDIRECT_DESTINATION">$1<ex>http://www.google.com</ex></ph> because another extension (<ph name="EXTENSION_NAME">$2<ex>My Cool Extension</ex></ph>) redirected it to <ph name="ACTUAL_REDIRECT_DESTINATION">$3<ex>https://www.google.com</ex></ph>.
-      </message>
-      <message name="IDS_EXTENSION_WARNINGS_REQUEST_HEADER_CONFLICT" desc="Warning message which indicates that two or more extensions tried to modify a network request in a conflicting way and the modification of this extension was ignored">
-        This extension failed to modify the request header "<ph name="HEADER_NAME">$1<ex>User-Agent</ex></ph>" of a network request because the modification conflicted with another extension (<ph name="EXTENSION_NAME">$2<ex>My Cool Extension</ex></ph>).
-      </message>
-      <message name="IDS_EXTENSION_WARNINGS_RESPONSE_HEADER_CONFLICT" desc="Warning message which indicates that two or more extensions tried to modify a network request in a conflicting way and the modification of this extension was ignored">
-        This extension failed to modify the response header "<ph name="HEADER_NAME">$1<ex>User-Agents</ex></ph>" of a network request because the modification conflicted with another extension (<ph name="EXTENSION_NAME">$2<ex>My Cool Extension</ex></ph>).
-      </message>
-      <message name="IDS_EXTENSION_WARNINGS_CREDENTIALS_CONFLICT" desc="Warning message which indicates that two or more extensions tried to modify a network request in a conflicting way and the modification of this extension was ignored">
-        This extension failed to provide credentials to a network request because another extension (<ph name="EXTENSION_NAME">$1<ex>My Cool Extension</ex></ph>) provided different credentials.
-      </message>
-      <message name="IDS_EXTENSION_WARNINGS_DOWNLOAD_FILENAME_CONFLICT" desc="Warning message which indicates that two or more extensions tried to determine the filename of a downloaded file in a conflicting way and the modification of this extension was ignored">
-        This extension failed to name the download "<ph name="ATTEMPTED_FILENAME">$1<ex>apple.png</ex></ph>" because another extension (<ph name="EXTENSION_NAME">$2<ex>My Cool Extension</ex></ph>) determined a different filename "<ph name="ACTUAL_FILENAME">$3<ex>banana.png</ex></ph>".
-      </message>
-      <message name="IDS_EXTENSION_WARNING_RELOAD_TOO_FREQUENT" desc="Warning message which indates that an extension got stuck in a reload loop.">
-        This extension reloaded itself too frequently.
-      </message>
 
       <!-- External extension install alerts -->
       <!-- TODO(mpcomplete): We may need to change Chrome to
diff --git a/chrome/browser/extensions/api/downloads/downloads_api.cc b/chrome/browser/extensions/api/downloads/downloads_api.cc
index 704f4639..a98c89f 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api.cc
+++ b/chrome/browser/extensions/api/downloads/downloads_api.cc
@@ -35,7 +35,6 @@
 #include "chrome/browser/download/download_shelf.h"
 #include "chrome/browser/download/download_stats.h"
 #include "chrome/browser/download/drag_download_item.h"
-#include "chrome/browser/extensions/extension_warning_service.h"
 #include "chrome/browser/icon_loader.h"
 #include "chrome/browser/icon_manager.h"
 #include "chrome/browser/platform_util.h"
@@ -64,6 +63,7 @@
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/notification_types.h"
+#include "extensions/browser/warning_service.h"
 #include "extensions/common/permissions/permissions_data.h"
 #include "net/base/filename_util.h"
 #include "net/base/load_flags.h"
@@ -738,7 +738,7 @@
         // later take precedence over previous extensions.
         if (!filename.empty() ||
             (conflict_action != downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY)) {
-          ExtensionWarningSet warnings;
+          WarningSet warnings;
           std::string winner_extension_id;
           ExtensionDownloadsEventRouter::DetermineFilenameInternal(
               filename,
@@ -752,7 +752,7 @@
               &determined_conflict_action_,
               &warnings);
           if (!warnings.empty())
-            ExtensionWarningService::NotifyWarningsOnUI(profile, warnings);
+            WarningService::NotifyWarningsOnUI(profile, warnings);
           if (winner_extension_id == determiners_[index].extension_id)
             determiner_ = determiners_[index];
         }
@@ -1666,7 +1666,7 @@
     std::string* winner_extension_id,
     base::FilePath* determined_filename,
     downloads::FilenameConflictAction* determined_conflict_action,
-    ExtensionWarningSet* warnings) {
+    WarningSet* warnings) {
   DCHECK(!filename.empty() ||
          (conflict_action != downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY));
   DCHECK(!suggesting_extension_id.empty());
@@ -1680,7 +1680,7 @@
 
   if (suggesting_install_time < incumbent_install_time) {
     *winner_extension_id = incumbent_extension_id;
-    warnings->insert(ExtensionWarning::CreateDownloadFilenameConflictWarning(
+    warnings->insert(Warning::CreateDownloadFilenameConflictWarning(
         suggesting_extension_id,
         incumbent_extension_id,
         filename,
@@ -1689,7 +1689,7 @@
   }
 
   *winner_extension_id = suggesting_extension_id;
-  warnings->insert(ExtensionWarning::CreateDownloadFilenameConflictWarning(
+  warnings->insert(Warning::CreateDownloadFilenameConflictWarning(
       incumbent_extension_id,
       suggesting_extension_id,
       *determined_filename,
diff --git a/chrome/browser/extensions/api/downloads/downloads_api.h b/chrome/browser/extensions/api/downloads/downloads_api.h
index 916582ed..aaf92d32 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api.h
+++ b/chrome/browser/extensions/api/downloads/downloads_api.h
@@ -14,11 +14,11 @@
 #include "chrome/browser/download/download_danger_prompt.h"
 #include "chrome/browser/download/download_path_reservation_tracker.h"
 #include "chrome/browser/extensions/chrome_extension_function.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "chrome/common/extensions/api/downloads.h"
 #include "content/public/browser/download_manager.h"
 #include "extensions/browser/event_router.h"
 #include "extensions/browser/extension_registry_observer.h"
+#include "extensions/browser/warning_set.h"
 
 class DownloadFileIconExtractor;
 class DownloadQuery;
@@ -324,7 +324,7 @@
       base::FilePath* determined_filename,
       extensions::api::downloads::FilenameConflictAction*
         determined_conflict_action,
-      extensions::ExtensionWarningSet* warnings);
+      extensions::WarningSet* warnings);
 
   // A downloads.onDeterminingFilename listener has returned. If the extension
   // wishes to override the download's filename, then |filename| will be
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
index 18c536f..d513b9ff 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
+++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -4096,7 +4096,7 @@
   base::FilePath filename;
   downloads::FilenameConflictAction conflict_action =
       downloads::FILENAME_CONFLICT_ACTION_UNIQUIFY;
-  ExtensionWarningSet warnings;
+  WarningSet warnings;
 
   // Empty incumbent determiner
   warnings.clear();
@@ -4133,7 +4133,7 @@
   EXPECT_EQ(FILE_PATH_LITERAL("a"), filename.value());
   EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_OVERWRITE, conflict_action);
   EXPECT_FALSE(warnings.empty());
-  EXPECT_EQ(ExtensionWarning::kDownloadFilenameConflict,
+  EXPECT_EQ(Warning::kDownloadFilenameConflict,
             warnings.begin()->warning_type());
   EXPECT_EQ("suggester", warnings.begin()->extension_id());
 
@@ -4154,7 +4154,7 @@
   EXPECT_EQ(FILE_PATH_LITERAL("b"), filename.value());
   EXPECT_EQ(downloads::FILENAME_CONFLICT_ACTION_PROMPT, conflict_action);
   EXPECT_FALSE(warnings.empty());
-  EXPECT_EQ(ExtensionWarning::kDownloadFilenameConflict,
+  EXPECT_EQ(Warning::kDownloadFilenameConflict,
             warnings.begin()->warning_type());
   EXPECT_EQ("incumbent", warnings.begin()->extension_id());
 }
diff --git a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
index 767b444..9ab0684c 100644
--- a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
+++ b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
@@ -8,8 +8,6 @@
 #include "base/metrics/histogram.h"
 #include "base/time/time.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_warning_service.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "chrome/browser/extensions/updater/extension_updater.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -19,6 +17,8 @@
 #include "content/public/browser/notification_service.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/browser/notification_types.h"
+#include "extensions/browser/warning_service.h"
+#include "extensions/browser/warning_set.h"
 #include "extensions/common/api/runtime.h"
 
 #if defined(OS_CHROMEOS)
@@ -120,13 +120,13 @@
         base::Bind(&ExtensionService::TerminateExtension,
                    service->AsWeakPtr(),
                    extension_id));
-    extensions::ExtensionWarningSet warnings;
+    extensions::WarningSet warnings;
     warnings.insert(
-        extensions::ExtensionWarning::CreateReloadTooFrequentWarning(
+        extensions::Warning::CreateReloadTooFrequentWarning(
             extension_id));
     base::MessageLoop::current()->PostTask(
         FROM_HERE,
-        base::Bind(&extensions::ExtensionWarningService::NotifyWarningsOnUI,
+        base::Bind(&extensions::WarningService::NotifyWarningsOnUI,
                    browser_context_,
                    warnings));
   } else {
diff --git a/chrome/browser/extensions/api/web_request/web_request_api.cc b/chrome/browser/extensions/api/web_request/web_request_api.cc
index d0cc875..aaa6021 100644
--- a/chrome/browser/extensions/api/web_request/web_request_api.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_api.cc
@@ -30,8 +30,6 @@
 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h"
 #include "chrome/browser/extensions/extension_renderer_state.h"
-#include "chrome/browser/extensions/extension_warning_service.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/common/extensions/api/web_request.h"
@@ -53,6 +51,8 @@
 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
 #include "extensions/browser/info_map.h"
 #include "extensions/browser/runtime_data.h"
+#include "extensions/browser/warning_service.h"
+#include "extensions/browser/warning_set.h"
 #include "extensions/common/error_utils.h"
 #include "extensions/common/event_filtering_info.h"
 #include "extensions/common/extension.h"
@@ -79,12 +79,12 @@
 using content::ResourceType;
 using extensions::ErrorUtils;
 using extensions::Extension;
-using extensions::ExtensionWarning;
-using extensions::ExtensionWarningService;
-using extensions::ExtensionWarningSet;
 using extensions::InfoMap;
 using extensions::Feature;
 using extensions::RulesRegistryService;
+using extensions::Warning;
+using extensions::WarningService;
+using extensions::WarningSet;
 
 namespace helpers = extension_web_request_api_helpers;
 namespace keys = extension_web_request_api_constants;
@@ -1884,7 +1884,7 @@
   bool credentials_set = false;
 
   deltas.sort(&helpers::InDecreasingExtensionInstallationTimeOrder);
-  ExtensionWarningSet warnings;
+  WarningSet warnings;
 
   bool canceled = false;
   helpers::MergeCancelOfResponses(
@@ -1933,8 +1933,7 @@
     BrowserThread::PostTask(
         BrowserThread::UI,
         FROM_HERE,
-        base::Bind(&ExtensionWarningService::NotifyWarningsOnUI,
-                   profile, warnings));
+        base::Bind(&WarningService::NotifyWarningsOnUI, profile, warnings));
   }
 
   if (canceled) {
@@ -2456,14 +2455,13 @@
 void WebRequestHandlerBehaviorChangedFunction::OnQuotaExceeded(
     const std::string& violation_error) {
   // Post warning message.
-  ExtensionWarningSet warnings;
+  WarningSet warnings;
   warnings.insert(
-      ExtensionWarning::CreateRepeatedCacheFlushesWarning(extension_id()));
+      Warning::CreateRepeatedCacheFlushesWarning(extension_id()));
   BrowserThread::PostTask(
       BrowserThread::UI,
       FROM_HERE,
-      base::Bind(&ExtensionWarningService::NotifyWarningsOnUI,
-                 profile_id(), warnings));
+      base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings));
 
   // Continue gracefully.
   RunSync();
diff --git a/chrome/browser/extensions/api/web_request/web_request_api_helpers.cc b/chrome/browser/extensions/api/web_request/web_request_api_helpers.cc
index 80860db..2cfbde5 100644
--- a/chrome/browser/extensions/api/web_request/web_request_api_helpers.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_api_helpers.cc
@@ -14,13 +14,13 @@
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/api/web_request/web_request_api.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/renderer_host/web_cache_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_process_host.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/browser/runtime_data.h"
+#include "extensions/browser/warning_set.h"
 #include "net/base/net_log.h"
 #include "net/cookies/cookie_util.h"
 #include "net/cookies/parsed_cookie.h"
@@ -33,7 +33,6 @@
 
 using base::Time;
 using content::ResourceType;
-using extensions::ExtensionWarning;
 using net::cookie_util::ParsedRequestCookie;
 using net::cookie_util::ParsedRequestCookies;
 
@@ -415,7 +414,7 @@
 static bool MergeRedirectUrlOfResponsesHelper(
     const EventResponseDeltas& deltas,
     GURL* new_url,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log,
     bool consider_only_cancel_scheme_urls) {
   bool redirected = false;
@@ -441,7 +440,7 @@
           CreateNetLogExtensionIdCallback(delta->get()));
     } else {
       conflicting_extensions->insert(
-          ExtensionWarning::CreateRedirectConflictWarning(
+          extensions::Warning::CreateRedirectConflictWarning(
               (*delta)->extension_id,
               winning_extension_id,
               (*delta)->new_url,
@@ -457,7 +456,7 @@
 void MergeRedirectUrlOfResponses(
     const EventResponseDeltas& deltas,
     GURL* new_url,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log) {
 
   // First handle only redirects to data:// URLs and about:blank. These are a
@@ -477,7 +476,7 @@
 void MergeOnBeforeRequestResponses(
     const EventResponseDeltas& deltas,
     GURL* new_url,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log) {
   MergeRedirectUrlOfResponses(deltas, new_url, conflicting_extensions, net_log);
 }
@@ -603,7 +602,7 @@
 void MergeCookiesInOnBeforeSendHeadersResponses(
     const EventResponseDeltas& deltas,
     net::HttpRequestHeaders* request_headers,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log) {
   // Skip all work if there are no registered cookie modifications.
   bool cookie_modifications_exist = false;
@@ -675,7 +674,7 @@
 void MergeOnBeforeSendHeadersResponses(
     const EventResponseDeltas& deltas,
     net::HttpRequestHeaders* request_headers,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log) {
   EventResponseDeltas::const_iterator delta;
 
@@ -776,7 +775,7 @@
           base::Bind(&NetLogModificationCallback, delta->get()));
     } else {
       conflicting_extensions->insert(
-          ExtensionWarning::CreateRequestHeaderConflictWarning(
+          extensions::Warning::CreateRequestHeaderConflictWarning(
               (*delta)->extension_id, winning_extension_id,
               conflicting_header));
       net_log->AddEvent(
@@ -983,7 +982,7 @@
     const EventResponseDeltas& deltas,
     const net::HttpResponseHeaders* original_response_headers,
     scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log) {
   // Skip all work if there are no registered cookie modifications.
   bool cookie_modifications_exist = false;
@@ -1044,7 +1043,7 @@
     const net::HttpResponseHeaders* original_response_headers,
     scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
     GURL* allowed_unsafe_redirect_url,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log) {
   EventResponseDeltas::const_iterator delta;
 
@@ -1114,7 +1113,7 @@
           CreateNetLogExtensionIdCallback(delta->get()));
     } else {
       conflicting_extensions->insert(
-          ExtensionWarning::CreateResponseHeaderConflictWarning(
+          extensions::Warning::CreateResponseHeaderConflictWarning(
               (*delta)->extension_id, winning_extension_id,
               conflicting_header));
       net_log->AddEvent(
@@ -1147,7 +1146,7 @@
 bool MergeOnAuthRequiredResponses(
     const EventResponseDeltas& deltas,
     net::AuthCredentials* auth_credentials,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log) {
   CHECK(auth_credentials);
   bool credentials_set = false;
@@ -1164,7 +1163,7 @@
         auth_credentials->password() != (*delta)->auth_credentials->password();
     if (credentials_set && different) {
       conflicting_extensions->insert(
-          ExtensionWarning::CreateCredentialsConflictWarning(
+          extensions::Warning::CreateCredentialsConflictWarning(
               (*delta)->extension_id, winning_extension_id));
       net_log->AddEvent(
           net::NetLog::TYPE_CHROME_EXTENSION_IGNORED_DUE_TO_CONFLICT,
diff --git a/chrome/browser/extensions/api/web_request/web_request_api_helpers.h b/chrome/browser/extensions/api/web_request/web_request_api_helpers.h
index dc06edd..77d540a 100644
--- a/chrome/browser/extensions/api/web_request/web_request_api_helpers.h
+++ b/chrome/browser/extensions/api/web_request/web_request_api_helpers.h
@@ -15,8 +15,8 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
 #include "base/time/time.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "content/public/common/resource_type.h"
+#include "extensions/browser/warning_set.h"
 #include "net/base/auth.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_response_headers.h"
@@ -242,7 +242,7 @@
 void MergeRedirectUrlOfResponses(
     const EventResponseDeltas& deltas,
     GURL* new_url,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log);
 // Stores in |*new_url| the redirect request of the extension with highest
 // precedence. Extensions that did not command to redirect the request are
@@ -250,7 +250,7 @@
 void MergeOnBeforeRequestResponses(
     const EventResponseDeltas& deltas,
     GURL* new_url,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log);
 // Modifies the "Cookie" header in |request_headers| according to
 // |deltas.request_cookie_modifications|. Conflicts are currently ignored
@@ -258,14 +258,14 @@
 void MergeCookiesInOnBeforeSendHeadersResponses(
     const EventResponseDeltas& deltas,
     net::HttpRequestHeaders* request_headers,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log);
 // Modifies the headers in |request_headers| according to |deltas|. Conflicts
 // are tried to be resolved.
 void MergeOnBeforeSendHeadersResponses(
     const EventResponseDeltas& deltas,
     net::HttpRequestHeaders* request_headers,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log);
 // Modifies the "Set-Cookie" headers in |override_response_headers| according to
 // |deltas.response_cookie_modifications|. If |override_response_headers| is
@@ -275,7 +275,7 @@
     const EventResponseDeltas& deltas,
     const net::HttpResponseHeaders* original_response_headers,
     scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log);
 // Stores a copy of |original_response_header| into |override_response_headers|
 // that is modified according to |deltas|. If |deltas| does not instruct to
@@ -288,7 +288,7 @@
     const net::HttpResponseHeaders* original_response_headers,
     scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
     GURL* allowed_unsafe_redirect_url,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log);
 // Merge the responses of blocked onAuthRequired handlers. The first
 // registered listener that supplies authentication credentials in a response,
@@ -299,7 +299,7 @@
 bool MergeOnAuthRequiredResponses(
     const EventResponseDeltas& deltas,
     net::AuthCredentials* auth_credentials,
-    extensions::ExtensionWarningSet* conflicting_extensions,
+    extensions::WarningSet* conflicting_extensions,
     const net::BoundNetLog* net_log);
 
 // Returns whether |type| is a ResourceType that is handled by the web request
diff --git a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
index fb1d05f..725938d 100644
--- a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
@@ -27,7 +27,6 @@
 #include "chrome/browser/extensions/api/web_request/web_request_api_constants.h"
 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
 #include "chrome/browser/extensions/event_router_forwarder.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "chrome/browser/net/about_protocol_handler.h"
 #include "chrome/browser/net/chrome_network_delegate.h"
 #include "chrome/common/extensions/api/web_request.h"
@@ -38,6 +37,7 @@
 #include "chrome/test/base/testing_profile_manager.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "extensions/browser/warning_set.h"
 #include "extensions/common/extension_messages.h"
 #include "extensions/common/features/feature.h"
 #include "net/base/auth.h"
@@ -105,9 +105,9 @@
 }
 
 // Returns whether |warnings| contains an extension for |extension_id|.
-bool HasWarning(const ExtensionWarningSet& warnings,
+bool HasWarning(const WarningSet& warnings,
                 const std::string& extension_id) {
-  for (ExtensionWarningSet::const_iterator i = warnings.begin();
+  for (WarningSet::const_iterator i = warnings.begin();
        i != warnings.end(); ++i) {
     if (i->extension_id() == extension_id)
       return true;
@@ -1347,7 +1347,7 @@
   EventResponseDeltas deltas;
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
   GURL effective_new_url;
 
   // No redirect
@@ -1428,7 +1428,7 @@
   EventResponseDeltas deltas;
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
   GURL effective_new_url;
 
   // Single redirect.
@@ -1497,7 +1497,7 @@
   EventResponseDeltas deltas;
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
   GURL effective_new_url;
 
   // Single redirect.
@@ -1533,7 +1533,7 @@
   base_headers.AddHeaderFromString("key2: value 2");
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
   std::string header_value;
   EventResponseDeltas deltas;
 
@@ -1629,7 +1629,7 @@
       "Cookie: name=value; name2=value2; name3=\"value3\"");
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
   std::string header_value;
   EventResponseDeltas deltas;
 
@@ -1713,7 +1713,7 @@
      TestMergeCookiesInOnHeadersReceivedResponses) {
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
   std::string header_value;
   EventResponseDeltas deltas;
 
@@ -1948,7 +1948,7 @@
 TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) {
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
   std::string header_value;
   EventResponseDeltas deltas;
 
@@ -2048,7 +2048,7 @@
      TestMergeOnHeadersReceivedResponsesDeletion) {
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
   std::string header_value;
   EventResponseDeltas deltas;
 
@@ -2102,7 +2102,7 @@
   EventResponseDeltas deltas;
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
 
   char base_headers_string[] =
       "HTTP/1.0 200 OK\r\n"
@@ -2155,7 +2155,7 @@
 TEST(ExtensionWebRequestHelpersTest, TestMergeOnAuthRequiredResponses) {
   net::CapturingBoundNetLog capturing_net_log;
   net::BoundNetLog net_log = capturing_net_log.bound();
-  ExtensionWarningSet warning_set;
+  WarningSet warning_set;
   EventResponseDeltas deltas;
   base::string16 username = base::ASCIIToUTF16("foo");
   base::string16 password = base::ASCIIToUTF16("bar");
diff --git a/chrome/browser/extensions/api/web_request/web_request_time_tracker.cc b/chrome/browser/extensions/api/web_request/web_request_time_tracker.cc
index d95e2b8..0c7094a7 100644
--- a/chrome/browser/extensions/api/web_request/web_request_time_tracker.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_time_tracker.cc
@@ -9,9 +9,9 @@
 #include "base/metrics/histogram.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "content/public/browser/browser_thread.h"
+#include "extensions/browser/warning_set.h"
 
 using content::BrowserThread;
 
diff --git a/chrome/browser/extensions/extension_system_impl.cc b/chrome/browser/extensions/extension_system_impl.cc
index 3e17480..63583caa3 100644
--- a/chrome/browser/extensions/extension_system_impl.cc
+++ b/chrome/browser/extensions/extension_system_impl.cc
@@ -24,7 +24,6 @@
 #include "chrome/browser/extensions/extension_system_factory.h"
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/extension_warning_badge_service.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "chrome/browser/extensions/install_verifier.h"
 #include "chrome/browser/extensions/navigation_observer.h"
 #include "chrome/browser/extensions/shared_module_service.h"
@@ -59,6 +58,8 @@
 #include "extensions/browser/quota_service.h"
 #include "extensions/browser/runtime_data.h"
 #include "extensions/browser/state_store.h"
+#include "extensions/browser/warning_service.h"
+#include "extensions/browser/warning_set.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest.h"
@@ -383,10 +384,10 @@
   // Make the chrome://extension-icon/ resource available.
   content::URLDataSource::Add(profile_, new ExtensionIconSource(profile_));
 
-  extension_warning_service_.reset(new ExtensionWarningService(profile_));
+  warning_service_.reset(new WarningService(profile_));
   extension_warning_badge_service_.reset(
       new ExtensionWarningBadgeService(profile_));
-  extension_warning_service_->AddObserver(
+  warning_service_->AddObserver(
       extension_warning_badge_service_.get());
   error_console_.reset(new ErrorConsole(profile_));
   quota_service_.reset(new QuotaService);
@@ -411,8 +412,8 @@
 }
 
 void ExtensionSystemImpl::Shared::Shutdown() {
-  if (extension_warning_service_) {
-    extension_warning_service_->RemoveObserver(
+  if (warning_service_) {
+    warning_service_->RemoveObserver(
         extension_warning_badge_service_.get());
   }
   if (content_verifier_.get())
@@ -461,8 +462,8 @@
   return event_router_.get();
 }
 
-ExtensionWarningService* ExtensionSystemImpl::Shared::warning_service() {
-  return extension_warning_service_.get();
+WarningService* ExtensionSystemImpl::Shared::warning_service() {
+  return warning_service_.get();
 }
 
 Blacklist* ExtensionSystemImpl::Shared::blacklist() {
@@ -579,7 +580,7 @@
   return shared_->event_router();
 }
 
-ExtensionWarningService* ExtensionSystemImpl::warning_service() {
+WarningService* ExtensionSystemImpl::warning_service() {
   return shared_->warning_service();
 }
 
diff --git a/chrome/browser/extensions/extension_system_impl.h b/chrome/browser/extensions/extension_system_impl.h
index 2f1eddc..8b0b39e 100644
--- a/chrome/browser/extensions/extension_system_impl.h
+++ b/chrome/browser/extensions/extension_system_impl.h
@@ -49,7 +49,7 @@
       OVERRIDE;  // shared
   virtual InfoMap* info_map() OVERRIDE; // shared
   virtual EventRouter* event_router() OVERRIDE;  // shared
-  virtual ExtensionWarningService* warning_service() OVERRIDE;
+  virtual WarningService* warning_service() OVERRIDE;
   virtual Blacklist* blacklist() OVERRIDE;  // shared
   virtual ErrorConsole* error_console() OVERRIDE;
   virtual InstallVerifier* install_verifier() OVERRIDE;
@@ -100,7 +100,7 @@
     InfoMap* info_map();
     LazyBackgroundTaskQueue* lazy_background_task_queue();
     EventRouter* event_router();
-    ExtensionWarningService* warning_service();
+    WarningService* warning_service();
     ErrorConsole* error_console();
     InstallVerifier* install_verifier();
     QuotaService* quota_service();
@@ -141,7 +141,7 @@
     scoped_ptr<ManagementPolicy> management_policy_;
     // extension_info_map_ needs to outlive process_manager_.
     scoped_refptr<InfoMap> extension_info_map_;
-    scoped_ptr<ExtensionWarningService> extension_warning_service_;
+    scoped_ptr<WarningService> warning_service_;
     scoped_ptr<ExtensionWarningBadgeService> extension_warning_badge_service_;
     scoped_ptr<ErrorConsole> error_console_;
     scoped_ptr<InstallVerifier> install_verifier_;
diff --git a/chrome/browser/extensions/extension_warning_badge_service.cc b/chrome/browser/extensions/extension_warning_badge_service.cc
index 7aa6bbc..b34ad6b 100644
--- a/chrome/browser/extensions/extension_warning_badge_service.cc
+++ b/chrome/browser/extensions/extension_warning_badge_service.cc
@@ -99,15 +99,14 @@
   DCHECK(CalledOnValidThread());
   size_t old_size = suppressed_warnings_.size();
 
-  const ExtensionWarningSet& warnings = GetCurrentWarnings();
+  const WarningSet& warnings = GetCurrentWarnings();
   suppressed_warnings_.insert(warnings.begin(), warnings.end());
 
   if (old_size != suppressed_warnings_.size())
     UpdateBadgeStatus();
 }
 
-const ExtensionWarningSet&
-ExtensionWarningBadgeService::GetCurrentWarnings() const {
+const WarningSet& ExtensionWarningBadgeService::GetCurrentWarnings() const {
   return ExtensionSystem::Get(profile_)->warning_service()->warnings();
 }
 
@@ -117,9 +116,9 @@
 }
 
 void ExtensionWarningBadgeService::UpdateBadgeStatus() {
-  const std::set<ExtensionWarning>& warnings = GetCurrentWarnings();
+  const std::set<Warning>& warnings = GetCurrentWarnings();
   bool non_suppressed_warnings_exist = false;
-  for (std::set<ExtensionWarning>::const_iterator i = warnings.begin();
+  for (std::set<Warning>::const_iterator i = warnings.begin();
        i != warnings.end(); ++i) {
     if (!ContainsKey(suppressed_warnings_, *i)) {
       non_suppressed_warnings_exist = true;
diff --git a/chrome/browser/extensions/extension_warning_badge_service.h b/chrome/browser/extensions/extension_warning_badge_service.h
index 461bc5c..a000bb7f 100644
--- a/chrome/browser/extensions/extension_warning_badge_service.h
+++ b/chrome/browser/extensions/extension_warning_badge_service.h
@@ -7,8 +7,8 @@
 
 #include "base/compiler_specific.h"
 #include "base/threading/non_thread_safe.h"
-#include "chrome/browser/extensions/extension_warning_service.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
+#include "extensions/browser/warning_service.h"
+#include "extensions/browser/warning_set.h"
 
 // TODO(battre): Rename ExtensionWarningBadgeService to WarningBadgeService.
 
@@ -18,7 +18,7 @@
 
 // A service that is responsible for showing an extension warning badge on the
 // wrench menu.
-class ExtensionWarningBadgeService : public ExtensionWarningService::Observer,
+class ExtensionWarningBadgeService : public WarningService::Observer,
                                      public base::NonThreadSafe {
  public:
   explicit ExtensionWarningBadgeService(Profile* profile);
@@ -30,10 +30,10 @@
 
  protected:
   // Virtual for testing.
-  virtual const std::set<ExtensionWarning>& GetCurrentWarnings() const;
+  virtual const std::set<Warning>& GetCurrentWarnings() const;
 
  private:
-  // Implementation of ExtensionWarningService::Observer.
+  // Implementation of WarningService::Observer.
   virtual void ExtensionWarningsChanged() OVERRIDE;
 
   void UpdateBadgeStatus();
@@ -42,7 +42,7 @@
   Profile* profile_;
 
   // Warnings that do not trigger a badge on the wrench menu.
-  ExtensionWarningSet suppressed_warnings_;
+  WarningSet suppressed_warnings_;
 
   DISALLOW_COPY_AND_ASSIGN(ExtensionWarningBadgeService);
 };
diff --git a/chrome/browser/extensions/extension_warning_badge_service_unittest.cc b/chrome/browser/extensions/extension_warning_badge_service_unittest.cc
index 2eb9174..4b144d1 100644
--- a/chrome/browser/extensions/extension_warning_badge_service_unittest.cc
+++ b/chrome/browser/extensions/extension_warning_badge_service_unittest.cc
@@ -5,26 +5,26 @@
 #include "chrome/browser/extensions/extension_warning_badge_service.h"
 
 #include "chrome/app/chrome_command_ids.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
 #include "chrome/test/base/testing_profile.h"
+#include "extensions/browser/warning_service.h"
+#include "extensions/browser/warning_set.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace extensions {
 
 namespace {
 
-class TestExtensionWarningSet : public ExtensionWarningService {
+class TestExtensionWarningSet : public WarningService {
  public:
-  explicit TestExtensionWarningSet(Profile* profile)
-      : ExtensionWarningService(profile) {
+  explicit TestExtensionWarningSet(Profile* profile) : WarningService(profile) {
   }
   virtual ~TestExtensionWarningSet() {}
 
-  void AddWarning(const ExtensionWarning& warning) {
-    ExtensionWarningSet warnings;
+  void AddWarning(const Warning& warning) {
+    WarningSet warnings;
     warnings.insert(warning);
     AddWarnings(warnings);
   }
@@ -33,18 +33,18 @@
 class TestExtensionWarningBadgeService : public ExtensionWarningBadgeService {
  public:
   TestExtensionWarningBadgeService(Profile* profile,
-                                   ExtensionWarningService* warning_service)
+                                   WarningService* warning_service)
       : ExtensionWarningBadgeService(profile),
         warning_service_(warning_service) {}
   virtual ~TestExtensionWarningBadgeService() {}
 
-  virtual const std::set<ExtensionWarning>&
+  virtual const std::set<Warning>&
   GetCurrentWarnings() const OVERRIDE {
     return warning_service_->warnings();
   }
 
  private:
-  ExtensionWarningService* warning_service_;
+  WarningService* warning_service_;
 };
 
 bool HasBadge(Profile* profile) {
@@ -68,7 +68,7 @@
   warnings.AddObserver(&badge_service);
 
   // Insert first warning.
-  warnings.AddWarning(ExtensionWarning::CreateNetworkDelayWarning(ext1_id));
+  warnings.AddWarning(Warning::CreateNetworkDelayWarning(ext1_id));
   EXPECT_TRUE(HasBadge(&profile));
 
   // Suppress first warning.
@@ -76,17 +76,17 @@
   EXPECT_FALSE(HasBadge(&profile));
 
   // Simulate deinstallation of extension.
-  std::set<ExtensionWarning::WarningType> to_clear =
+  std::set<Warning::WarningType> to_clear =
       warnings.GetWarningTypesAffectingExtension(ext1_id);
   warnings.ClearWarnings(to_clear);
   EXPECT_FALSE(HasBadge(&profile));
 
   // Set first warning again and verify that not badge is shown this time.
-  warnings.AddWarning(ExtensionWarning::CreateNetworkDelayWarning(ext1_id));
+  warnings.AddWarning(Warning::CreateNetworkDelayWarning(ext1_id));
   EXPECT_FALSE(HasBadge(&profile));
 
   // Set second warning and verify that it shows a badge.
-  warnings.AddWarning(ExtensionWarning::CreateNetworkConflictWarning(ext2_id));
+  warnings.AddWarning(Warning::CreateNetworkConflictWarning(ext2_id));
   EXPECT_TRUE(HasBadge(&profile));
 
   warnings.RemoveObserver(&badge_service);
diff --git a/chrome/browser/extensions/extension_warning_service.cc b/chrome/browser/extensions/extension_warning_service.cc
deleted file mode 100644
index ab929a2..0000000
--- a/chrome/browser/extensions/extension_warning_service.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (c) 2012 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 "chrome/browser/extensions/extension_warning_service.h"
-
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "content/public/browser/browser_thread.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/browser/extension_system.h"
-
-using content::BrowserThread;
-
-namespace extensions {
-
-ExtensionWarningService::ExtensionWarningService(Profile* profile)
-    : profile_(profile), extension_registry_observer_(this) {
-  DCHECK(CalledOnValidThread());
-  if (profile_) {
-    extension_registry_observer_.Add(
-        ExtensionRegistry::Get(profile_->GetOriginalProfile()));
-  }
-}
-
-ExtensionWarningService::~ExtensionWarningService() {}
-
-void ExtensionWarningService::ClearWarnings(
-    const std::set<ExtensionWarning::WarningType>& types) {
-  DCHECK(CalledOnValidThread());
-  bool deleted_anything = false;
-  for (ExtensionWarningSet::iterator i = warnings_.begin();
-       i != warnings_.end();) {
-    if (types.find(i->warning_type()) != types.end()) {
-      deleted_anything = true;
-      warnings_.erase(i++);
-    } else {
-      ++i;
-    }
-  }
-
-  if (deleted_anything)
-    NotifyWarningsChanged();
-}
-
-std::set<ExtensionWarning::WarningType>
-ExtensionWarningService::GetWarningTypesAffectingExtension(
-    const std::string& extension_id) const {
-  DCHECK(CalledOnValidThread());
-  std::set<ExtensionWarning::WarningType> result;
-  for (ExtensionWarningSet::const_iterator i = warnings_.begin();
-       i != warnings_.end(); ++i) {
-    if (i->extension_id() == extension_id)
-      result.insert(i->warning_type());
-  }
-  return result;
-}
-
-std::vector<std::string>
-ExtensionWarningService::GetWarningMessagesForExtension(
-    const std::string& extension_id) const {
-  DCHECK(CalledOnValidThread());
-  std::vector<std::string> result;
-
-  const ExtensionService* extension_service =
-      ExtensionSystem::Get(profile_)->extension_service();
-
-  for (ExtensionWarningSet::const_iterator i = warnings_.begin();
-       i != warnings_.end(); ++i) {
-    if (i->extension_id() == extension_id)
-      result.push_back(i->GetLocalizedMessage(extension_service->extensions()));
-  }
-  return result;
-}
-
-void ExtensionWarningService::AddWarnings(
-    const ExtensionWarningSet& warnings) {
-  DCHECK(CalledOnValidThread());
-  size_t old_size = warnings_.size();
-
-  warnings_.insert(warnings.begin(), warnings.end());
-
-  if (old_size != warnings_.size())
-    NotifyWarningsChanged();
-}
-
-// static
-void ExtensionWarningService::NotifyWarningsOnUI(
-    void* profile_id,
-    const ExtensionWarningSet& warnings) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  Profile* profile = reinterpret_cast<Profile*>(profile_id);
-  if (!profile ||
-      !g_browser_process->profile_manager() ||
-      !g_browser_process->profile_manager()->IsValidProfile(profile)) {
-    return;
-  }
-
-  extensions::ExtensionWarningService* warning_service =
-      extensions::ExtensionSystem::Get(profile)->warning_service();
-
-  warning_service->AddWarnings(warnings);
-}
-
-void ExtensionWarningService::AddObserver(Observer* observer) {
-  observer_list_.AddObserver(observer);
-}
-
-void ExtensionWarningService::RemoveObserver(Observer* observer) {
-  observer_list_.RemoveObserver(observer);
-}
-
-void ExtensionWarningService::NotifyWarningsChanged() {
-  FOR_EACH_OBSERVER(Observer, observer_list_, ExtensionWarningsChanged());
-}
-
-void ExtensionWarningService::OnExtensionUnloaded(
-    content::BrowserContext* browser_context,
-    const Extension* extension,
-    UnloadedExtensionInfo::Reason reason) {
-  // Unloading one extension might have solved the problems of others.
-  // Therefore, we clear warnings of this type for all extensions.
-  std::set<ExtensionWarning::WarningType> warning_types =
-      GetWarningTypesAffectingExtension(extension->id());
-  ClearWarnings(warning_types);
-}
-
-}  // namespace extensions
diff --git a/chrome/browser/extensions/test_extension_system.cc b/chrome/browser/extensions/test_extension_system.cc
index b1cbb872..75ad63d 100644
--- a/chrome/browser/extensions/test_extension_system.cc
+++ b/chrome/browser/extensions/test_extension_system.cc
@@ -159,7 +159,7 @@
 
 EventRouter* TestExtensionSystem::event_router() { return event_router_.get(); }
 
-ExtensionWarningService* TestExtensionSystem::warning_service() {
+WarningService* TestExtensionSystem::warning_service() {
   return NULL;
 }
 
diff --git a/chrome/browser/extensions/test_extension_system.h b/chrome/browser/extensions/test_extension_system.h
index fb88ef3..d2164d9 100644
--- a/chrome/browser/extensions/test_extension_system.h
+++ b/chrome/browser/extensions/test_extension_system.h
@@ -73,7 +73,7 @@
   virtual LazyBackgroundTaskQueue* lazy_background_task_queue() OVERRIDE;
   void SetEventRouter(scoped_ptr<EventRouter> event_router);
   virtual EventRouter* event_router() OVERRIDE;
-  virtual ExtensionWarningService* warning_service() OVERRIDE;
+  virtual WarningService* warning_service() OVERRIDE;
   virtual Blacklist* blacklist() OVERRIDE;
   virtual ErrorConsole* error_console() OVERRIDE;
   virtual InstallVerifier* install_verifier() OVERRIDE;
diff --git a/chrome/browser/ui/webui/extensions/extension_settings_handler.cc b/chrome/browser/ui/webui/extensions/extension_settings_handler.cc
index 8885a578..87f8a3f3 100644
--- a/chrome/browser/ui/webui/extensions/extension_settings_handler.cc
+++ b/chrome/browser/ui/webui/extensions/extension_settings_handler.cc
@@ -37,7 +37,6 @@
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_ui_util.h"
 #include "chrome/browser/extensions/extension_util.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "chrome/browser/extensions/install_verifier.h"
 #include "chrome/browser/extensions/path_util.h"
 #include "chrome/browser/extensions/shared_module_service.h"
@@ -84,6 +83,7 @@
 #include "extensions/browser/pref_names.h"
 #include "extensions/browser/uninstall_reason.h"
 #include "extensions/browser/view_type_utils.h"
+#include "extensions/browser/warning_set.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_icon_set.h"
@@ -210,7 +210,7 @@
 base::DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue(
     const Extension* extension,
     const std::vector<ExtensionPage>& pages,
-    const ExtensionWarningService* warning_service) {
+    const WarningService* warning_service) {
   // The items which are to be written into app_dict are also described in
   // chrome/browser/resources/extensions/extension_list.js in @typedef for
   // ExtensionData. Please update it whenever you add or remove any keys here.
@@ -829,8 +829,7 @@
   // Add the extensions to the results structure.
   base::ListValue* extensions_list = new base::ListValue();
 
-  ExtensionWarningService* warnings =
-      ExtensionSystem::Get(profile)->warning_service();
+  WarningService* warnings = ExtensionSystem::Get(profile)->warning_service();
 
   ExtensionRegistry* registry = ExtensionRegistry::Get(profile);
   const ExtensionSet& enabled_set = registry->enabled_extensions();
diff --git a/chrome/browser/ui/webui/extensions/extension_settings_handler.h b/chrome/browser/ui/webui/extensions/extension_settings_handler.h
index d299a54..7cca3a3 100644
--- a/chrome/browser/ui/webui/extensions/extension_settings_handler.h
+++ b/chrome/browser/ui/webui/extensions/extension_settings_handler.h
@@ -16,7 +16,6 @@
 #include "chrome/browser/extensions/extension_install_prompt.h"
 #include "chrome/browser/extensions/extension_install_ui.h"
 #include "chrome/browser/extensions/extension_uninstall_dialog.h"
-#include "chrome/browser/extensions/extension_warning_service.h"
 #include "chrome/browser/extensions/requirements_checker.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/notification_observer.h"
@@ -26,6 +25,7 @@
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_prefs_observer.h"
 #include "extensions/browser/extension_registry_observer.h"
+#include "extensions/browser/warning_service.h"
 #include "url/gurl.h"
 
 class ExtensionService;
@@ -74,7 +74,7 @@
       public ExtensionPrefsObserver,
       public ExtensionRegistryObserver,
       public ExtensionUninstallDialog::Delegate,
-      public ExtensionWarningService::Observer,
+      public WarningService::Observer,
       public base::SupportsWeakPtr<ExtensionSettingsHandler> {
  public:
   ExtensionSettingsHandler();
@@ -88,7 +88,7 @@
   base::DictionaryValue* CreateExtensionDetailValue(
       const Extension* extension,
       const std::vector<ExtensionPage>& pages,
-      const ExtensionWarningService* warning_service);
+      const WarningService* warning_service);
 
   void GetLocalizedValues(content::WebUIDataSource* source);
 
@@ -139,7 +139,7 @@
   virtual void ExtensionUninstallAccepted() OVERRIDE;
   virtual void ExtensionUninstallCanceled() OVERRIDE;
 
-  // ExtensionWarningService::Observer implementation.
+  // WarningService::Observer implementation.
   virtual void ExtensionWarningsChanged() OVERRIDE;
 
   // ExtensionInstallPrompt::Delegate implementation.
@@ -286,7 +286,7 @@
   // The UI for showing what permissions the extension has.
   scoped_ptr<ExtensionInstallPrompt> prompt_;
 
-  ScopedObserver<ExtensionWarningService, ExtensionWarningService::Observer>
+  ScopedObserver<WarningService, WarningService::Observer>
       warning_service_observer_;
 
   // An observer to listen for when Extension errors are reported.
diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi
index 5024a7f5..1c3a89e6 100644
--- a/chrome/chrome_browser_extensions.gypi
+++ b/chrome/chrome_browser_extensions.gypi
@@ -760,10 +760,6 @@
       'browser/extensions/extension_view_host_mac.mm',
       'browser/extensions/extension_warning_badge_service.cc',
       'browser/extensions/extension_warning_badge_service.h',
-      'browser/extensions/extension_warning_service.cc',
-      'browser/extensions/extension_warning_service.h',
-      'browser/extensions/extension_warning_set.cc',
-      'browser/extensions/extension_warning_set.h',
       'browser/extensions/extension_web_ui.cc',
       'browser/extensions/extension_web_ui.h',
       'browser/extensions/extension_web_ui_override_registrar.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 3dc3704..70cd9ea5 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -953,7 +953,6 @@
         'browser/extensions/extension_toolbar_model_unittest.cc',
         'browser/extensions/extension_ui_unittest.cc',
         'browser/extensions/extension_warning_badge_service_unittest.cc',
-        'browser/extensions/extension_warning_service_unittest.cc',
         'browser/extensions/extension_web_ui_unittest.cc',
         'browser/extensions/external_policy_loader_unittest.cc',
         'browser/extensions/external_provider_impl_unittest.cc',
diff --git a/chrome/common/extensions/chrome_extensions_client.cc b/chrome/common/extensions/chrome_extensions_client.cc
index 80befd80..d29b353 100644
--- a/chrome/common/extensions/chrome_extensions_client.cc
+++ b/chrome/common/extensions/chrome_extensions_client.cc
@@ -11,6 +11,7 @@
 #include "chrome/common/extensions/features/chrome_channel_feature_filter.h"
 #include "chrome/common/extensions/features/feature_channel.h"
 #include "chrome/common/url_constants.h"
+#include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/common_resources.h"
 #include "chrome/grit/generated_resources.h"
 #include "content/public/common/url_constants.h"
@@ -100,6 +101,10 @@
   return permission_message_provider_;
 }
 
+const std::string ChromeExtensionsClient::GetProductName() {
+  return l10n_util::GetStringUTF8(IDS_PRODUCT_NAME);
+}
+
 scoped_ptr<FeatureProvider> ChromeExtensionsClient::CreateFeatureProvider(
     const std::string& name) const {
   scoped_ptr<FeatureProvider> provider;
diff --git a/chrome/common/extensions/chrome_extensions_client.h b/chrome/common/extensions/chrome_extensions_client.h
index 03474f5..27a3e2cb 100644
--- a/chrome/common/extensions/chrome_extensions_client.h
+++ b/chrome/common/extensions/chrome_extensions_client.h
@@ -26,6 +26,7 @@
 
   virtual const PermissionMessageProvider& GetPermissionMessageProvider() const
       OVERRIDE;
+  virtual const std::string GetProductName() OVERRIDE;
   virtual scoped_ptr<FeatureProvider> CreateFeatureProvider(
       const std::string& name) const OVERRIDE;
   virtual scoped_ptr<JSONFeatureProviderSource> CreateFeatureProviderSource(
diff --git a/extensions/browser/extension_system.h b/extensions/browser/extension_system.h
index 3f297ee..4f8dc84 100644
--- a/extensions/browser/extension_system.h
+++ b/extensions/browser/extension_system.h
@@ -32,7 +32,6 @@
 class EventRouter;
 class Extension;
 class ExtensionSet;
-class ExtensionWarningService;
 class InfoMap;
 class InstallVerifier;
 class LazyBackgroundTaskQueue;
@@ -43,6 +42,7 @@
 class RuntimeData;
 class SharedUserScriptMaster;
 class StateStore;
+class WarningService;
 
 // ExtensionSystem manages the lifetime of many of the services used by the
 // extensions and apps system, and it handles startup and shutdown as needed.
@@ -94,8 +94,8 @@
   // The EventRouter is created at startup.
   virtual EventRouter* event_router() = 0;
 
-  // The ExtensionWarningService is created at startup.
-  virtual ExtensionWarningService* warning_service() = 0;
+  // The WarningService is created at startup.
+  virtual WarningService* warning_service() = 0;
 
   // The blacklist is created at startup.
   virtual Blacklist* blacklist() = 0;
diff --git a/extensions/browser/mock_extension_system.cc b/extensions/browser/mock_extension_system.cc
index d11c398d..8e1902f 100644
--- a/extensions/browser/mock_extension_system.cc
+++ b/extensions/browser/mock_extension_system.cc
@@ -62,7 +62,7 @@
   return NULL;
 }
 
-ExtensionWarningService* MockExtensionSystem::warning_service() {
+WarningService* MockExtensionSystem::warning_service() {
   return NULL;
 }
 
diff --git a/extensions/browser/mock_extension_system.h b/extensions/browser/mock_extension_system.h
index 4b227bd8..7a500dc 100644
--- a/extensions/browser/mock_extension_system.h
+++ b/extensions/browser/mock_extension_system.h
@@ -37,7 +37,7 @@
   virtual InfoMap* info_map() OVERRIDE;
   virtual LazyBackgroundTaskQueue* lazy_background_task_queue() OVERRIDE;
   virtual EventRouter* event_router() OVERRIDE;
-  virtual ExtensionWarningService* warning_service() OVERRIDE;
+  virtual WarningService* warning_service() OVERRIDE;
   virtual Blacklist* blacklist() OVERRIDE;
   virtual ErrorConsole* error_console() OVERRIDE;
   virtual InstallVerifier* install_verifier() OVERRIDE;
diff --git a/extensions/browser/warning_service.cc b/extensions/browser/warning_service.cc
new file mode 100644
index 0000000..a6fba18
--- /dev/null
+++ b/extensions/browser/warning_service.cc
@@ -0,0 +1,127 @@
+// Copyright (c) 2012 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 "extensions/browser/warning_service.h"
+
+#include "content/public/browser/browser_thread.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/browser/extensions_browser_client.h"
+#include "extensions/common/extension_set.h"
+
+using content::BrowserThread;
+
+namespace extensions {
+
+WarningService::WarningService(content::BrowserContext* browser_context)
+    : browser_context_(browser_context), extension_registry_observer_(this) {
+  DCHECK(CalledOnValidThread());
+  if (browser_context_) {
+    extension_registry_observer_.Add(ExtensionRegistry::Get(
+        ExtensionsBrowserClient::Get()->GetOriginalContext(browser_context_)));
+  }
+}
+
+WarningService::~WarningService() {}
+
+void WarningService::ClearWarnings(
+    const std::set<Warning::WarningType>& types) {
+  DCHECK(CalledOnValidThread());
+  bool deleted_anything = false;
+  for (WarningSet::iterator i = warnings_.begin();
+       i != warnings_.end();) {
+    if (types.find(i->warning_type()) != types.end()) {
+      deleted_anything = true;
+      warnings_.erase(i++);
+    } else {
+      ++i;
+    }
+  }
+
+  if (deleted_anything)
+    NotifyWarningsChanged();
+}
+
+std::set<Warning::WarningType> WarningService::
+    GetWarningTypesAffectingExtension(const std::string& extension_id) const {
+  DCHECK(CalledOnValidThread());
+  std::set<Warning::WarningType> result;
+  for (WarningSet::const_iterator i = warnings_.begin();
+       i != warnings_.end(); ++i) {
+    if (i->extension_id() == extension_id)
+      result.insert(i->warning_type());
+  }
+  return result;
+}
+
+std::vector<std::string> WarningService::GetWarningMessagesForExtension(
+    const std::string& extension_id) const {
+  DCHECK(CalledOnValidThread());
+  std::vector<std::string> result;
+
+  const ExtensionSet& extension_set =
+      ExtensionRegistry::Get(browser_context_)->enabled_extensions();
+
+  for (WarningSet::const_iterator i = warnings_.begin();
+       i != warnings_.end(); ++i) {
+    if (i->extension_id() == extension_id)
+      result.push_back(i->GetLocalizedMessage(&extension_set));
+  }
+  return result;
+}
+
+void WarningService::AddWarnings(const WarningSet& warnings) {
+  DCHECK(CalledOnValidThread());
+  size_t old_size = warnings_.size();
+
+  warnings_.insert(warnings.begin(), warnings.end());
+
+  if (old_size != warnings_.size())
+    NotifyWarningsChanged();
+}
+
+// static
+void WarningService::NotifyWarningsOnUI(
+    void* profile_id,
+    const WarningSet& warnings) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  content::BrowserContext* browser_context =
+      reinterpret_cast<content::BrowserContext*>(profile_id);
+
+  if (!browser_context ||
+      !ExtensionsBrowserClient::Get() ||
+      !ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) {
+    return;
+  }
+
+  WarningService* warning_service =
+      ExtensionSystem::Get(browser_context)->warning_service();
+
+  warning_service->AddWarnings(warnings);
+}
+
+void WarningService::AddObserver(Observer* observer) {
+  observer_list_.AddObserver(observer);
+}
+
+void WarningService::RemoveObserver(Observer* observer) {
+  observer_list_.RemoveObserver(observer);
+}
+
+void WarningService::NotifyWarningsChanged() {
+  FOR_EACH_OBSERVER(Observer, observer_list_, ExtensionWarningsChanged());
+}
+
+void WarningService::OnExtensionUnloaded(
+    content::BrowserContext* browser_context,
+    const Extension* extension,
+    UnloadedExtensionInfo::Reason reason) {
+  // Unloading one extension might have solved the problems of others.
+  // Therefore, we clear warnings of this type for all extensions.
+  std::set<Warning::WarningType> warning_types =
+      GetWarningTypesAffectingExtension(extension->id());
+  ClearWarnings(warning_types);
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/extension_warning_service.h b/extensions/browser/warning_service.h
similarity index 63%
rename from chrome/browser/extensions/extension_warning_service.h
rename to extensions/browser/warning_service.h
index c311859d..f675e1f 100644
--- a/chrome/browser/extensions/extension_warning_service.h
+++ b/extensions/browser/warning_service.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 CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SERVICE_H_
-#define CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SERVICE_H_
+#ifndef EXTENSIONS_BROWSER_WARNING_SERVICE_H_
+#define EXTENSIONS_BROWSER_WARNING_SERVICE_H_
 
 #include <set>
 #include <string>
@@ -12,14 +12,13 @@
 #include "base/observer_list.h"
 #include "base/scoped_observer.h"
 #include "base/threading/non_thread_safe.h"
-#include "chrome/browser/extensions/extension_warning_set.h"
 #include "extensions/browser/extension_registry_observer.h"
+#include "extensions/browser/warning_set.h"
 
 // TODO(battre) Remove the Extension prefix.
 
-class Profile;
-
 namespace content {
+class BrowserContext;
 class NotificationDetails;
 class NotificationSource;
 }
@@ -32,40 +31,39 @@
 // 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 ExtensionWarningService : public ExtensionRegistryObserver,
-                                public base::NonThreadSafe {
+class WarningService : public ExtensionRegistryObserver,
+                       public base::NonThreadSafe {
  public:
   class Observer {
    public:
     virtual void ExtensionWarningsChanged() = 0;
   };
 
-  // |profile| may be NULL for testing. In this case, be sure to not insert
-  // any warnings.
-  explicit ExtensionWarningService(Profile* profile);
-  virtual ~ExtensionWarningService();
+  // |browser_context| may be NULL for testing. In this case, be sure to not
+  // insert any warnings.
+  explicit WarningService(content::BrowserContext* browser_context);
+  virtual ~WarningService();
 
   // Clears all warnings of types contained in |types| and notifies observers
   // of the changed warnings.
-  void ClearWarnings(const std::set<ExtensionWarning::WarningType>& types);
+  void ClearWarnings(const std::set<Warning::WarningType>& types);
 
   // Returns all types of warnings effecting extension |extension_id|.
-  std::set<ExtensionWarning::WarningType> GetWarningTypesAffectingExtension(
+  std::set<Warning::WarningType> GetWarningTypesAffectingExtension(
       const std::string& extension_id) const;
 
   // Returns all localized warnings for extension |extension_id| in |result|.
   std::vector<std::string> GetWarningMessagesForExtension(
       const std::string& extension_id) const;
 
-  const ExtensionWarningSet& warnings() const { return warnings_; }
+  const WarningSet& warnings() const { return warnings_; }
 
   // Adds a set of warnings and notifies observers if any warning is new.
-  void AddWarnings(const ExtensionWarningSet& warnings);
+  void AddWarnings(const WarningSet& warnings);
 
-  // Notifies the ExtensionWarningService of profile |profile_id| that new
-  // |warnings| occurred and triggers a warning badge.
-  static void NotifyWarningsOnUI(void* profile_id,
-                                 const ExtensionWarningSet& warnings);
+  // Notifies the WarningService of browser_context |browser_context_id| that
+  // new |warnings| occurred and triggers a warning badge.
+  static void NotifyWarningsOnUI(void* profile_id, const WarningSet& warnings);
 
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
@@ -80,9 +78,9 @@
       OVERRIDE;
 
   // Currently existing warnings.
-  ExtensionWarningSet warnings_;
+  WarningSet warnings_;
 
-  Profile* profile_;
+  content::BrowserContext* const browser_context_;
 
   // Listen to extension unloaded notifications.
   ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
@@ -93,4 +91,4 @@
 
 }  // namespace extensions
 
-#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SERVICE_H_
+#endif  // EXTENSIONS_BROWSER_WARNING_SERVICE_H_
diff --git a/chrome/browser/extensions/extension_warning_service_unittest.cc b/extensions/browser/warning_service_unittest.cc
similarity index 63%
rename from chrome/browser/extensions/extension_warning_service_unittest.cc
rename to extensions/browser/warning_service_unittest.cc
index 7ad5b82b..96bb898c 100644
--- a/chrome/browser/extensions/extension_warning_service_unittest.cc
+++ b/extensions/browser/warning_service_unittest.cc
@@ -2,12 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/extensions/extension_warning_service.h"
+#include "extensions/browser/warning_service.h"
 
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/global_error/global_error_service.h"
-#include "chrome/browser/ui/global_error/global_error_service_factory.h"
-#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/test_browser_context.h"
+#include "extensions/browser/extensions_test.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -15,52 +13,54 @@
 
 namespace {
 
-class TestExtensionWarningService : public ExtensionWarningService {
+class TestWarningService : public WarningService {
  public:
-  explicit TestExtensionWarningService(Profile* profile)
-      : ExtensionWarningService(profile) {
+  explicit TestWarningService(content::BrowserContext* browser_context)
+      : WarningService(browser_context) {
   }
-  virtual ~TestExtensionWarningService() {}
+  virtual ~TestWarningService() {}
 
-  void AddWarning(const ExtensionWarning& warning) {
-    ExtensionWarningSet warnings;
+  void AddWarning(const Warning& warning) {
+    WarningSet warnings;
     warnings.insert(warning);
     AddWarnings(warnings);
   }
 };
 
-class MockObserver : public ExtensionWarningService::Observer {
+class MockObserver : public WarningService::Observer {
  public:
   virtual ~MockObserver() {}
   MOCK_METHOD0(ExtensionWarningsChanged, void());
 };
 
+typedef ExtensionsTest WarningServiceTest;
+
 const char* ext1_id = "extension1";
 const char* ext2_id = "extension2";
-const ExtensionWarning::WarningType warning_1 =
-    ExtensionWarning::kNetworkDelay;
-const ExtensionWarning::WarningType warning_2 =
-    ExtensionWarning::kNetworkConflict;
+const Warning::WarningType warning_1 =
+    Warning::kNetworkDelay;
+const Warning::WarningType warning_2 =
+    Warning::kNetworkConflict;
 
 }  // namespace
 
 // Check that inserting a warning triggers notifications, whereas inserting
 // the same warning again is silent.
-TEST(ExtensionWarningServiceTest, SetWarning) {
-  TestingProfile profile;
-  TestExtensionWarningService warning_service(&profile);
+TEST_F(WarningServiceTest, SetWarning) {
+  content::TestBrowserContext browser_context;
+  TestWarningService warning_service(&browser_context);
   MockObserver observer;
   warning_service.AddObserver(&observer);
 
   // Insert warning for the first time.
   EXPECT_CALL(observer, ExtensionWarningsChanged());
   warning_service.AddWarning(
-      ExtensionWarning::CreateNetworkDelayWarning(ext1_id));
+      Warning::CreateNetworkDelayWarning(ext1_id));
   testing::Mock::VerifyAndClearExpectations(&warning_service);
 
   // Second insertion of same warning does not trigger anything.
   warning_service.AddWarning(
-      ExtensionWarning::CreateNetworkDelayWarning(ext1_id));
+      Warning::CreateNetworkDelayWarning(ext1_id));
   testing::Mock::VerifyAndClearExpectations(&warning_service);
 
   warning_service.RemoveObserver(&observer);
@@ -68,29 +68,29 @@
 
 // Check that ClearWarnings deletes exactly the specified warnings and
 // triggers notifications where appropriate.
-TEST(ExtensionWarningServiceTest, ClearWarnings) {
-  TestingProfile profile;
-  TestExtensionWarningService warning_service(&profile);
+TEST_F(WarningServiceTest, ClearWarnings) {
+  content::TestBrowserContext browser_context;
+  TestWarningService warning_service(&browser_context);
   MockObserver observer;
   warning_service.AddObserver(&observer);
 
   // Insert two unique warnings in one batch.
   EXPECT_CALL(observer, ExtensionWarningsChanged());
-  ExtensionWarningSet warning_set;
-  warning_set.insert(ExtensionWarning::CreateNetworkDelayWarning(ext1_id));
-  warning_set.insert(ExtensionWarning::CreateNetworkConflictWarning(ext2_id));
+  WarningSet warning_set;
+  warning_set.insert(Warning::CreateNetworkDelayWarning(ext1_id));
+  warning_set.insert(Warning::CreateNetworkConflictWarning(ext2_id));
   warning_service.AddWarnings(warning_set);
   testing::Mock::VerifyAndClearExpectations(&warning_service);
 
   // Remove one warning and check that the badge remains.
   EXPECT_CALL(observer, ExtensionWarningsChanged());
-  std::set<ExtensionWarning::WarningType> to_clear;
+  std::set<Warning::WarningType> to_clear;
   to_clear.insert(warning_2);
   warning_service.ClearWarnings(to_clear);
   testing::Mock::VerifyAndClearExpectations(&warning_service);
 
   // Check that the correct warnings appear in |warnings|.
-  std::set<ExtensionWarning::WarningType> existing_warnings =
+  std::set<Warning::WarningType> existing_warnings =
       warning_service.GetWarningTypesAffectingExtension(ext1_id);
   EXPECT_EQ(1u, existing_warnings.size());
   existing_warnings =
diff --git a/chrome/browser/extensions/extension_warning_set.cc b/extensions/browser/warning_set.cc
similarity index 79%
rename from chrome/browser/extensions/extension_warning_set.cc
rename to extensions/browser/warning_set.cc
index a7bf671..63dc550 100644
--- a/chrome/browser/extensions/extension_warning_set.cc
+++ b/extensions/browser/warning_set.cc
@@ -2,17 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/extensions/extension_warning_set.h"
+#include "extensions/browser/warning_set.h"
 
 #include "base/files/file_path.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/grit/chromium_strings.h"
-#include "chrome/grit/generated_resources.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_set.h"
+#include "extensions/common/extensions_client.h"
+#include "extensions/strings/grit/extensions_strings.h"
 #include "net/base/escape.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -28,10 +27,10 @@
 namespace extensions {
 
 //
-// ExtensionWarning
+// Warning
 //
 
-ExtensionWarning::ExtensionWarning(
+Warning::Warning(
     WarningType type,
     const std::string& extension_id,
     int message_id,
@@ -47,16 +46,16 @@
   CHECK_LE(message_parameters.size(), kMaxNumberOfParameters);
 }
 
-ExtensionWarning::ExtensionWarning(const ExtensionWarning& other)
+Warning::Warning(const Warning& other)
   : type_(other.type_),
     extension_id_(other.extension_id_),
     message_id_(other.message_id_),
     message_parameters_(other.message_parameters_) {}
 
-ExtensionWarning::~ExtensionWarning() {
+Warning::~Warning() {
 }
 
-ExtensionWarning& ExtensionWarning::operator=(const ExtensionWarning& other) {
+Warning& Warning::operator=(const Warning& other) {
   type_ = other.type_;
   extension_id_ = other.extension_id_;
   message_id_ = other.message_id_;
@@ -65,11 +64,11 @@
 }
 
 // static
-ExtensionWarning ExtensionWarning::CreateNetworkDelayWarning(
+Warning Warning::CreateNetworkDelayWarning(
     const std::string& extension_id) {
   std::vector<std::string> message_parameters;
-  message_parameters.push_back(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME));
-  return ExtensionWarning(
+  message_parameters.push_back(ExtensionsClient::Get()->GetProductName());
+  return Warning(
       kNetworkDelay,
       extension_id,
       IDS_EXTENSION_WARNINGS_NETWORK_DELAY,
@@ -77,10 +76,9 @@
 }
 
 // static
-ExtensionWarning ExtensionWarning::CreateNetworkConflictWarning(
-    const std::string& extension_id) {
+Warning Warning::CreateNetworkConflictWarning(const std::string& extension_id) {
   std::vector<std::string> message_parameters;
-  return ExtensionWarning(
+  return Warning(
       kNetworkConflict,
       extension_id,
       IDS_EXTENSION_WARNINGS_NETWORK_CONFLICT,
@@ -88,7 +86,7 @@
 }
 
 // static
-ExtensionWarning ExtensionWarning::CreateRedirectConflictWarning(
+Warning Warning::CreateRedirectConflictWarning(
     const std::string& extension_id,
     const std::string& winning_extension_id,
     const GURL& attempted_redirect_url,
@@ -97,7 +95,7 @@
   message_parameters.push_back(attempted_redirect_url.spec());
   message_parameters.push_back(kTranslate + winning_extension_id);
   message_parameters.push_back(winning_redirect_url.spec());
-  return ExtensionWarning(
+  return Warning(
       kRedirectConflict,
       extension_id,
       IDS_EXTENSION_WARNINGS_REDIRECT_CONFLICT,
@@ -105,14 +103,14 @@
 }
 
 // static
-ExtensionWarning ExtensionWarning::CreateRequestHeaderConflictWarning(
+Warning Warning::CreateRequestHeaderConflictWarning(
     const std::string& extension_id,
     const std::string& winning_extension_id,
     const std::string& conflicting_header) {
   std::vector<std::string> message_parameters;
   message_parameters.push_back(conflicting_header);
   message_parameters.push_back(kTranslate + winning_extension_id);
-  return ExtensionWarning(
+  return Warning(
       kNetworkConflict,
       extension_id,
       IDS_EXTENSION_WARNINGS_REQUEST_HEADER_CONFLICT,
@@ -120,14 +118,14 @@
 }
 
 // static
-ExtensionWarning ExtensionWarning::CreateResponseHeaderConflictWarning(
+Warning Warning::CreateResponseHeaderConflictWarning(
     const std::string& extension_id,
     const std::string& winning_extension_id,
     const std::string& conflicting_header) {
   std::vector<std::string> message_parameters;
   message_parameters.push_back(conflicting_header);
   message_parameters.push_back(kTranslate + winning_extension_id);
-  return ExtensionWarning(
+  return Warning(
       kNetworkConflict,
       extension_id,
       IDS_EXTENSION_WARNINGS_RESPONSE_HEADER_CONFLICT,
@@ -135,12 +133,12 @@
 }
 
 // static
-ExtensionWarning ExtensionWarning::CreateCredentialsConflictWarning(
+Warning Warning::CreateCredentialsConflictWarning(
     const std::string& extension_id,
     const std::string& winning_extension_id) {
   std::vector<std::string> message_parameters;
   message_parameters.push_back(kTranslate + winning_extension_id);
-  return ExtensionWarning(
+  return Warning(
       kNetworkConflict,
       extension_id,
       IDS_EXTENSION_WARNINGS_CREDENTIALS_CONFLICT,
@@ -148,11 +146,11 @@
 }
 
 // static
-ExtensionWarning ExtensionWarning::CreateRepeatedCacheFlushesWarning(
+Warning Warning::CreateRepeatedCacheFlushesWarning(
     const std::string& extension_id) {
   std::vector<std::string> message_parameters;
-  message_parameters.push_back(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME));
-  return ExtensionWarning(
+  message_parameters.push_back(ExtensionsClient::Get()->GetProductName());
+  return Warning(
       kRepeatedCacheFlushes,
       extension_id,
       IDS_EXTENSION_WARNINGS_NETWORK_DELAY,
@@ -160,7 +158,7 @@
 }
 
 // static
-ExtensionWarning ExtensionWarning::CreateDownloadFilenameConflictWarning(
+Warning Warning::CreateDownloadFilenameConflictWarning(
     const std::string& losing_extension_id,
     const std::string& winning_extension_id,
     const base::FilePath& losing_filename,
@@ -171,7 +169,7 @@
   message_parameters.push_back(kTranslate + winning_extension_id);
   message_parameters.push_back(base::UTF16ToUTF8(
       winning_filename.LossyDisplayName()));
-  return ExtensionWarning(
+  return Warning(
       kDownloadFilenameConflict,
       losing_extension_id,
       IDS_EXTENSION_WARNINGS_DOWNLOAD_FILENAME_CONFLICT,
@@ -179,17 +177,16 @@
 }
 
 // static
-ExtensionWarning ExtensionWarning::CreateReloadTooFrequentWarning(
+Warning Warning::CreateReloadTooFrequentWarning(
     const std::string& extension_id) {
   std::vector<std::string> message_parameters;
-  return ExtensionWarning(kReloadTooFrequent,
+  return Warning(kReloadTooFrequent,
                           extension_id,
                           IDS_EXTENSION_WARNING_RELOAD_TOO_FREQUENT,
                           message_parameters);
 }
 
-std::string ExtensionWarning::GetLocalizedMessage(
-    const ExtensionSet* extensions) const {
+std::string Warning::GetLocalizedMessage(const ExtensionSet* extensions) const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   // These parameters may be unsafe (URLs and Extension names) and need
@@ -228,7 +225,7 @@
   }
 }
 
-bool operator<(const ExtensionWarning& a, const ExtensionWarning& b) {
+bool operator<(const Warning& a, const Warning& b) {
   if (a.extension_id() != b.extension_id())
     return a.extension_id() < b.extension_id();
   return a.warning_type() < b.warning_type();
diff --git a/chrome/browser/extensions/extension_warning_set.h b/extensions/browser/warning_set.h
similarity index 67%
rename from chrome/browser/extensions/extension_warning_set.h
rename to extensions/browser/warning_set.h
index 2d7d0347..015c98ae 100644
--- a/chrome/browser/extensions/extension_warning_set.h
+++ b/extensions/browser/warning_set.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 CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SET_H_
-#define CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SET_H_
+#ifndef EXTENSIONS_BROWSER_WARNING_SET_H_
+#define EXTENSIONS_BROWSER_WARNING_SET_H_
 
 #include <set>
 #include <string>
@@ -11,8 +11,6 @@
 
 #include "url/gurl.h"
 
-// TODO(battre) Remove the Extension prefix.
-
 namespace base {
 class FilePath;
 }
@@ -21,10 +19,10 @@
 
 class ExtensionSet;
 
-// This class is used by the ExtensionWarningService to represent warnings if
-// extensions misbehave. Note that the ExtensionWarningService deals only with
-// specific warnings that should trigger a badge on the Chrome menu button.
-class ExtensionWarning {
+// This class is used by the WarningService to represent warnings if extensions
+// misbehave. Note that the WarningService deals only with specific warnings
+// that should trigger a badge on the Chrome menu button.
+class Warning {
  public:
   enum WarningType {
     // Don't use this, it is only intended for the default constructor and
@@ -48,41 +46,40 @@
     kMaxWarningType
   };
 
-  // We allow copy&assign for passing containers of ExtensionWarnings between
-  // threads.
-  ExtensionWarning(const ExtensionWarning& other);
-  ~ExtensionWarning();
-  ExtensionWarning& operator=(const ExtensionWarning& other);
+  // We allow copy&assign for passing containers of Warnings between threads.
+  Warning(const Warning& other);
+  ~Warning();
+  Warning& operator=(const Warning& other);
 
   // Factory methods for various warning types.
-  static ExtensionWarning CreateNetworkDelayWarning(
+  static Warning CreateNetworkDelayWarning(
       const std::string& extension_id);
-  static ExtensionWarning CreateNetworkConflictWarning(
+  static Warning CreateNetworkConflictWarning(
       const std::string& extension_id);
-  static ExtensionWarning CreateRedirectConflictWarning(
+  static Warning CreateRedirectConflictWarning(
       const std::string& extension_id,
       const std::string& winning_extension_id,
       const GURL& attempted_redirect_url,
       const GURL& winning_redirect_url);
-  static ExtensionWarning CreateRequestHeaderConflictWarning(
+  static Warning CreateRequestHeaderConflictWarning(
       const std::string& extension_id,
       const std::string& winning_extension_id,
       const std::string& conflicting_header);
-  static ExtensionWarning CreateResponseHeaderConflictWarning(
+  static Warning CreateResponseHeaderConflictWarning(
       const std::string& extension_id,
       const std::string& winning_extension_id,
       const std::string& conflicting_header);
-  static ExtensionWarning CreateCredentialsConflictWarning(
+  static Warning CreateCredentialsConflictWarning(
       const std::string& extension_id,
       const std::string& winning_extension_id);
-  static ExtensionWarning CreateRepeatedCacheFlushesWarning(
+  static Warning CreateRepeatedCacheFlushesWarning(
       const std::string& extension_id);
-  static ExtensionWarning CreateDownloadFilenameConflictWarning(
+  static Warning CreateDownloadFilenameConflictWarning(
       const std::string& losing_extension_id,
       const std::string& winning_extension_id,
       const base::FilePath& losing_filename,
       const base::FilePath& winning_filename);
-  static ExtensionWarning CreateReloadTooFrequentWarning(
+  static Warning CreateReloadTooFrequentWarning(
       const std::string& extension_id);
 
   // Returns the specific warning type.
@@ -99,7 +96,7 @@
   // could indicate for example the fact that an extension conflicted with
   // others. The |message_id| refers to an IDS_ string ID. The
   // |message_parameters| are filled into the message template.
-  ExtensionWarning(WarningType type,
+  Warning(WarningType type,
                    const std::string& extension_id,
                    int message_id,
                    const std::vector<std::string>& message_parameters);
@@ -112,13 +109,13 @@
   std::vector<std::string> message_parameters_;
 };
 
-// Compare ExtensionWarnings based on the tuple of (extension_id, type).
-// The message associated with ExtensionWarnings is purely informational
+// Compare Warnings based on the tuple of (extension_id, type).
+// The message associated with Warnings is purely informational
 // and does not contribute to distinguishing extensions.
-bool operator<(const ExtensionWarning& a, const ExtensionWarning& b);
+bool operator<(const Warning& a, const Warning& b);
 
-typedef std::set<ExtensionWarning> ExtensionWarningSet;
+typedef std::set<Warning> WarningSet;
 
 }  // namespace extensions
 
-#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_WARNING_SET_H_
+#endif  // EXTENSIONS_BROWSER_WARNING_SET_H_
diff --git a/extensions/common/extensions_client.h b/extensions/common/extensions_client.h
index 9f4ebf9..623a2de 100644
--- a/extensions/common/extensions_client.h
+++ b/extensions/common/extensions_client.h
@@ -45,6 +45,9 @@
   virtual const PermissionMessageProvider& GetPermissionMessageProvider()
       const = 0;
 
+  // Returns the application name. For example, "Chromium" or "app_shell".
+  virtual const std::string GetProductName() = 0;
+
   // Create a FeatureProvider for a specific feature type, e.g. "permission".
   virtual scoped_ptr<FeatureProvider> CreateFeatureProvider(
       const std::string& name) const = 0;
diff --git a/extensions/extensions.gyp b/extensions/extensions.gyp
index 09446e5..16cddcc 100644
--- a/extensions/extensions.gyp
+++ b/extensions/extensions.gyp
@@ -554,6 +554,10 @@
         'browser/verified_contents.h',
         'browser/view_type_utils.cc',
         'browser/view_type_utils.h',
+        'browser/warning_service.cc',
+        'browser/warning_service.h',
+        'browser/warning_set.cc',
+        'browser/warning_set.h',
       ],
       'conditions': [
         ['enable_extensions==0', {
@@ -931,6 +935,7 @@
         'browser/value_store/value_store_unittest.cc',
         'browser/value_store/value_store_unittest.h',
         'browser/verified_contents_unittest.cc',
+        'browser/warning_service_unittest.cc',
         'common/api/sockets/sockets_manifest_permission_unittest.cc',
         'common/csp_validator_unittest.cc',
         'common/event_filter_unittest.cc',
diff --git a/extensions/extensions_strings.grd b/extensions/extensions_strings.grd
index 3b3d1ce..603e99f 100644
--- a/extensions/extensions_strings.grd
+++ b/extensions/extensions_strings.grd
@@ -306,6 +306,33 @@
       <message name="IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX" desc="The prefix for a guest page loaded in a webview tag in the Task Manager">
         Webview: <ph name="WEBVIEW_TAG_NAME">$1<ex>Google</ex></ph>
       </message>
+
+      <!-- Global error messages for extensions. Please keep alphabetized. -->
+      <message name="IDS_EXTENSION_WARNINGS_NETWORK_DELAY" desc="Warning message indicating that an extension caused excessive network delays for web requests">
+        This extension is slowing down <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>. You should disable it to restore <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>'s performance.
+      </message>
+      <message name="IDS_EXTENSION_WARNINGS_NETWORK_CONFLICT" desc="Warning message which indicates that two or more extensions tried to modify a network request in a conflicting way and the modification of this extension was ignored">
+        This extension failed to modify a network request because the modification conflicted with another extension.
+      </message>
+      <message name="IDS_EXTENSION_WARNINGS_REDIRECT_CONFLICT" desc="Warning message indicating that two extensions tried to redirect to different destinations">
+        This extension failed to redirect a network request to <ph name="ATTEMPTED_REDIRECT_DESTINATION">$1<ex>http://www.google.com</ex></ph> because another extension (<ph name="EXTENSION_NAME">$2<ex>My Cool Extension</ex></ph>) redirected it to <ph name="ACTUAL_REDIRECT_DESTINATION">$3<ex>https://www.google.com</ex></ph>.
+      </message>
+      <message name="IDS_EXTENSION_WARNINGS_REQUEST_HEADER_CONFLICT" desc="Warning message which indicates that two or more extensions tried to modify a network request in a conflicting way and the modification of this extension was ignored">
+        This extension failed to modify the request header "<ph name="HEADER_NAME">$1<ex>User-Agent</ex></ph>" of a network request because the modification conflicted with another extension (<ph name="EXTENSION_NAME">$2<ex>My Cool Extension</ex></ph>).
+      </message>
+      <message name="IDS_EXTENSION_WARNINGS_RESPONSE_HEADER_CONFLICT" desc="Warning message which indicates that two or more extensions tried to modify a network request in a conflicting way and the modification of this extension was ignored">
+        This extension failed to modify the response header "<ph name="HEADER_NAME">$1<ex>User-Agents</ex></ph>" of a network request because the modification conflicted with another extension (<ph name="EXTENSION_NAME">$2<ex>My Cool Extension</ex></ph>).
+      </message>
+      <message name="IDS_EXTENSION_WARNINGS_CREDENTIALS_CONFLICT" desc="Warning message which indicates that two or more extensions tried to modify a network request in a conflicting way and the modification of this extension was ignored">
+        This extension failed to provide credentials to a network request because another extension (<ph name="EXTENSION_NAME">$1<ex>My Cool Extension</ex></ph>) provided different credentials.
+      </message>
+      <message name="IDS_EXTENSION_WARNINGS_DOWNLOAD_FILENAME_CONFLICT" desc="Warning message which indicates that two or more extensions tried to determine the filename of a downloaded file in a conflicting way and the modification of this extension was ignored">
+        This extension failed to name the download "<ph name="ATTEMPTED_FILENAME">$1<ex>apple.png</ex></ph>" because another extension (<ph name="EXTENSION_NAME">$2<ex>My Cool Extension</ex></ph>) determined a different filename "<ph name="ACTUAL_FILENAME">$3<ex>banana.png</ex></ph>".
+      </message>
+      <message name="IDS_EXTENSION_WARNING_RELOAD_TOO_FREQUENT" desc="Warning message which indates that an extension got stuck in a reload loop.">
+        This extension reloaded itself too frequently.
+      </message>
+
     </messages>
   </release>
 </grit>
diff --git a/extensions/shell/browser/shell_extension_system.cc b/extensions/shell/browser/shell_extension_system.cc
index f038807..4598e39 100644
--- a/extensions/shell/browser/shell_extension_system.cc
+++ b/extensions/shell/browser/shell_extension_system.cc
@@ -142,7 +142,7 @@
   return event_router_.get();
 }
 
-ExtensionWarningService* ShellExtensionSystem::warning_service() {
+WarningService* ShellExtensionSystem::warning_service() {
   return NULL;
 }
 
diff --git a/extensions/shell/browser/shell_extension_system.h b/extensions/shell/browser/shell_extension_system.h
index 966bfaf8..b8ed570 100644
--- a/extensions/shell/browser/shell_extension_system.h
+++ b/extensions/shell/browser/shell_extension_system.h
@@ -61,7 +61,7 @@
   virtual InfoMap* info_map() OVERRIDE;
   virtual LazyBackgroundTaskQueue* lazy_background_task_queue() OVERRIDE;
   virtual EventRouter* event_router() OVERRIDE;
-  virtual ExtensionWarningService* warning_service() OVERRIDE;
+  virtual WarningService* warning_service() OVERRIDE;
   virtual Blacklist* blacklist() OVERRIDE;
   virtual ErrorConsole* error_console() OVERRIDE;
   virtual InstallVerifier* install_verifier() OVERRIDE;
diff --git a/extensions/shell/common/shell_extensions_client.cc b/extensions/shell/common/shell_extensions_client.cc
index 0c5844f..00362195 100644
--- a/extensions/shell/common/shell_extensions_client.cc
+++ b/extensions/shell/common/shell_extensions_client.cc
@@ -104,6 +104,10 @@
   return g_permission_message_provider.Get();
 }
 
+const std::string ShellExtensionsClient::GetProductName() {
+  return "app_shell";
+}
+
 scoped_ptr<FeatureProvider> ShellExtensionsClient::CreateFeatureProvider(
     const std::string& name) const {
   scoped_ptr<FeatureProvider> provider;
diff --git a/extensions/shell/common/shell_extensions_client.h b/extensions/shell/common/shell_extensions_client.h
index 81c5c60..10e6f20f 100644
--- a/extensions/shell/common/shell_extensions_client.h
+++ b/extensions/shell/common/shell_extensions_client.h
@@ -22,6 +22,7 @@
   virtual void Initialize() OVERRIDE;
   virtual const PermissionMessageProvider& GetPermissionMessageProvider()
       const OVERRIDE;
+  virtual const std::string GetProductName() OVERRIDE;
   virtual scoped_ptr<FeatureProvider> CreateFeatureProvider(
       const std::string& name) const OVERRIDE;
   virtual scoped_ptr<JSONFeatureProviderSource> CreateFeatureProviderSource(
diff --git a/extensions/test/test_extensions_client.cc b/extensions/test/test_extensions_client.cc
index fc0391a..a47e60e 100644
--- a/extensions/test/test_extensions_client.cc
+++ b/extensions/test/test_extensions_client.cc
@@ -55,6 +55,10 @@
   return provider;
 }
 
+const std::string TestExtensionsClient::GetProductName() {
+  return "extensions_test";
+}
+
 scoped_ptr<FeatureProvider> TestExtensionsClient::CreateFeatureProvider(
     const std::string& name) const {
   scoped_ptr<FeatureProvider> provider;
diff --git a/extensions/test/test_extensions_client.h b/extensions/test/test_extensions_client.h
index be2acd7..6c6f7e5 100644
--- a/extensions/test/test_extensions_client.h
+++ b/extensions/test/test_extensions_client.h
@@ -19,6 +19,7 @@
   virtual void Initialize() OVERRIDE;
   virtual const PermissionMessageProvider& GetPermissionMessageProvider() const
       OVERRIDE;
+  virtual const std::string GetProductName() OVERRIDE;
   virtual scoped_ptr<FeatureProvider> CreateFeatureProvider(
       const std::string& name) const OVERRIDE;
   virtual scoped_ptr<JSONFeatureProviderSource> CreateFeatureProviderSource(