diff options
-rw-r--r-- | apps/custom_launcher_page_contents.cc | 78 | ||||
-rw-r--r-- | apps/custom_launcher_page_contents.h | 45 | ||||
-rw-r--r-- | chrome/browser/ui/app_list/app_list_view_delegate.cc | 5 |
3 files changed, 123 insertions, 5 deletions
diff --git a/apps/custom_launcher_page_contents.cc b/apps/custom_launcher_page_contents.cc index fbcfe33..2af3d3a 100644 --- a/apps/custom_launcher_page_contents.cc +++ b/apps/custom_launcher_page_contents.cc @@ -6,9 +6,10 @@ #include <string> +#include "apps/app_delegate.h" +#include "apps/app_web_contents_helper.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" @@ -17,7 +18,10 @@ namespace apps { -CustomLauncherPageContents::CustomLauncherPageContents() { +CustomLauncherPageContents::CustomLauncherPageContents( + scoped_ptr<AppDelegate> app_delegate, + const std::string& extension_id) + : app_delegate_(app_delegate.Pass()), extension_id_(extension_id) { } CustomLauncherPageContents::~CustomLauncherPageContents() { @@ -37,6 +41,10 @@ void CustomLauncherPageContents::Initialize(content::BrowserContext* context, ->browser_handles_all_top_level_requests = true; web_contents_->GetRenderViewHost()->SyncRendererPrefs(); + helper_.reset(new AppWebContentsHelper( + context, extension_id_, web_contents_.get(), app_delegate_.get())); + web_contents_->SetDelegate(this); + // 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. @@ -49,6 +57,72 @@ void CustomLauncherPageContents::Initialize(content::BrowserContext* context, std::string()); } +content::WebContents* CustomLauncherPageContents::OpenURLFromTab( + content::WebContents* source, + const content::OpenURLParams& params) { + DCHECK_EQ(web_contents_.get(), source); + return helper_->OpenURLFromTab(params); +} + +void CustomLauncherPageContents::AddNewContents( + content::WebContents* source, + content::WebContents* new_contents, + WindowOpenDisposition disposition, + const gfx::Rect& initial_pos, + bool user_gesture, + bool* was_blocked) { + app_delegate_->AddNewContents(new_contents->GetBrowserContext(), + new_contents, + disposition, + initial_pos, + user_gesture, + was_blocked); +} + +bool CustomLauncherPageContents::IsPopupOrPanel( + const content::WebContents* source) const { + return true; +} + +bool CustomLauncherPageContents::ShouldSuppressDialogs() { + return true; +} + +bool CustomLauncherPageContents::PreHandleGestureEvent( + content::WebContents* source, + const blink::WebGestureEvent& event) { + return AppWebContentsHelper::ShouldSuppressGestureEvent(event); +} + +content::ColorChooser* CustomLauncherPageContents::OpenColorChooser( + content::WebContents* web_contents, + SkColor initial_color, + const std::vector<content::ColorSuggestion>& suggestionss) { + return app_delegate_->ShowColorChooser(web_contents, initial_color); +} + +void CustomLauncherPageContents::RunFileChooser( + content::WebContents* tab, + const content::FileChooserParams& params) { + app_delegate_->RunFileChooser(tab, params); +} + +void CustomLauncherPageContents::RequestToLockMouse( + content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target) { + DCHECK_EQ(web_contents_.get(), web_contents); + helper_->RequestToLockMouse(); +} + +void CustomLauncherPageContents::RequestMediaAccessPermission( + content::WebContents* web_contents, + const content::MediaStreamRequest& request, + const content::MediaResponseCallback& callback) { + DCHECK_EQ(web_contents_.get(), web_contents); + helper_->RequestMediaAccessPermission(request, callback); +} + bool CustomLauncherPageContents::OnMessageReceived( const IPC::Message& message) { bool handled = true; diff --git a/apps/custom_launcher_page_contents.h b/apps/custom_launcher_page_contents.h index 964a44d..38e1cda 100644 --- a/apps/custom_launcher_page_contents.h +++ b/apps/custom_launcher_page_contents.h @@ -6,6 +6,7 @@ #define APPS_CUSTOM_LAUNCHER_PAGE_CONTENTS_H_ #include "base/memory/scoped_ptr.h" +#include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_observer.h" #include "extensions/browser/extension_function_dispatcher.h" @@ -17,15 +18,20 @@ class BrowserContext; namespace apps { +class AppDelegate; +class AppWebContentsHelper; + // 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 content::WebContentsDelegate, + public content::WebContentsObserver, public extensions::ExtensionFunctionDispatcher::Delegate { public: - CustomLauncherPageContents(); + CustomLauncherPageContents(scoped_ptr<AppDelegate> app_delegate, + const std::string& extension_id); virtual ~CustomLauncherPageContents(); // Called to initialize and load the WebContents. @@ -33,6 +39,37 @@ class CustomLauncherPageContents content::WebContents* web_contents() const { return web_contents_.get(); } + // content::WebContentsDelegate overrides: + virtual content::WebContents* OpenURLFromTab( + content::WebContents* source, + const content::OpenURLParams& params) OVERRIDE; + virtual void AddNewContents(content::WebContents* source, + content::WebContents* new_contents, + WindowOpenDisposition disposition, + const gfx::Rect& initial_pos, + bool user_gesture, + bool* was_blocked) OVERRIDE; + virtual bool IsPopupOrPanel( + const content::WebContents* source) const OVERRIDE; + virtual bool ShouldSuppressDialogs() OVERRIDE; + virtual bool PreHandleGestureEvent( + content::WebContents* source, + const blink::WebGestureEvent& event) OVERRIDE; + virtual content::ColorChooser* OpenColorChooser( + content::WebContents* web_contents, + SkColor color, + const std::vector<content::ColorSuggestion>& suggestions) OVERRIDE; + virtual void RunFileChooser( + content::WebContents* tab, + const content::FileChooserParams& params) OVERRIDE; + virtual void RequestToLockMouse(content::WebContents* web_contents, + bool user_gesture, + bool last_unlocked_by_target) OVERRIDE; + virtual void RequestMediaAccessPermission( + content::WebContents* web_contents, + const content::MediaStreamRequest& request, + const content::MediaResponseCallback& callback) OVERRIDE; + private: // content::WebContentsObserver overrides: virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; @@ -47,6 +84,10 @@ class CustomLauncherPageContents scoped_ptr<content::WebContents> web_contents_; scoped_ptr<extensions::ExtensionFunctionDispatcher> extension_function_dispatcher_; + scoped_ptr<AppDelegate> app_delegate_; + scoped_ptr<AppWebContentsHelper> helper_; + + std::string extension_id_; DISALLOW_COPY_AND_ASSIGN(CustomLauncherPageContents); }; 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 21fa373..25180a0 100644 --- a/chrome/browser/ui/app_list/app_list_view_delegate.cc +++ b/chrome/browser/ui/app_list/app_list_view_delegate.cc @@ -24,6 +24,7 @@ #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h" #include "chrome/browser/ui/app_list/search/search_controller.h" #include "chrome/browser/ui/app_list/start_page_service.h" +#include "chrome/browser/ui/apps/chrome_app_delegate.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/host_desktop.h" @@ -159,7 +160,9 @@ AppListViewDelegate::AppListViewDelegate(Profile* profile, LOG(ERROR) << "Invalid custom launcher page URL: " << custom_launcher_page_url.possibly_invalid_spec(); } else { - custom_page_contents_.reset(new apps::CustomLauncherPageContents()); + std::string extension_id = custom_launcher_page_url.host(); + custom_page_contents_.reset(new apps::CustomLauncherPageContents( + scoped_ptr<apps::AppDelegate>(new ChromeAppDelegate), extension_id)); custom_page_contents_->Initialize(profile, custom_launcher_page_url); } } |