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
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_permission_helper.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_process_host.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/render_view_host.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/user_metrics.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/extensions_api_client.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_constants.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_guest.h"
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/guest_view/web_view/web_view_permission_helper_delegate.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/guest_view/web_view/web_view_permission_types.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::BrowserPluginGuestDelegate;
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::RenderViewHost;
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace extensions {
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic std::string PermissionTypeToString(WebViewPermissionType type) {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (type) {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD:
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return webview::kPermissionTypeDownload;
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM:
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return webview::kPermissionTypeFileSystem;
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION:
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return webview::kPermissionTypeGeolocation;
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG:
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return webview::kPermissionTypeDialog;
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN:
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return webview::kPermissionTypeLoadPlugin;
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_MEDIA:
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return webview::kPermissionTypeMedia;
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW:
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return webview::kPermissionTypeNewWindow;
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK:
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return webview::kPermissionTypePointerLock;
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    default:
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NOTREACHED();
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return std::string();
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RecordUserInitiatedUMA(
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const WebViewPermissionHelper::PermissionResponseInfo& info,
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool allow) {
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (allow) {
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Note that |allow| == true means the embedder explicitly allowed the
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // request. For some requests they might still fail. An example of such
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // scenario would be: an embedder allows geolocation request but doesn't
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // have geolocation access on its own.
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    switch (info.permission_type) {
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD:
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionAllow.Download"));
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM:
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionAllow.FileSystem"));
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION:
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionAllow.Geolocation"));
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG:
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionAllow.JSDialog"));
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN:
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.Guest.PermissionAllow.PluginLoad"));
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_MEDIA:
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionAllow.Media"));
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW:
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("BrowserPlugin.PermissionAllow.NewWindow"));
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK:
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionAllow.PointerLock"));
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      default:
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    switch (info.permission_type) {
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_DOWNLOAD:
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionDeny.Download"));
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_FILESYSTEM:
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionDeny.FileSystem"));
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_GEOLOCATION:
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionDeny.Geolocation"));
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG:
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionDeny.JSDialog"));
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN:
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.Guest.PermissionDeny.PluginLoad"));
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_MEDIA:
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionDeny.Media"));
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW:
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("BrowserPlugin.PermissionDeny.NewWindow"));
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      case WEB_VIEW_PERMISSION_TYPE_POINTER_LOCK:
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::RecordAction(
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            UserMetricsAction("WebView.PermissionDeny.PointerLock"));
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      default:
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        break;
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
132116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::WebViewPermissionHelper(WebViewGuest* web_view_guest)
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : content::WebContentsObserver(web_view_guest->web_contents()),
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      next_permission_request_id_(guestview::kInstanceIDNone),
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_view_guest_(web_view_guest),
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      weak_factory_(this) {
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      web_view_permission_helper_delegate_.reset(
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ExtensionsAPIClient::Get()->CreateWebViewPermissionHelperDelegate(
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              this));
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
142116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::~WebViewPermissionHelper() {
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
146116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper* WebViewPermissionHelper::FromFrameID(
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int render_process_id,
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int render_frame_id) {
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebViewGuest* web_view_guest = WebViewGuest::FromFrameID(
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_process_id, render_frame_id);
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!web_view_guest) {
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return NULL;
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return web_view_guest->web_view_permission_helper_.get();
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
158116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper* WebViewPermissionHelper::FromWebContents(
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::WebContents* web_contents) {
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebViewGuest* web_view_guest = WebViewGuest::FromWebContents(web_contents);
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!web_view_guest)
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return NULL;
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return web_view_guest->web_view_permission_helper_.get();
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_PLUGINS)
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebViewPermissionHelper::OnMessageReceived(
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const IPC::Message& message,
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::RenderFrameHost* render_frame_host) {
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return web_view_permission_helper_delegate_->OnMessageReceived(
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      message, render_frame_host);
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool WebViewPermissionHelper::OnMessageReceived(const IPC::Message& message) {
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return web_view_permission_helper_delegate_->OnMessageReceived(message);
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // defined(ENABLE_PLUGINS)
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::RequestMediaAccessPermission(
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::WebContents* source,
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const content::MediaStreamRequest& request,
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const content::MediaResponseCallback& callback) {
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::DictionaryValue request_info;
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  request_info.SetString(guestview::kUrl, request.security_origin.spec());
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RequestPermission(
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WEB_VIEW_PERMISSION_TYPE_MEDIA,
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      request_info,
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&WebViewPermissionHelper::OnMediaPermissionResponse,
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 weak_factory_.GetWeakPtr(),
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 request,
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 callback),
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      false /* allowed_by_default */);
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool WebViewPermissionHelper::CheckMediaAccessPermission(
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content::WebContents* source,
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const GURL& security_origin,
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    content::MediaStreamType type) {
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!web_view_guest()->attached() ||
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !web_view_guest()->embedder_web_contents()->GetDelegate()) {
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return web_view_guest()
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->embedder_web_contents()
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->GetDelegate()
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->CheckMediaAccessPermission(
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          web_view_guest()->embedder_web_contents(), security_origin, type);
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebViewPermissionHelper::OnMediaPermissionResponse(
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const content::MediaStreamRequest& request,
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const content::MediaResponseCallback& callback,
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool allow,
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& user_input) {
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!allow) {
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback.Run(content::MediaStreamDevices(),
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 content::MEDIA_DEVICE_PERMISSION_DENIED,
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 scoped_ptr<content::MediaStreamUI>());
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!web_view_guest()->attached() ||
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !web_view_guest()->embedder_web_contents()->GetDelegate()) {
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback.Run(content::MediaStreamDevices(),
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 content::MEDIA_DEVICE_INVALID_STATE,
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 scoped_ptr<content::MediaStreamUI>());
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_view_guest()
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->embedder_web_contents()
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->GetDelegate()
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->RequestMediaAccessPermission(
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          web_view_guest()->embedder_web_contents(), request, callback);
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::CanDownload(
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::RenderViewHost* render_view_host,
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GURL& url,
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& request_method,
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::Callback<void(bool)>& callback) {
2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  web_view_permission_helper_delegate_->CanDownload(
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      render_view_host, url, request_method, callback);
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::RequestPointerLockPermission(
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool user_gesture,
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool last_unlocked_by_target,
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::Callback<void(bool)>& callback) {
2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  web_view_permission_helper_delegate_->RequestPointerLockPermission(
2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_gesture, last_unlocked_by_target, callback);
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::RequestGeolocationPermission(
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int bridge_id,
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GURL& requesting_frame,
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool user_gesture,
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::Callback<void(bool)>& callback) {
2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  web_view_permission_helper_delegate_->RequestGeolocationPermission(
2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      bridge_id, requesting_frame, user_gesture, callback);
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::CancelGeolocationPermissionRequest(
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int bridge_id) {
2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  web_view_permission_helper_delegate_->CancelGeolocationPermissionRequest(
2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      bridge_id);
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::RequestFileSystemPermission(
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const GURL& url,
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool allowed_by_default,
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::Callback<void(bool)>& callback) {
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  web_view_permission_helper_delegate_->RequestFileSystemPermission(
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      url, allowed_by_default, callback);
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::FileSystemAccessedAsync(int render_process_id,
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                      int render_frame_id,
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                      int request_id,
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                      const GURL& url,
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                      bool blocked_by_policy) {
2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  web_view_permission_helper_delegate_->FileSystemAccessedAsync(
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      render_process_id, render_frame_id, request_id, url, blocked_by_policy);
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebViewPermissionHelper::FileSystemAccessedSync(int render_process_id,
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                     int render_frame_id,
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                     const GURL& url,
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                     bool blocked_by_policy,
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                     IPC::Message* reply_msg) {
2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  web_view_permission_helper_delegate_->FileSystemAccessedSync(
2916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      render_process_id, render_frame_id, url, blocked_by_policy, reply_msg);
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint WebViewPermissionHelper::RequestPermission(
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WebViewPermissionType permission_type,
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::DictionaryValue& request_info,
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const PermissionResponseCallback& callback,
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool allowed_by_default) {
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If there are too many pending permission requests then reject this request.
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (pending_permission_requests_.size() >=
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      webview::kMaxOutstandingPermissionRequests) {
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Let the stack unwind before we deny the permission request so that
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // objects held by the permission request are not destroyed immediately
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // after creation. This is to allow those same objects to be accessed again
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // in the same scope without fear of use after freeing.
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::MessageLoop::current()->PostTask(
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        FROM_HERE,
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(&PermissionResponseCallback::Run,
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   base::Owned(new PermissionResponseCallback(callback)),
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   allowed_by_default,
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   std::string()));
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return webview::kInvalidPermissionRequestID;
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int request_id = next_permission_request_id_++;
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pending_permission_requests_[request_id] =
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      PermissionResponseInfo(callback, permission_type, allowed_by_default);
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::DictionaryValue> args(request_info.DeepCopy());
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  args->SetInteger(webview::kRequestId, request_id);
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (permission_type) {
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_NEW_WINDOW: {
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_view_guest_->DispatchEventToEmbedder(
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          new GuestViewBase::Event(webview::kEventNewWindow, args.Pass()));
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case WEB_VIEW_PERMISSION_TYPE_JAVASCRIPT_DIALOG: {
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_view_guest_->DispatchEventToEmbedder(
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          new GuestViewBase::Event(webview::kEventDialog, args.Pass()));
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    default: {
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      args->SetString(webview::kPermission,
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                      PermissionTypeToString(permission_type));
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      web_view_guest_->DispatchEventToEmbedder(new GuestViewBase::Event(
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          webview::kEventPermissionRequest,
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          args.Pass()));
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return request_id;
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
343116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::SetPermissionResult
344116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::SetPermission(
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int request_id,
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    PermissionResponseAction action,
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& user_input) {
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RequestMap::iterator request_itr =
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      pending_permission_requests_.find(request_id);
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (request_itr == pending_permission_requests_.end())
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return SET_PERMISSION_INVALID;
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const PermissionResponseInfo& info = request_itr->second;
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool allow = (action == ALLOW) ||
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ((action == DEFAULT) && info.allowed_by_default);
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  info.callback.Run(allow, user_input);
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Only record user initiated (i.e. non-default) actions.
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (action != DEFAULT)
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RecordUserInitiatedUMA(info, allow);
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  pending_permission_requests_.erase(request_itr);
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return allow ? SET_PERMISSION_ALLOWED : SET_PERMISSION_DENIED;
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void WebViewPermissionHelper::CancelPendingPermissionRequest(int request_id) {
3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RequestMap::iterator request_itr =
3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      pending_permission_requests_.find(request_id);
3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (request_itr == pending_permission_requests_.end())
3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  pending_permission_requests_.erase(request_itr);
3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
379116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::PermissionResponseInfo::PermissionResponseInfo()
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : permission_type(WEB_VIEW_PERMISSION_TYPE_UNKNOWN),
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      allowed_by_default(false) {
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
384116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::PermissionResponseInfo::PermissionResponseInfo(
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const PermissionResponseCallback& callback,
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WebViewPermissionType permission_type,
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool allowed_by_default)
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : callback(callback),
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      permission_type(permission_type),
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      allowed_by_default(allowed_by_default) {
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
393116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebViewPermissionHelper::PermissionResponseInfo::~PermissionResponseInfo() {
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
3956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace extensions
397