| Index: chrome/renderer/resources/extensions/web_view_experimental_api.js
|
| diff --git a/chrome/renderer/resources/extensions/web_view_experimental_api.js b/chrome/renderer/resources/extensions/web_view_experimental_api.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..49d16a0efba2a40a1436c1e191e8de7a9cccf035
|
| --- /dev/null
|
| +++ b/chrome/renderer/resources/extensions/web_view_experimental_api.js
|
| @@ -0,0 +1,66 @@
|
| +// Copyright (c) 2013 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.
|
| +
|
| +// Shim extension to provide permission request API (and possibly other future
|
| +// experimental APIs) for <webview> tag.
|
| +// See web_view.js for details.
|
| +//
|
| +// We want to control the permission API feature in <webview> separately from
|
| +// the <webview> feature itself. <webview> is available in stable channel, but
|
| +// permission API would only be available as 'experimental'.
|
| +
|
| +var WebView = require('webview').WebView;
|
| +
|
| +/**
|
| + * @param {!Object} detail The event details, originated from <object>.
|
| + * @private
|
| + */
|
| +WebView.prototype.maybeSetupPermissionEvent_ = function() {
|
| + var node = this.node_;
|
| + var objectNode = this.objectNode_;
|
| + this.objectNode_.addEventListener('-internal-permissionrequest', function(e) {
|
| + var evt = new Event('permissionrequest', {bubbles: true, cancelable: true});
|
| + var detail = e.detail ? JSON.parse(e.detail) : {};
|
| + ['permission', 'url'].forEach(function(attribName) {
|
| + evt[attribName] = detail[attribName];
|
| + });
|
| + var requestId = detail.request_id;
|
| +
|
| + if (detail.permission == 'media' && detail.request_id !== undefined) {
|
| + // TODO(lazyboy): Also fill in evt.details (see webview specs).
|
| + // http://crbug.com/141197.
|
| + var decisionMade = false;
|
| + // Construct the event.request object.
|
| + var request = {
|
| + allow: function() {
|
| + if (decisionMade) {
|
| + throw 'permissionrequest decision has already been made';
|
| + } else {
|
| + objectNode['-internal-setMediaPermission'](requestId, true);
|
| + decisionMade = true;
|
| + }
|
| + },
|
| + deny: function() {
|
| + if (decisionMade) {
|
| + throw 'permissionrequest decision has already been made';
|
| + } else {
|
| + objectNode['-internal-setMediaPermission'](requestId, false);
|
| + decisionMade = true;
|
| + }
|
| + }
|
| + };
|
| + evt.request = request;
|
| +
|
| + // Make browser plugin track lifetime of |request|.
|
| + objectNode['-internal-persistObject'](request, requestId);
|
| +
|
| + var defaultPrevented = !node.dispatchEvent(evt);
|
| + if (!decisionMade && !defaultPrevented) {
|
| + decisionMade = true;
|
| + objectNode['-internal-setMediaPermission'](requestId, false);
|
| + }
|
| + }
|
| + });
|
| +};
|
| +
|
|
|