1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "apps/custom_launcher_page_contents.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_view_host.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/site_instance.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/web_contents.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/renderer_preferences.h" 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "extensions/browser/app_window/app_delegate.h" 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "extensions/browser/app_window/app_web_contents_helper.h" 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/view_type_utils.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/extension_messages.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace apps { 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)CustomLauncherPageContents::CustomLauncherPageContents( 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<extensions::AppDelegate> app_delegate, 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& extension_id) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : app_delegate_(app_delegate.Pass()), extension_id_(extension_id) { 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCustomLauncherPageContents::~CustomLauncherPageContents() { 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CustomLauncherPageContents::Initialize(content::BrowserContext* context, 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& url) { 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extension_function_dispatcher_.reset( 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new extensions::ExtensionFunctionDispatcher(context, this)); 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_.reset( 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WebContents::Create(content::WebContents::CreateParams( 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context, content::SiteInstance::CreateForURL(context, url)))); 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Observe(web_contents()); 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_->GetMutableRendererPrefs() 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->browser_handles_all_top_level_requests = true; 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_->GetRenderViewHost()->SyncRendererPrefs(); 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) helper_.reset(new extensions::AppWebContentsHelper( 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context, extension_id_, web_contents_.get(), app_delegate_.get())); 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) web_contents_->SetDelegate(this); 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) extensions::SetViewType(web_contents(), extensions::VIEW_TYPE_LAUNCHER_PAGE); 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This observer will activate the extension when it is navigated to, which 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // allows Dispatcher to give it the proper context and makes it behave like an 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // extension. 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extensions::ChromeExtensionWebContentsObserver::CreateForWebContents( 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents()); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_->GetController().LoadURL(url, 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::Referrer(), 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_AUTO_TOPLEVEL, 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string()); 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)content::WebContents* CustomLauncherPageContents::OpenURLFromTab( 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* source, 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const content::OpenURLParams& params) { 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_EQ(web_contents_.get(), source); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return helper_->OpenURLFromTab(params); 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CustomLauncherPageContents::AddNewContents( 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* source, 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* new_contents, 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WindowOpenDisposition disposition, 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::Rect& initial_pos, 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool user_gesture, 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool* was_blocked) { 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) app_delegate_->AddNewContents(new_contents->GetBrowserContext(), 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new_contents, 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) disposition, 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) initial_pos, 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) user_gesture, 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) was_blocked); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool CustomLauncherPageContents::IsPopupOrPanel( 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const content::WebContents* source) const { 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool CustomLauncherPageContents::ShouldSuppressDialogs() { 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool CustomLauncherPageContents::PreHandleGestureEvent( 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* source, 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const blink::WebGestureEvent& event) { 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return extensions::AppWebContentsHelper::ShouldSuppressGestureEvent(event); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)content::ColorChooser* CustomLauncherPageContents::OpenColorChooser( 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* web_contents, 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SkColor initial_color, 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::vector<content::ColorSuggestion>& suggestionss) { 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return app_delegate_->ShowColorChooser(web_contents, initial_color); 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CustomLauncherPageContents::RunFileChooser( 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* tab, 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const content::FileChooserParams& params) { 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) app_delegate_->RunFileChooser(tab, params); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CustomLauncherPageContents::RequestToLockMouse( 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* web_contents, 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool user_gesture, 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool last_unlocked_by_target) { 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_EQ(web_contents_.get(), web_contents); 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) helper_->RequestToLockMouse(); 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CustomLauncherPageContents::RequestMediaAccessPermission( 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::WebContents* web_contents, 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const content::MediaStreamRequest& request, 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const content::MediaResponseCallback& callback) { 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_EQ(web_contents_.get(), web_contents); 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) helper_->RequestMediaAccessPermission(request, callback); 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool CustomLauncherPageContents::CheckMediaAccessPermission( 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* web_contents, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& security_origin, 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::MediaStreamType type) { 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_EQ(web_contents_.get(), web_contents); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return helper_->CheckMediaAccessPermission(security_origin, type); 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool CustomLauncherPageContents::OnMessageReceived( 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const IPC::Message& message) { 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool handled = true; 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_BEGIN_MESSAGE_MAP(CustomLauncherPageContents, message) 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_MESSAGE_UNHANDLED(handled = false) 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IPC_END_MESSAGE_MAP() 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return handled; 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdochextensions::WindowController* 148116680a4aac90f2aa7413d9095a592090648e557Ben MurdochCustomLauncherPageContents::GetExtensionWindowController() const { 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return NULL; 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdochcontent::WebContents* CustomLauncherPageContents::GetAssociatedWebContents() 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const { 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return web_contents(); 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CustomLauncherPageContents::OnRequest( 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ExtensionHostMsg_Request_Params& params) { 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extension_function_dispatcher_->Dispatch(params, 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_->GetRenderViewHost()); 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace apps 164