Bookmark manager: Open in incognito window.

Make IsIncognitoEnabled take an Extension* as an argument as well and use that where possible.

BUG=4890
TEST=Select one more bookmarks and right click/tools and select "Open in incognito". The bookmarks should open in an incognito window.

Review URL: http://codereview.chromium.org/750001

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41193 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/cocoa/extensions/browser_actions_controller.mm b/chrome/browser/cocoa/extensions/browser_actions_controller.mm
index 2294c19e..2da1554a 100644
--- a/chrome/browser/cocoa/extensions/browser_actions_controller.mm
+++ b/chrome/browser/cocoa/extensions/browser_actions_controller.mm
@@ -413,8 +413,7 @@
 
 - (bool)shouldDisplayBrowserAction:(Extension*)extension {
   return (!profile_->IsOffTheRecord() ||
-          profile_->GetExtensionsService()->
-              IsIncognitoEnabled(extension->id()));
+          profile_->GetExtensionsService()->IsIncognitoEnabled(extension));
 }
 
 - (CGFloat)savedWidth {
diff --git a/chrome/browser/extensions/extension_browsertest.cc b/chrome/browser/extensions/extension_browsertest.cc
index 5261a34a..9f7cdcf 100644
--- a/chrome/browser/extensions/extension_browsertest.cc
+++ b/chrome/browser/extensions/extension_browsertest.cc
@@ -74,7 +74,7 @@
     // the defaults.
     Extension* extension = service->extensions()->at(num_after - 1);
     service->extension_prefs()->OnExtensionInstalled(extension);
-    service->SetIsIncognitoEnabled(extension->id(), true);
+    service->SetIsIncognitoEnabled(extension, true);
   }
 
   return WaitForExtensionHostsToLoad();
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc
index 36f8651..fb380a1 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.cc
+++ b/chrome/browser/extensions/extension_function_dispatcher.cc
@@ -285,7 +285,7 @@
                                 render_view_host->process()->id());
 
   bool incognito_enabled =
-      profile()->GetExtensionsService()->IsIncognitoEnabled(extension->id());
+      profile()->GetExtensionsService()->IsIncognitoEnabled(extension);
 
   // Update the extension permissions. Doing this each time we create an EFD
   // ensures that new processes are informed of permissions for newly installed
@@ -357,11 +357,12 @@
   function->SetArgs(args);
   function->set_request_id(request_id);
   function->set_has_callback(has_callback);
-  function->set_include_incognito(
-      profile()->GetExtensionsService()->IsIncognitoEnabled(extension_id()));
-
   ExtensionsService* service = profile()->GetExtensionsService();
   DCHECK(service);
+  Extension* extension = service->GetExtensionById(extension_id(), false);
+  DCHECK(extension);
+  function->set_include_incognito(service->IsIncognitoEnabled(extension));
+
   ExtensionsQuotaService* quota = service->quota_service();
   if (quota->Assess(extension_id(), function, args, base::TimeTicks::Now())) {
     function->Run();
diff --git a/chrome/browser/extensions/extension_toolbar_model.cc b/chrome/browser/extensions/extension_toolbar_model.cc
index f243949..2dd23d47 100644
--- a/chrome/browser/extensions/extension_toolbar_model.cc
+++ b/chrome/browser/extensions/extension_toolbar_model.cc
@@ -192,7 +192,7 @@
   int original_index = 0, i = 0;
   for (ExtensionList::iterator iter = begin(); iter != end();
        ++iter, ++original_index) {
-    if (service_->IsIncognitoEnabled((*iter)->id())) {
+    if (service_->IsIncognitoEnabled(*iter)) {
       if (incognito_index == i)
         break;
       ++i;
@@ -207,7 +207,7 @@
        ++iter, ++i) {
     if (original_index == i)
       break;
-    if (service_->IsIncognitoEnabled((*iter)->id()))
+    if (service_->IsIncognitoEnabled(*iter))
       ++incognito_index;
   }
   return incognito_index;
diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc
index b4373ec0..4e9cb548 100644
--- a/chrome/browser/extensions/extensions_service.cc
+++ b/chrome/browser/extensions/extensions_service.cc
@@ -580,16 +580,19 @@
   return extension_prefs_->LastPingDay(extension_id);
 }
 
-bool ExtensionsService::IsIncognitoEnabled(const std::string& extension_id) {
-  return extension_prefs_->IsIncognitoEnabled(extension_id);
+bool ExtensionsService::IsIncognitoEnabled(const Extension* extension) {
+  // If this is a component extension we always allow it to work in incognito
+  // mode.
+  if (extension->location() == Extension::COMPONENT)
+    return true;
+
+  // Check the prefs.
+  return extension_prefs_->IsIncognitoEnabled(extension->id());
 }
 
-void ExtensionsService::SetIsIncognitoEnabled(const std::string& extension_id,
+void ExtensionsService::SetIsIncognitoEnabled(Extension* extension,
                                               bool enabled) {
-  extension_prefs_->SetIsIncognitoEnabled(extension_id, enabled);
-
-  Extension* extension = GetExtensionByIdInternal(extension_id, true, true);
-  DCHECK(extension);
+  extension_prefs_->SetIsIncognitoEnabled(extension->id(), enabled);
 
   // Broadcast unloaded and loaded events to update browser state.
   NotifyExtensionUnloaded(extension);
diff --git a/chrome/browser/extensions/extensions_service.h b/chrome/browser/extensions/extensions_service.h
index ef7678f..3ab9d34 100644
--- a/chrome/browser/extensions/extensions_service.h
+++ b/chrome/browser/extensions/extensions_service.h
@@ -128,8 +128,8 @@
   virtual base::Time LastPingDay(const std::string& extension_id);
 
   // Whether this extension can run in an incognito window.
-  bool IsIncognitoEnabled(const std::string& extension_id);
-  void SetIsIncognitoEnabled(const std::string& extension_id, bool enabled);
+  bool IsIncognitoEnabled(const Extension* extension);
+  void SetIsIncognitoEnabled(Extension* extension, bool enabled);
 
   const FilePath& install_directory() const { return install_directory_; }
 
diff --git a/chrome/browser/extensions/extensions_ui.cc b/chrome/browser/extensions/extensions_ui.cc
index 6f23280..00b658e 100644
--- a/chrome/browser/extensions/extensions_ui.cc
+++ b/chrome/browser/extensions/extensions_ui.cc
@@ -446,8 +446,10 @@
   std::string extension_id, enable_str;
   CHECK(list->GetString(0, &extension_id));
   CHECK(list->GetString(1, &enable_str));
-  extensions_service_->SetIsIncognitoEnabled(extension_id,
-                                             (enable_str == "true"));
+  Extension* extension = extensions_service_->GetExtensionById(extension_id,
+                                                               true);
+  DCHECK(extension);
+  extensions_service_->SetIsIncognitoEnabled(extension, (enable_str == "true"));
 }
 
 void ExtensionsDOMHandler::HandleUninstallMessage(const Value* value) {
@@ -715,7 +717,7 @@
   extension_data->SetString(L"version", extension->version()->GetString());
   extension_data->SetBoolean(L"enabled", enabled);
   extension_data->SetBoolean(L"enabledIncognito",
-      service ? service->IsIncognitoEnabled(extension->id()) : false);
+      service ? service->IsIncognitoEnabled(extension) : false);
   extension_data->SetBoolean(L"allow_reload",
                              extension->location() == Extension::LOAD);
 
diff --git a/chrome/browser/extensions/user_script_master.cc b/chrome/browser/extensions/user_script_master.cc
index db84280..36e0ff6 100644
--- a/chrome/browser/extensions/user_script_master.cc
+++ b/chrome/browser/extensions/user_script_master.cc
@@ -337,7 +337,7 @@
       // Add any content scripts inside the extension.
       Extension* extension = Details<Extension>(details).ptr();
       bool incognito_enabled = profile_->GetExtensionsService()->
-          IsIncognitoEnabled(extension->id());
+          IsIncognitoEnabled(extension);
       const UserScriptList& scripts = extension->content_scripts();
       for (UserScriptList::const_iterator iter = scripts.begin();
            iter != scripts.end(); ++iter) {
diff --git a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
index dcea49d..78da006 100644
--- a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
+++ b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
@@ -375,8 +375,7 @@
     Extension* extension) {
   // Only display incognito-enabled extensions while in incognito mode.
   return (!profile_->IsOffTheRecord() ||
-          profile_->GetExtensionsService()->
-              IsIncognitoEnabled(extension->id()));
+          profile_->GetExtensionsService()->IsIncognitoEnabled(extension));
 }
 
 void BrowserActionsToolbarGtk::HidePopup() {
diff --git a/chrome/browser/resources/bookmark_manager/main.html b/chrome/browser/resources/bookmark_manager/main.html
index b36b6c037..46d3251 100644
--- a/chrome/browser/resources/bookmark_manager/main.html
+++ b/chrome/browser/resources/bookmark_manager/main.html
@@ -1339,13 +1339,19 @@
     return url[0] == '#' ? base + url : url;
   });
 
-  // Incognito mode is not yet supported by the extensions APIs.
-  // http://code.google.com/p/chromium/issues/detail?id=12658
-  if (kind == 'window') {
-    chrome.windows.create({url: urls[0]}, function(window) {
+  var incognito = kind == 'incognito';
+  if (kind == 'window' || incognito) {
+    chrome.windows.create({
+      url: urls[0],
+      incognito: incognito
+    }, function(window) {
       urls.forEach(function(url, i) {
         if (i > 0)
-          chrome.tabs.create({url: url, windowId: window.id, selected: false});
+          chrome.tabs.create({
+            url: url,
+            windowId: window.id,
+            selected: false
+          });
       });
     });
   } else if (kind == 'tab') {
@@ -1497,7 +1503,7 @@
     case 'open-in-new-window-command':
       openBookmarks('window');
       break;
-    case 'open-in-new-incognito-command':
+    case 'open-incognito-window-command':
       openBookmarks('incognito');
       break;
     case 'delete-command':
diff --git a/chrome/browser/views/browser_actions_container.cc b/chrome/browser/views/browser_actions_container.cc
index 7d14eae..3029c5d5 100644
--- a/chrome/browser/views/browser_actions_container.cc
+++ b/chrome/browser/views/browser_actions_container.cc
@@ -1161,6 +1161,5 @@
 bool BrowserActionsContainer::ShouldDisplayBrowserAction(Extension* extension) {
   // Only display incognito-enabled extensions while in incognito mode.
   return (!profile_->IsOffTheRecord() ||
-          profile_->GetExtensionsService()->
-              IsIncognitoEnabled(extension->id()));
+          profile_->GetExtensionsService()->IsIncognitoEnabled(extension));
 }