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) { ...@@ -17,12 +17,12 @@ TEST_F(ActivityManagerTest, Basic) {
ActivityManagerImpl* activity_manager = ActivityManagerImpl* activity_manager =
static_cast<ActivityManagerImpl*>(ActivityManager::Get()); static_cast<ActivityManagerImpl*>(ActivityManager::Get());
Activity* activity1 = athena::ActivityFactory::Get()->CreateWebActivity( Activity* activity1 = athena::ActivityFactory::Get()->CreateWebActivity(
NULL, GURL()); NULL, base::string16(), GURL());
activity_manager->AddActivity(activity1); activity_manager->AddActivity(activity1);
EXPECT_EQ(1, activity_manager->num_activities()); EXPECT_EQ(1, activity_manager->num_activities());
Activity* activity2 = Activity* activity2 = athena::ActivityFactory::Get()->CreateWebActivity(
athena::ActivityFactory::Get()->CreateWebActivity(NULL, GURL()); NULL, base::string16(), GURL());
activity_manager->AddActivity(activity2); activity_manager->AddActivity(activity2);
EXPECT_EQ(2, activity_manager->num_activities()); EXPECT_EQ(2, activity_manager->num_activities());
......
...@@ -33,8 +33,10 @@ class ATHENA_EXPORT ActivityFactory { ...@@ -33,8 +33,10 @@ class ATHENA_EXPORT ActivityFactory {
virtual ~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, virtual Activity* CreateWebActivity(content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) = 0; const GURL& url) = 0;
// Create an activity of an app with |app_window| for app shell environemnt. // Create an activity of an app with |app_window| for app shell environemnt.
......
...@@ -16,8 +16,9 @@ ContentActivityFactory::~ContentActivityFactory() {} ...@@ -16,8 +16,9 @@ ContentActivityFactory::~ContentActivityFactory() {}
Activity* ContentActivityFactory::CreateWebActivity( Activity* ContentActivityFactory::CreateWebActivity(
content::BrowserContext* browser_context, content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) { const GURL& url) {
return new WebActivity(browser_context, url); return new WebActivity(browser_context, title, url);
} }
ActivityFactory* CreateContentActivityFactory() { ActivityFactory* CreateContentActivityFactory() {
......
...@@ -17,6 +17,7 @@ class ContentActivityFactory : public ActivityFactory { ...@@ -17,6 +17,7 @@ class ContentActivityFactory : public ActivityFactory {
// Overridden from ActivityFactory: // Overridden from ActivityFactory:
virtual Activity* CreateWebActivity(content::BrowserContext* browser_context, virtual Activity* CreateWebActivity(content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) OVERRIDE; const GURL& url) OVERRIDE;
virtual Activity* CreateAppActivity(extensions::ShellAppWindow* app_window, virtual Activity* CreateAppActivity(extensions::ShellAppWindow* app_window,
const std::string& app_id) OVERRIDE; const std::string& app_id) OVERRIDE;
......
...@@ -45,7 +45,8 @@ class DummyItem : public app_list::AppListItem { ...@@ -45,7 +45,8 @@ class DummyItem : public app_list::AppListItem {
// Overridden from app_list::AppListItem: // Overridden from app_list::AppListItem:
virtual void Activate(int event_flags) OVERRIDE { virtual void Activate(int event_flags) OVERRIDE {
ActivityManager::Get()->AddActivity( ActivityManager::Get()->AddActivity(
ActivityFactory::Get()->CreateWebActivity(browser_context_, url_)); ActivityFactory::Get()->CreateWebActivity(
browser_context_, base::string16(), url_));
} }
GURL url_; GURL url_;
......
...@@ -222,8 +222,8 @@ class AthenaWebView : public views::WebView { ...@@ -222,8 +222,8 @@ class AthenaWebView : public views::WebView {
case NEW_POPUP: case NEW_POPUP:
case NEW_WINDOW: { case NEW_WINDOW: {
ActivityManager::Get()->AddActivity( ActivityManager::Get()->AddActivity(
ActivityFactory::Get()->CreateWebActivity(browser_context(), ActivityFactory::Get()->CreateWebActivity(
params.url)); browser_context(), base::string16(), params.url));
break; break;
} }
default: default:
...@@ -325,8 +325,10 @@ class AthenaWebView : public views::WebView { ...@@ -325,8 +325,10 @@ class AthenaWebView : public views::WebView {
}; };
WebActivity::WebActivity(content::BrowserContext* browser_context, WebActivity::WebActivity(content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) const GURL& url)
: browser_context_(browser_context), : browser_context_(browser_context),
title_(title),
url_(url), url_(url),
web_view_(NULL), web_view_(NULL),
title_color_(kDefaultTitleColor), title_color_(kDefaultTitleColor),
...@@ -424,6 +426,9 @@ SkColor WebActivity::GetRepresentativeColor() const { ...@@ -424,6 +426,9 @@ SkColor WebActivity::GetRepresentativeColor() const {
} }
base::string16 WebActivity::GetTitle() 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( return web_view_ ? base::UTF8ToUTF16(
web_view_->GetWebContents()->GetVisibleURL().host()) web_view_->GetWebContents()->GetVisibleURL().host())
: base::string16(); : base::string16();
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "athena/activity/public/activity.h" #include "athena/activity/public/activity.h"
#include "athena/activity/public/activity_view_model.h" #include "athena/activity/public/activity_view_model.h"
#include "base/strings/string16.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia.h"
...@@ -28,7 +29,9 @@ class WebActivity : public Activity, ...@@ -28,7 +29,9 @@ class WebActivity : public Activity,
public ActivityViewModel, public ActivityViewModel,
public content::WebContentsObserver { public content::WebContentsObserver {
public: public:
WebActivity(content::BrowserContext* context, const GURL& gurl); WebActivity(content::BrowserContext* context,
const base::string16& title,
const GURL& gurl);
WebActivity(AthenaWebView* web_view); WebActivity(AthenaWebView* web_view);
protected: protected:
...@@ -71,6 +74,7 @@ class WebActivity : public Activity, ...@@ -71,6 +74,7 @@ class WebActivity : public Activity,
void ReloadAndObserve(); void ReloadAndObserve();
content::BrowserContext* browser_context_; content::BrowserContext* browser_context_;
const base::string16 title_;
const GURL url_; const GURL url_;
AthenaWebView* web_view_; AthenaWebView* web_view_;
SkColor title_color_; SkColor title_color_;
......
include_rules = [ include_rules = [
"+athena/activity/public",
"+chrome/browser", "+chrome/browser",
"+chrome/common/extensions", "+chrome/common/extensions",
"+extensions/browser", "+extensions/browser",
"+net/base", "+net/base",
] ]
specific_include_rules = {
"athena_apps_client\.cc": [
# TODO(oshima): Remove this dependency.
"+athena/activity/public"
],
}
...@@ -4,8 +4,11 @@ ...@@ -4,8 +4,11 @@
#include "athena/extensions/public/extensions_delegate.h" #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 "athena/extensions/chrome/athena_apps_client.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
...@@ -71,14 +74,32 @@ class ChromeExtensionsDelegate : public ExtensionsDelegate { ...@@ -71,14 +74,32 @@ class ChromeExtensionsDelegate : public ExtensionsDelegate {
} }
params.container = extensions::LAUNCH_CONTAINER_WINDOW; params.container = extensions::LAUNCH_CONTAINER_WINDOW;
OpenApplication(params); // V2 apps
if (CanLaunchViaEvent(extension)) {
OpenApplication(params);
return true;
}
LaunchV1App(params, extension);
return true; return true;
} }
virtual bool UnloadApp(const std::string& app_id) OVERRIDE { virtual bool UnloadApp(const std::string& app_id) OVERRIDE {
// TODO(skuhne): Implement using extension service. // TODO(skuhne): Implement using extension service.
return false; 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 for the browser context this is created for.
ExtensionService* extension_service_; ExtensionService* extension_service_;
......
...@@ -97,7 +97,7 @@ TEST_F(HomeCardTest, AppSelection) { ...@@ -97,7 +97,7 @@ TEST_F(HomeCardTest, AppSelection) {
athena::ActivityManager::Get()->AddActivity( athena::ActivityManager::Get()->AddActivity(
athena::ActivityFactory::Get()->CreateWebActivity( 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()); EXPECT_EQ(HomeCard::VISIBLE_MINIMIZED, HomeCard::Get()->GetState());
} }
......
...@@ -18,8 +18,8 @@ void CreateTestPages(content::BrowserContext* browser_context) { ...@@ -18,8 +18,8 @@ void CreateTestPages(content::BrowserContext* browser_context) {
}; };
for (size_t i = 0; i < arraysize(kTestURLs); ++i) { for (size_t i = 0; i < arraysize(kTestURLs); ++i) {
athena::ActivityManager::Get()->AddActivity( athena::ActivityManager::Get()->AddActivity(
athena::ActivityFactory::Get()->CreateWebActivity(browser_context, athena::ActivityFactory::Get()->CreateWebActivity(
GURL(kTestURLs[i]))); browser_context, base::string16(), GURL(kTestURLs[i])));
} }
} }
......
...@@ -183,8 +183,8 @@ class UrlSearchResult : public app_list::SearchResult { ...@@ -183,8 +183,8 @@ class UrlSearchResult : public app_list::SearchResult {
// Overriddenn from app_list::SearchResult: // Overriddenn from app_list::SearchResult:
virtual void Open(int event_flags) OVERRIDE { virtual void Open(int event_flags) OVERRIDE {
ActivityManager::Get()->AddActivity( ActivityManager::Get()->AddActivity(
ActivityFactory::Get()->CreateWebActivity(browser_context_, ActivityFactory::Get()->CreateWebActivity(
match_.destination_url)); browser_context_, base::string16(), match_.destination_url));
} }
void UpdateIcon() { void UpdateIcon() {
......
...@@ -29,6 +29,7 @@ SampleActivityFactory::~SampleActivityFactory() {} ...@@ -29,6 +29,7 @@ SampleActivityFactory::~SampleActivityFactory() {}
Activity* SampleActivityFactory::CreateWebActivity( Activity* SampleActivityFactory::CreateWebActivity(
content::BrowserContext* browser_context, content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) { const GURL& url) {
return new SampleActivity( return new SampleActivity(
kDefaultColor, kDefaultContentColor, base::UTF8ToUTF16(url.spec())); kDefaultColor, kDefaultContentColor, base::UTF8ToUTF16(url.spec()));
......
...@@ -18,6 +18,7 @@ class SampleActivityFactory : public ActivityFactory { ...@@ -18,6 +18,7 @@ class SampleActivityFactory : public ActivityFactory {
// Overridden from ActivityFactory: // Overridden from ActivityFactory:
virtual Activity* CreateWebActivity(content::BrowserContext* browser_context, virtual Activity* CreateWebActivity(content::BrowserContext* browser_context,
const base::string16& title,
const GURL& url) OVERRIDE; const GURL& url) OVERRIDE;
virtual Activity* CreateAppActivity(extensions::ShellAppWindow* app_window, virtual Activity* CreateAppActivity(extensions::ShellAppWindow* app_window,
const std::string& app_id) OVERRIDE; const std::string& app_id) OVERRIDE;
......
...@@ -123,33 +123,6 @@ const Extension* GetExtension(const AppLaunchParams& params) { ...@@ -123,33 +123,6 @@ const Extension* GetExtension(const AppLaunchParams& params) {
ExtensionRegistry::TERMINATED); 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( ui::WindowShowState DetermineWindowShowState(
Profile* profile, Profile* profile,
extensions::LaunchContainer container, extensions::LaunchContainer container,
...@@ -467,3 +440,26 @@ bool CanLaunchViaEvent(const extensions::Extension* extension) { ...@@ -467,3 +440,26 @@ bool CanLaunchViaEvent(const extensions::Extension* extension) {
extensions::Feature* feature = feature_provider->GetFeature("app.runtime"); extensions::Feature* feature = feature_provider->GetFeature("app.runtime");
return feature->IsAvailableToExtension(extension).is_available(); 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, ...@@ -100,4 +100,10 @@ content::WebContents* OpenAppShortcutWindow(Profile* profile,
// chrome.app.runtime.onLaunched event. // chrome.app.runtime.onLaunched event.
bool CanLaunchViaEvent(const extensions::Extension* extension); 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_ #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