Chromium Code Reviews| 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..dc231455cd89a2ff73c9c08508d1eb8a71f8a6ed |
| --- /dev/null |
| +++ b/chrome/renderer/resources/extensions/web_view_experimental_api.js |
| @@ -0,0 +1,70 @@ |
| +// 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; |
| + |
| +var REQUEST_TYPE_MEDIA = 'media'; |
| + |
| +/** |
| + * @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.requestId; |
| + |
| + if (detail.permission == REQUEST_TYPE_MEDIA && |
| + detail.requestId !== 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'; |
|
Matt Perry
2013/02/13 23:20:08
throw new Error(<error string>)
also, use a full
lazyboy
2013/02/14 00:09:46
Done.
|
| + } else { |
| + objectNode['-internal-setPermission'](requestId, true); |
| + decisionMade = true; |
| + } |
| + }, |
| + deny: function() { |
| + if (decisionMade) { |
| + throw 'permissionrequest decision has already been made'; |
| + } else { |
| + objectNode['-internal-setPermission'](requestId, false); |
| + decisionMade = true; |
| + } |
| + } |
| + }; |
| + evt.request = request; |
| + |
| + // Make browser plugin track lifetime of |request|. |
| + objectNode['-internal-persistObject']( |
| + request, REQUEST_TYPE_MEDIA, requestId); |
| + |
| + var defaultPrevented = !node.dispatchEvent(evt); |
| + if (!decisionMade && !defaultPrevented) { |
| + decisionMade = true; |
| + objectNode['-internal-setPermission'](requestId, false); |
| + } |
| + } |
| + }); |
| +}; |
| + |