diff options
author | erikkay@chromium.org <erikkay@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-12 17:28:56 +0000 |
---|---|---|
committer | erikkay@chromium.org <erikkay@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-12 17:28:56 +0000 |
commit | c28071ad39fdf60db886e6d6844da7c3331825a6 (patch) | |
tree | 89edfcbf7bd70f18191496fbefafe843316e6139 /chrome/browser/browser.cc | |
parent | a883f8fc702c2cb37130361b7ddc6fc86a8f2edf (diff) | |
download | chromium_src-c28071ad39fdf60db886e6d6844da7c3331825a6.zip chromium_src-c28071ad39fdf60db886e6d6844da7c3331825a6.tar.gz chromium_src-c28071ad39fdf60db886e6d6844da7c3331825a6.tar.bz2 |
Support app tabs as a launch point for apps. Also, move the logic for launching into Browser for easier access by the launcher.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/668245
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41441 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browser.cc')
-rw-r--r-- | chrome/browser/browser.cc | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc index 00cccfa..f4e1b3c7 100644 --- a/chrome/browser/browser.cc +++ b/chrome/browser/browser.cc @@ -365,6 +365,41 @@ void Browser::OpenURLOffTheRecord(Profile* profile, const GURL& url) { } // static +// TODO(erikkay): There are multiple reasons why this could fail. Should +// this function return an error reason as well so that callers can show +// reasonable errors? +bool Browser::OpenApplication(Profile* profile, const std::string& app_id) { + ExtensionsService* extensions_service = profile->GetExtensionsService(); + if (!extensions_service->is_ready()) + return false; + + // If the extension with |app_id| could't be found, most likely because it + // was uninstalled. + Extension* extension_app = + extensions_service->GetExtensionById(app_id, false); + if (!extension_app) + return false; + + // TODO(erikkay): Support refocus. + Extension::AppLaunchType launch_type = + extension_app->app_launch_type(); + switch (launch_type) { + case Extension::LAUNCH_WINDOW: + case Extension::LAUNCH_PANEL: + Browser::OpenApplicationWindow(profile, extension_app); + break; + case Extension::LAUNCH_TAB: { + return Browser::OpenApplicationTab(profile, extension_app); + break; + } + default: + NOTREACHED(); + return false; + } + return true; +} + +// static void Browser::OpenApplicationWindow(Profile* profile, const GURL& url, bool as_panel) { std::wstring app_name = web_app::GenerateApplicationNameFromURL(url); @@ -393,6 +428,32 @@ void Browser::OpenApplicationWindow(Profile* profile, const GURL& url, } // static +void Browser::OpenApplicationWindow(Profile* profile, Extension* extension) { + OpenApplicationWindow(profile, + extension->app_launch_url(), + (extension->app_launch_type() == Extension::LAUNCH_PANEL)); +} + +// static +bool Browser::OpenApplicationTab(Profile* profile, Extension* extension) { + DCHECK_EQ(extension->app_launch_type(), Extension::LAUNCH_TAB); + + Browser* browser = BrowserList::GetLastActiveWithProfile(profile); + if (!browser || browser->type() != Browser::TYPE_NORMAL) + return false; + + // TODO(erikkay): This doesn't seem like the right transition in all cases. + PageTransition::Type transition = PageTransition::START_PAGE; + GURL url = extension->app_launch_url(); + TabContents* tab_contents = + browser->CreateTabContentsForURL(url, GURL(), profile, + transition, false, NULL); + tab_contents->SetAppExtension(extension); + browser->AddTab(tab_contents, transition); + return true; +} + +// static void Browser::OpenBookmarkManagerWindow(Profile* profile) { Browser* browser = Browser::Create(profile); browser->ShowBookmarkManagerTab(); |