summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormgiuca@chromium.org <mgiuca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-11 03:49:11 +0000
committermgiuca@chromium.org <mgiuca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-11 03:49:11 +0000
commitec05733941d5e225a0936036820e8d6bf1f1e531 (patch)
treeeabfd243a5fb8c06c56b52bc87415a165ff61119
parent54bc61b2ca7a6f6592830f8169be42222273fdc8 (diff)
downloadchromium_src-ec05733941d5e225a0936036820e8d6bf1f1e531.zip
chromium_src-ec05733941d5e225a0936036820e8d6bf1f1e531.tar.gz
chromium_src-ec05733941d5e225a0936036820e8d6bf1f1e531.tar.bz2
Experimental app list: Custom launcher pages have app APIs and style.
Added CustomLauncherPageContents, which is copied from AppWindowContents and modified to provide launcher pages instead. This correctly dispatches messages to the extensions system. The extension inside the launcher page is now "activated" which ensures that it is styled as a platform app and given the correct APIs by the extension dispatcher. BUG=391137 BUG=391202 Review URL: https://codereview.chromium.org/365013003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282530 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--apps/apps.gypi2
-rw-r--r--apps/custom_launcher_page_contents.cc76
-rw-r--r--apps/custom_launcher_page_contents.h56
-rw-r--r--chrome/browser/ui/app_list/app_list_view_delegate.cc22
-rw-r--r--chrome/browser/ui/app_list/app_list_view_delegate.h12
5 files changed, 151 insertions, 17 deletions
diff --git a/apps/apps.gypi b/apps/apps.gypi
index f52151a..b5fd397 100644
--- a/apps/apps.gypi
+++ b/apps/apps.gypi
@@ -47,6 +47,8 @@
'apps_client.h',
'browser_context_keyed_service_factories.cc',
'browser_context_keyed_service_factories.h',
+ 'custom_launcher_page_contents.cc',
+ 'custom_launcher_page_contents.h',
'launcher.cc',
'launcher.h',
'metrics_names.h',
diff --git a/apps/custom_launcher_page_contents.cc b/apps/custom_launcher_page_contents.cc
new file mode 100644
index 0000000..896d9da
--- /dev/null
+++ b/apps/custom_launcher_page_contents.cc
@@ -0,0 +1,76 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "apps/custom_launcher_page_contents.h"
+
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/site_instance.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/renderer_preferences.h"
+#include "extensions/common/extension_messages.h"
+
+namespace apps {
+
+CustomLauncherPageContents::CustomLauncherPageContents() {
+}
+
+CustomLauncherPageContents::~CustomLauncherPageContents() {
+}
+
+void CustomLauncherPageContents::Initialize(content::BrowserContext* context,
+ const GURL& url) {
+ extension_function_dispatcher_.reset(
+ new extensions::ExtensionFunctionDispatcher(context, this));
+
+ web_contents_.reset(
+ content::WebContents::Create(content::WebContents::CreateParams(
+ context, content::SiteInstance::CreateForURL(context, url))));
+
+ Observe(web_contents());
+ web_contents_->GetMutableRendererPrefs()
+ ->browser_handles_all_top_level_requests = true;
+ web_contents_->GetRenderViewHost()->SyncRendererPrefs();
+
+ // This observer will activate the extension when it is navigated to, which
+ // allows Dispatcher to give it the proper context and makes it behave like an
+ // extension.
+ extensions::ChromeExtensionWebContentsObserver::CreateForWebContents(
+ web_contents());
+
+ web_contents_->GetController().LoadURL(url,
+ content::Referrer(),
+ content::PAGE_TRANSITION_AUTO_TOPLEVEL,
+ std::string());
+}
+
+bool CustomLauncherPageContents::OnMessageReceived(
+ const IPC::Message& message) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(CustomLauncherPageContents, message)
+ IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+extensions::WindowController*
+CustomLauncherPageContents::GetExtensionWindowController() const {
+ return NULL;
+}
+
+content::WebContents* CustomLauncherPageContents::GetAssociatedWebContents()
+ const {
+ return web_contents();
+}
+
+void CustomLauncherPageContents::OnRequest(
+ const ExtensionHostMsg_Request_Params& params) {
+ extension_function_dispatcher_->Dispatch(params,
+ web_contents_->GetRenderViewHost());
+}
+
+} // namespace apps
diff --git a/apps/custom_launcher_page_contents.h b/apps/custom_launcher_page_contents.h
new file mode 100644
index 0000000..964a44d
--- /dev/null
+++ b/apps/custom_launcher_page_contents.h
@@ -0,0 +1,56 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef APPS_CUSTOM_LAUNCHER_PAGE_CONTENTS_H_
+#define APPS_CUSTOM_LAUNCHER_PAGE_CONTENTS_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "extensions/browser/extension_function_dispatcher.h"
+
+class GURL;
+
+namespace content {
+class BrowserContext;
+}
+
+namespace apps {
+
+// Manages the web contents for extension-hosted launcher pages. The
+// implementation for this class should create and maintain the WebContents for
+// the page, and handle any message passing between the web contents and the
+// extension system.
+class CustomLauncherPageContents
+ : public content::WebContentsObserver,
+ public extensions::ExtensionFunctionDispatcher::Delegate {
+ public:
+ CustomLauncherPageContents();
+ virtual ~CustomLauncherPageContents();
+
+ // Called to initialize and load the WebContents.
+ void Initialize(content::BrowserContext* context, const GURL& url);
+
+ content::WebContents* web_contents() const { return web_contents_.get(); }
+
+ private:
+ // content::WebContentsObserver overrides:
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+
+ // extensions::ExtensionFunctionDispatcher::Delegate overrides:
+ virtual extensions::WindowController* GetExtensionWindowController()
+ const OVERRIDE;
+ virtual content::WebContents* GetAssociatedWebContents() const OVERRIDE;
+
+ void OnRequest(const ExtensionHostMsg_Request_Params& params);
+
+ scoped_ptr<content::WebContents> web_contents_;
+ scoped_ptr<extensions::ExtensionFunctionDispatcher>
+ extension_function_dispatcher_;
+
+ DISALLOW_COPY_AND_ASSIGN(CustomLauncherPageContents);
+};
+
+} // namespace apps
+
+#endif // APPS_CUSTOM_LAUNCHER_PAGE_CONTENTS_H_
diff --git a/chrome/browser/ui/app_list/app_list_view_delegate.cc b/chrome/browser/ui/app_list/app_list_view_delegate.cc
index 6c2bf69..c813ca9 100644
--- a/chrome/browser/ui/app_list/app_list_view_delegate.cc
+++ b/chrome/browser/ui/app_list/app_list_view_delegate.cc
@@ -6,6 +6,7 @@
#include <vector>
+#include "apps/custom_launcher_page_contents.h"
#include "base/callback.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
@@ -162,13 +163,8 @@ AppListViewDelegate::AppListViewDelegate(Profile* profile,
LOG(ERROR) << "Invalid custom launcher page URL: "
<< custom_launcher_page_url.possibly_invalid_spec();
} else {
- content::WebContents::CreateParams params(profile_);
- custom_page_web_contents_.reset(content::WebContents::Create(params));
- custom_page_web_contents_->GetController().LoadURL(
- custom_launcher_page_url,
- content::Referrer(),
- content::PAGE_TRANSITION_AUTO_TOPLEVEL,
- std::string());
+ custom_page_contents_.reset(new apps::CustomLauncherPageContents());
+ custom_page_contents_->Initialize(profile, custom_launcher_page_url);
}
}
}
@@ -472,6 +468,7 @@ views::View* AppListViewDelegate::CreateStartPageWebView(
if (!web_contents)
return NULL;
+ DCHECK_EQ(profile_, web_contents->GetBrowserContext());
views::WebView* web_view = new views::WebView(
web_contents->GetBrowserContext());
web_view->SetPreferredSize(size);
@@ -481,13 +478,16 @@ views::View* AppListViewDelegate::CreateStartPageWebView(
views::View* AppListViewDelegate::CreateCustomPageWebView(
const gfx::Size& size) {
- if (!custom_page_web_contents_)
+ if (!custom_page_contents_)
return NULL;
- views::WebView* web_view = new views::WebView(
- custom_page_web_contents_->GetBrowserContext());
+ content::WebContents* web_contents = custom_page_contents_->web_contents();
+ // TODO(mgiuca): DCHECK_EQ(profile_, web_contents->GetBrowserContext()) after
+ // http://crbug.com/392763 resolved.
+ views::WebView* web_view =
+ new views::WebView(web_contents->GetBrowserContext());
web_view->SetPreferredSize(size);
- web_view->SetWebContents(custom_page_web_contents_.get());
+ web_view->SetWebContents(web_contents);
return web_view;
}
#endif
diff --git a/chrome/browser/ui/app_list/app_list_view_delegate.h b/chrome/browser/ui/app_list/app_list_view_delegate.h
index b5dba63..31899f9 100644
--- a/chrome/browser/ui/app_list/app_list_view_delegate.h
+++ b/chrome/browser/ui/app_list/app_list_view_delegate.h
@@ -23,6 +23,10 @@
class AppListControllerDelegate;
class Profile;
+namespace apps {
+class CustomLauncherPageContents;
+}
+
namespace app_list {
class SearchController;
class SpeechUIModel;
@@ -32,10 +36,6 @@ namespace base {
class FilePath;
}
-namespace content {
-class WebContents;
-}
-
namespace gfx {
class ImageSkia;
}
@@ -154,8 +154,8 @@ class AppListViewDelegate : public app_list::AppListViewDelegate,
// this instance can be removed as an observer on its destruction.
ScopedObserver<SigninManagerBase, AppListViewDelegate> scoped_observer_;
- // Contents of the additional custom launcher page. May be NULL.
- scoped_ptr<content::WebContents> custom_page_web_contents_;
+ // Window contents of the additional custom launcher page. May be NULL.
+ scoped_ptr<apps::CustomLauncherPageContents> custom_page_contents_;
DISALLOW_COPY_AND_ASSIGN(AppListViewDelegate);
};