Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / extension_tab_util.cc
index 350ea95..3d38e4f 100644 (file)
@@ -4,40 +4,43 @@
 
 #include "chrome/browser/extensions/extension_tab_util.h"
 
-#include "apps/app_window.h"
-#include "apps/app_window_registry.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
 #include "chrome/browser/extensions/api/tabs/tabs_constants.h"
 #include "chrome/browser/extensions/chrome_extension_function.h"
+#include "chrome/browser/extensions/chrome_extension_function_details.h"
 #include "chrome/browser/extensions/tab_helper.h"
 #include "chrome/browser/extensions/window_controller.h"
 #include "chrome/browser/extensions/window_controller_list.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/sessions/session_id.h"
+#include "chrome/browser/sessions/session_tab_helper.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_iterator.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
+#include "chrome/browser/ui/singleton_tabs.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_iterator.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/extensions/api/tabs.h"
-#include "chrome/common/extensions/manifest_url_handler.h"
 #include "chrome/common/url_constants.h"
 #include "components/url_fixer/url_fixer.h"
 #include "content/public/browser/favicon_status.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/web_contents.h"
+#include "extensions/browser/app_window/app_window.h"
+#include "extensions/browser/app_window/app_window_registry.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/error_utils.h"
 #include "extensions/common/extension.h"
+#include "extensions/common/feature_switch.h"
 #include "extensions/common/manifest_constants.h"
 #include "extensions/common/manifest_handlers/incognito_info.h"
+#include "extensions/common/manifest_handlers/options_page_info.h"
 #include "extensions/common/permissions/api_permission.h"
 #include "extensions/common/permissions/permissions_data.h"
 #include "url/gurl.h"
 
-using apps::AppWindow;
 using content::NavigationEntry;
 using content::WebContents;
 
@@ -49,7 +52,7 @@ namespace keys = tabs_constants;
 
 WindowController* GetAppWindowController(const WebContents* contents) {
   Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext());
-  apps::AppWindowRegistry* registry = apps::AppWindowRegistry::Get(profile);
+  AppWindowRegistry* registry = AppWindowRegistry::Get(profile);
   if (!registry)
     return NULL;
   AppWindow* app_window =
@@ -230,7 +233,7 @@ base::DictionaryValue* ExtensionTabUtil::OpenTab(
   if (pinned)
     add_types |= TabStripModel::ADD_PINNED;
   chrome::NavigateParams navigate_params(
-      browser, url, content::PAGE_TRANSITION_LINK);
+      browser, url, ui::PAGE_TRANSITION_LINK);
   navigate_params.disposition =
       active ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
   navigate_params.tabstrip_index = index;
@@ -275,6 +278,26 @@ Browser* ExtensionTabUtil::GetBrowserFromWindowID(
   }
 }
 
+Browser* ExtensionTabUtil::GetBrowserFromWindowID(
+    const ChromeExtensionFunctionDetails& details,
+    int window_id,
+    std::string* error) {
+  if (window_id == extension_misc::kCurrentWindowId) {
+    Browser* result = details.GetCurrentBrowser();
+    if (!result || !result->window()) {
+      if (error)
+        *error = keys::kNoCurrentWindowError;
+      return NULL;
+    }
+    return result;
+  } else {
+    return GetBrowserInProfileWithId(details.GetProfile(),
+                                     window_id,
+                                     details.function()->include_incognito(),
+                                     error);
+  }
+}
+
 int ExtensionTabUtil::GetWindowId(const Browser* browser) {
   return browser->session_id().id();
 }
@@ -289,7 +312,7 @@ int ExtensionTabUtil::GetWindowIdOfTabStripModel(
 }
 
 int ExtensionTabUtil::GetTabId(const WebContents* web_contents) {
-  return SessionID::IdForTab(web_contents);
+  return SessionTabHelper::IdForTab(web_contents);
 }
 
 std::string ExtensionTabUtil::GetTabStatusText(bool is_loading) {
@@ -297,7 +320,7 @@ std::string ExtensionTabUtil::GetTabStatusText(bool is_loading) {
 }
 
 int ExtensionTabUtil::GetWindowIdOfTab(const WebContents* web_contents) {
-  return SessionID::IdForWindowContainingTab(web_contents);
+  return SessionTabHelper::IdForWindowContainingTab(web_contents);
 }
 
 base::DictionaryValue* ExtensionTabUtil::CreateTabValue(
@@ -451,12 +474,13 @@ bool ExtensionTabUtil::GetDefaultTab(Browser* browser,
 }
 
 bool ExtensionTabUtil::GetTabById(int tab_id,
-                                  Profile* profile,
+                                  content::BrowserContext* browser_context,
                                   bool include_incognito,
                                   Browser** browser,
                                   TabStripModel** tab_strip,
                                   WebContents** contents,
                                   int* tab_index) {
+  Profile* profile = Profile::FromBrowserContext(browser_context);
   Profile* incognito_profile =
       include_incognito && profile->HasOffTheRecordProfile() ?
           profile->GetOffTheRecordProfile() : NULL;
@@ -467,7 +491,7 @@ bool ExtensionTabUtil::GetTabById(int tab_id,
       TabStripModel* target_tab_strip = target_browser->tab_strip_model();
       for (int i = 0; i < target_tab_strip->count(); ++i) {
         WebContents* target_contents = target_tab_strip->GetWebContentsAt(i);
-        if (SessionID::IdForTab(target_contents) == tab_id) {
+        if (SessionTabHelper::IdForTab(target_contents) == tab_id) {
           if (browser)
             *browser = target_browser;
           if (tab_strip)
@@ -554,7 +578,7 @@ WindowController* ExtensionTabUtil::GetWindowControllerOfTab(
 
 void ExtensionTabUtil::OpenOptionsPage(const Extension* extension,
                                        Browser* browser) {
-  DCHECK(!ManifestURL::GetOptionsPage(extension).is_empty());
+  DCHECK(OptionsPageInfo::HasOptionsPage(extension));
 
   // Force the options page to open in non-OTR window, because it won't be
   // able to save settings from OTR.
@@ -566,16 +590,34 @@ void ExtensionTabUtil::OpenOptionsPage(const Extension* extension,
     browser = displayer->browser();
   }
 
-  content::OpenURLParams params(ManifestURL::GetOptionsPage(extension),
-                                content::Referrer(),
-                                SINGLETON_TAB,
-                                content::PAGE_TRANSITION_LINK,
-                                false);
-  browser->OpenURL(params);
-  browser->window()->Show();
-  WebContents* web_contents =
-      browser->tab_strip_model()->GetActiveWebContents();
-  web_contents->GetDelegate()->ActivateContents(web_contents);
+  if (!OptionsPageInfo::ShouldOpenInTab(extension)) {
+    // If we should embed the options page for this extension, open
+    // chrome://extensions in a new tab and show the extension options in an
+    // embedded popup.
+    chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams(
+        browser, GURL(chrome::kChromeUIExtensionsURL)));
+    params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
+
+    GURL::Replacements replacements;
+    std::string query =
+        base::StringPrintf("options=%s", extension->id().c_str());
+    replacements.SetQueryStr(query);
+    params.url = params.url.ReplaceComponents(replacements);
+
+    chrome::ShowSingletonTabOverwritingNTP(browser, params);
+  } else {
+    // Otherwise open a new tab with the extension's options page
+    content::OpenURLParams params(OptionsPageInfo::GetOptionsPage(extension),
+                                  content::Referrer(),
+                                  SINGLETON_TAB,
+                                  ui::PAGE_TRANSITION_LINK,
+                                  false);
+    browser->OpenURL(params);
+    browser->window()->Show();
+    WebContents* web_contents =
+        browser->tab_strip_model()->GetActiveWebContents();
+    web_contents->GetDelegate()->ActivateContents(web_contents);
+  }
 }
 
 }  // namespace extensions