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