Commit d7462226 authored by oshima's avatar oshima Committed by Commit bot

Support V1 app

BUG=410446
TEST=manual. launch webstore app from home card.

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

Cr-Commit-Position: refs/heads/master@{#293527}
parent ae6c6a39
......@@ -17,12 +17,12 @@ TEST_F(ActivityManagerTest, Basic) {
ActivityManagerImpl* activity_manager =
static_cast<ActivityManagerImpl*>(ActivityManager::Get());
Activity* activity1 = athena::ActivityFactory::Get()->CreateWebActivity(
NULL, GURL());
NULL, base::string16(), GURL());
activity_manager->AddActivity(activity1);
EXPECT_EQ(1, activity_manager->num_activities());
Activity* activity2 =
athena::ActivityFactory::Get()->CreateWebActivity(NULL, GURL());
Activity* activity2 = athena::ActivityFactory::Get()->CreateWebActivity(
NULL, base::string16(), GURL());
activity_manager->AddActivity(activity2);
EXPECT_EQ(2, activity_manager->num_activities());
......
......@@ -33,8 +33,10 @@ class ATHENA_EXPORT ActivityFactory {
virtual ~ActivityFactory() {}
// Create an activity of a web page.
// Create an activity of a web page. If |title| is empty, the title will be
// obtained from the web contents.
virtual Activity* CreateWebActivity(content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) = 0;
// Create an activity of an app with |app_window| for app shell environemnt.
......
......@@ -16,8 +16,9 @@ ContentActivityFactory::~ContentActivityFactory() {}
Activity* ContentActivityFactory::CreateWebActivity(
content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) {
return new WebActivity(browser_context, url);
return new WebActivity(browser_context, title, url);
}
ActivityFactory* CreateContentActivityFactory() {
......
......@@ -17,6 +17,7 @@ class ContentActivityFactory : public ActivityFactory {
// Overridden from ActivityFactory:
virtual Activity* CreateWebActivity(content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) OVERRIDE;
virtual Activity* CreateAppActivity(extensions::ShellAppWindow* app_window,
const std::string& app_id) OVERRIDE;
......
......@@ -45,7 +45,8 @@ class DummyItem : public app_list::AppListItem {
// Overridden from app_list::AppListItem:
virtual void Activate(int event_flags) OVERRIDE {
ActivityManager::Get()->AddActivity(
ActivityFactory::Get()->CreateWebActivity(browser_context_, url_));
ActivityFactory::Get()->CreateWebActivity(
browser_context_, base::string16(), url_));
}
GURL url_;
......
......@@ -222,8 +222,8 @@ class AthenaWebView : public views::WebView {
case NEW_POPUP:
case NEW_WINDOW: {
ActivityManager::Get()->AddActivity(
ActivityFactory::Get()->CreateWebActivity(browser_context(),
params.url));
ActivityFactory::Get()->CreateWebActivity(
browser_context(), base::string16(), params.url));
break;
}
default:
......@@ -325,8 +325,10 @@ class AthenaWebView : public views::WebView {
};
WebActivity::WebActivity(content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url)
: browser_context_(browser_context),
title_(title),
url_(url),
web_view_(NULL),
title_color_(kDefaultTitleColor),
......@@ -424,6 +426,9 @@ SkColor WebActivity::GetRepresentativeColor() const {
}
base::string16 WebActivity::GetTitle() const {
if (!title_.empty())
return title_;
// TODO(oshima): Use title set by the web contents.
return web_view_ ? base::UTF8ToUTF16(
web_view_->GetWebContents()->GetVisibleURL().host())
: base::string16();
......
......@@ -7,6 +7,7 @@
#include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_view_model.h"
#include "base/strings/string16.h"
#include "content/public/browser/web_contents_observer.h"
#include "ui/gfx/image/image_skia.h"
......@@ -28,7 +29,9 @@ class WebActivity : public Activity,
public ActivityViewModel,
public content::WebContentsObserver {
public:
WebActivity(content::BrowserContext* context, const GURL& gurl);
WebActivity(content::BrowserContext* context,
const base::string16& title,
const GURL& gurl);
WebActivity(AthenaWebView* web_view);
protected:
......@@ -71,6 +74,7 @@ class WebActivity : public Activity,
void ReloadAndObserve();
content::BrowserContext* browser_context_;
const base::string16 title_;
const GURL url_;
AthenaWebView* web_view_;
SkColor title_color_;
......
include_rules = [
"+athena/activity/public",
"+chrome/browser",
"+chrome/common/extensions",
"+extensions/browser",
"+net/base",
]
specific_include_rules = {
"athena_apps_client\.cc": [
# TODO(oshima): Remove this dependency.
"+athena/activity/public"
],
}
......@@ -4,8 +4,11 @@
#include "athena/extensions/public/extensions_delegate.h"
#include "athena/activity/public/activity_factory.h"
#include "athena/activity/public/activity_manager.h"
#include "athena/extensions/chrome/athena_apps_client.h"
#include "base/macros.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/profiles/profile.h"
......@@ -71,14 +74,32 @@ class ChromeExtensionsDelegate : public ExtensionsDelegate {
}
params.container = extensions::LAUNCH_CONTAINER_WINDOW;
OpenApplication(params);
// V2 apps
if (CanLaunchViaEvent(extension)) {
OpenApplication(params);
return true;
}
LaunchV1App(params, extension);
return true;
}
virtual bool UnloadApp(const std::string& app_id) OVERRIDE {
// TODO(skuhne): Implement using extension service.
return false;
}
void LaunchV1App(const AppLaunchParams& params,
const extensions::Extension* extension) {
// TODO(oshima): Just activate if the app is already running.
const GURL url_input = params.override_url;
DCHECK(!url_input.is_empty() || extension);
GURL url = UrlForExtension(extension, url_input);
athena::ActivityManager::Get()->AddActivity(
athena::ActivityFactory::Get()->CreateWebActivity(
GetBrowserContext(), base::UTF8ToUTF16(extension->name()), url));
}
// ExtensionService for the browser context this is created for.
ExtensionService* extension_service_;
......
......@@ -97,7 +97,7 @@ TEST_F(HomeCardTest, AppSelection) {
athena::ActivityManager::Get()->AddActivity(
athena::ActivityFactory::Get()->CreateWebActivity(
NULL, GURL("http://www.google.com/")));
NULL, base::string16(), GURL("http://www.google.com/")));
EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
}
......
......@@ -18,8 +18,8 @@ void CreateTestPages(content::BrowserContext* browser_context) {
};
for (size_t i = 0; i < arraysize(kTestURLs); ++i) {
athena::ActivityManager::Get()->AddActivity(
athena::ActivityFactory::Get()->CreateWebActivity(browser_context,
GURL(kTestURLs[i])));
athena::ActivityFactory::Get()->CreateWebActivity(
browser_context, base::string16(), GURL(kTestURLs[i])));
}
}
......
......@@ -183,8 +183,8 @@ class UrlSearchResult : public app_list::SearchResult {
// Overriddenn from app_list::SearchResult:
virtual void Open(int event_flags) OVERRIDE {
ActivityManager::Get()->AddActivity(
ActivityFactory::Get()->CreateWebActivity(browser_context_,
match_.destination_url));
ActivityFactory::Get()->CreateWebActivity(
browser_context_, base::string16(), match_.destination_url));
}
void UpdateIcon() {
......
......@@ -29,6 +29,7 @@ SampleActivityFactory::~SampleActivityFactory() {}
Activity* SampleActivityFactory::CreateWebActivity(
content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) {
return new SampleActivity(
kDefaultColor, kDefaultContentColor, base::UTF8ToUTF16(url.spec()));
......
......@@ -18,6 +18,7 @@ class SampleActivityFactory : public ActivityFactory {
// Overridden from ActivityFactory:
virtual Activity* CreateWebActivity(content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) OVERRIDE;
virtual Activity* CreateAppActivity(extensions::ShellAppWindow* app_window,
const std::string& app_id) OVERRIDE;
......
......@@ -123,33 +123,6 @@ const Extension* GetExtension(const AppLaunchParams& params) {
ExtensionRegistry::TERMINATED);
}
// Get the launch URL for a given extension, with optional override/fallback.
// |override_url|, if non-empty, will be preferred over the extension's
// launch url.
GURL UrlForExtension(const Extension* extension,
const GURL& override_url) {
if (!extension)
return override_url;
GURL url;
if (!override_url.is_empty()) {
DCHECK(extension->web_extent().MatchesURL(override_url) ||
override_url.GetOrigin() == extension->url());
url = override_url;
} else {
url = extensions::AppLaunchInfo::GetFullLaunchURL(extension);
}
// For extensions lacking launch urls, determine a reasonable fallback.
if (!url.is_valid()) {
url = extensions::ManifestURL::GetOptionsPage(extension);
if (!url.is_valid())
url = GURL(chrome::kChromeUIExtensionsURL);
}
return url;
}
ui::WindowShowState DetermineWindowShowState(
Profile* profile,
extensions::LaunchContainer container,
......@@ -467,3 +440,26 @@ bool CanLaunchViaEvent(const extensions::Extension* extension) {
extensions::Feature* feature = feature_provider->GetFeature("app.runtime");
return feature->IsAvailableToExtension(extension).is_available();
}
GURL UrlForExtension(const Extension* extension, const GURL& override_url) {
if (!extension)
return override_url;
GURL url;
if (!override_url.is_empty()) {
DCHECK(extension->web_extent().MatchesURL(override_url) ||
override_url.GetOrigin() == extension->url());
url = override_url;
} else {
url = extensions::AppLaunchInfo::GetFullLaunchURL(extension);
}
// For extensions lacking launch urls, determine a reasonable fallback.
if (!url.is_valid()) {
url = extensions::ManifestURL::GetOptionsPage(extension);
if (!url.is_valid())
url = GURL(chrome::kChromeUIExtensionsURL);
}
return url;
}
......@@ -100,4 +100,10 @@ content::WebContents* OpenAppShortcutWindow(Profile* profile,
// chrome.app.runtime.onLaunched event.
bool CanLaunchViaEvent(const extensions::Extension* extension);
// Get the launch URL for a given extension, with optional override/fallback.
// |override_url|, if non-empty, will be preferred over the extension's
// launch url.
GURL UrlForExtension(const extensions::Extension* extension,
const GURL& override_url);
#endif // CHROME_BROWSER_UI_EXTENSIONS_APPLICATION_LAUNCH_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment