Prevent browser creation in non-browsing profiles - extension APIs

Adds new browser factory function Browser::CreateIfAllowed, which checks
whether browser windows are allowed in the target context before
creating a browser instance. It will return nullptr if creating a
browser window is not allowed, for example when attempting to create a
browser in Chrome OS sign-in profile, or system profile.

The cl utilizes the new function in extensions tabs, windows and
runtime API.

Bug: 916859
Change-Id: I1a55025f51b83e9b512f9314ad77741ef80e1473
Reviewed-on: https://chromium-review.googlesource.com/c/1459521
Commit-Queue: Toni Baržić <[email protected]>
Reviewed-by: Scott Violet <[email protected]>
Reviewed-by: Devlin <[email protected]>
Reviewed-by: Michael Wasserman <[email protected]>
Cr-Commit-Position: refs/heads/master@{#635277}
diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc
index b6fdacf3..5d5e34f 100644
--- a/chrome/browser/extensions/extension_tab_util.cc
+++ b/chrome/browser/extensions/extension_tab_util.cc
@@ -91,7 +91,11 @@
                        bool user_gesture,
                        std::string* error) {
   Browser::CreateParams params(Browser::TYPE_TABBED, profile, user_gesture);
-  Browser* browser = new Browser(params);
+  Browser* browser = Browser::Create(params);
+  if (!browser) {
+    *error = tabs_constants::kBrowserWindowNotAllowed;
+    return nullptr;
+  }
   browser->window()->Show();
   return browser;
 }
@@ -226,7 +230,11 @@
     if (!browser) {
       Browser::CreateParams params =
           Browser::CreateParams(Browser::TYPE_TABBED, profile, user_gesture);
-      browser = new Browser(params);
+      browser = Browser::Create(params);
+      if (!browser) {
+        *error = tabs_constants::kBrowserWindowNotAllowed;
+        return nullptr;
+      }
       browser->window()->Show();
     }
   }
@@ -653,8 +661,12 @@
   const bool browser_created = !browser;
   if (!browser) {
     Browser::CreateParams params = Browser::CreateParams(profile, user_gesture);
-    browser = new Browser(params);
+    browser = Browser::Create(params);
   }
+
+  if (!browser)
+    return;
+
   NavigateParams params(browser, std::move(web_contents));
 
   // The extension_app_id parameter ends up as app_name in the Browser
@@ -706,7 +718,9 @@
   DCHECK(!profile->IsOffTheRecord() || IncognitoInfo::IsSplitMode(extension));
   Browser* browser = chrome::FindBrowserWithProfile(profile);
   if (!browser)
-    browser = new Browser(Browser::CreateParams(profile, true));
+    browser = Browser::Create(Browser::CreateParams(profile, true));
+  if (!browser)
+    return false;
   return extensions::ExtensionTabUtil::OpenOptionsPage(extension, browser);
 }