| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Shim that simulates a <webview> tag via Mutation Observers. | 5 // Shim that simulates a <webview> tag via Mutation Observers. |
| 6 // | 6 // |
| 7 // The actual tag is implemented via the browser plugin. The internals of this | 7 // The actual tag is implemented via the browser plugin. The internals of this |
| 8 // are hidden via Shadow DOM. | 8 // are hidden via Shadow DOM. |
| 9 | 9 |
| 10 'use strict'; | 10 'use strict'; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 'name' | 104 'name' |
| 105 ] | 105 ] |
| 106 }, | 106 }, |
| 107 'permissionrequest': { | 107 'permissionrequest': { |
| 108 cancelable: true, | 108 cancelable: true, |
| 109 customHandler: function(webViewInternal, event, webViewEvent) { | 109 customHandler: function(webViewInternal, event, webViewEvent) { |
| 110 webViewInternal.handlePermissionEvent_(event, webViewEvent); | 110 webViewInternal.handlePermissionEvent_(event, webViewEvent); |
| 111 }, | 111 }, |
| 112 evt: CreateEvent('webview.onPermissionRequest'), | 112 evt: CreateEvent('webview.onPermissionRequest'), |
| 113 fields: [ | 113 fields: [ |
| 114 'identifier', |
| 114 'lastUnlockedBySelf', | 115 'lastUnlockedBySelf', |
| 116 'name', |
| 115 'permission', | 117 'permission', |
| 116 'requestMethod', | 118 'requestMethod', |
| 117 'url', | 119 'url', |
| 118 'userGesture' | 120 'userGesture' |
| 119 ] | 121 ] |
| 120 }, | 122 }, |
| 121 'responsive': { | 123 'responsive': { |
| 122 evt: CreateEvent('webview.onResponsive'), | 124 evt: CreateEvent('webview.onResponsive'), |
| 123 fields: ['processId'] | 125 fields: ['processId'] |
| 124 }, | 126 }, |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 function(event, webViewEvent) { | 746 function(event, webViewEvent) { |
| 745 var ERROR_MSG_PERMISSION_ALREADY_DECIDED = '<webview>: ' + | 747 var ERROR_MSG_PERMISSION_ALREADY_DECIDED = '<webview>: ' + |
| 746 'Permission has already been decided for this "permissionrequest" event.'; | 748 'Permission has already been decided for this "permissionrequest" event.'; |
| 747 | 749 |
| 748 var showWarningMessage = function(permission) { | 750 var showWarningMessage = function(permission) { |
| 749 var WARNING_MSG_PERMISSION_DENIED = '<webview>: ' + | 751 var WARNING_MSG_PERMISSION_DENIED = '<webview>: ' + |
| 750 'The permission request for "%1" has been denied.'; | 752 'The permission request for "%1" has been denied.'; |
| 751 console.warn(WARNING_MSG_PERMISSION_DENIED.replace('%1', permission)); | 753 console.warn(WARNING_MSG_PERMISSION_DENIED.replace('%1', permission)); |
| 752 }; | 754 }; |
| 753 | 755 |
| 754 var PERMISSION_TYPES = this.getPermissionTypes_(); | 756 var PERMISSION_TYPES = this.getPermissionTypes_().concat( |
| 757 this.maybeGetExperimentalPermissions_()); |
| 758 if (PERMISSION_TYPES.indexOf(event.permission) < 0) { |
| 759 // The permission type is not allowed. Trigger the default response. |
| 760 var defaultPermission = this.getDefaultPermission_(event); |
| 761 WebView.setPermission(self.instanceId_, requestId, defaultPermission, ''); |
| 762 if (!defaultPermission) |
| 763 showWarningMessage(event.permission); |
| 764 return; |
| 765 } |
| 755 | 766 |
| 756 var self = this; | 767 var self = this; |
| 757 var browserPluginNode = this.browserPluginNode_; | 768 var browserPluginNode = this.browserPluginNode_; |
| 758 var webviewNode = this.webviewNode_; | 769 var webviewNode = this.webviewNode_; |
| 759 | 770 |
| 760 var requestId = event.requestId; | 771 var requestId = event.requestId; |
| 761 var decisionMade = false; | 772 var decisionMade = false; |
| 762 | 773 |
| 763 var validateCall = function() { | 774 var validateCall = function() { |
| 764 if (decisionMade) { | 775 if (decisionMade) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 778 WebView.setPermission(self.instanceId_, requestId, false, ''); | 789 WebView.setPermission(self.instanceId_, requestId, false, ''); |
| 779 } | 790 } |
| 780 }; | 791 }; |
| 781 webViewEvent.request = request; | 792 webViewEvent.request = request; |
| 782 | 793 |
| 783 var defaultPrevented = !webviewNode.dispatchEvent(webViewEvent); | 794 var defaultPrevented = !webviewNode.dispatchEvent(webViewEvent); |
| 784 if (decisionMade) { | 795 if (decisionMade) { |
| 785 return; | 796 return; |
| 786 } | 797 } |
| 787 | 798 |
| 799 var defaultPermission = this.getDefaultPermission_(event); |
| 788 if (defaultPrevented) { | 800 if (defaultPrevented) { |
| 789 // Make browser plugin track lifetime of |request|. | 801 // Make browser plugin track lifetime of |request|. |
| 790 MessagingNatives.BindToGC(request, function() { | 802 MessagingNatives.BindToGC(request, function() { |
| 791 // Avoid showing a warning message if the decision has already been made. | 803 // Avoid showing a warning message if the decision has already been made. |
| 792 if (decisionMade) { | 804 if (decisionMade) { |
| 793 return; | 805 return; |
| 794 } | 806 } |
| 795 WebView.setPermission(self.instanceId_, requestId, false, ''); | 807 WebView.setPermission(self.instanceId_, requestId, defaultPermission, ''); |
| 796 showWarningMessage(event.permission); | 808 if (!defaultPermission) |
| 809 showWarningMessage(event.permission); |
| 797 }); | 810 }); |
| 798 } else { | 811 } else { |
| 799 decisionMade = true; | 812 decisionMade = true; |
| 800 WebView.setPermission(self.instanceId_, requestId, false, ''); | 813 WebView.setPermission(self.instanceId_, requestId, defaultPermission, ''); |
| 801 showWarningMessage(event.permission); | 814 if (!defaultPermission) |
| 815 showWarningMessage(event.permission); |
| 802 } | 816 } |
| 803 }; | 817 }; |
| 804 | 818 |
| 805 /** | 819 /** |
| 806 * @private | 820 * @private |
| 807 */ | 821 */ |
| 808 WebViewInternal.prototype.setupWebRequestEvents_ = function() { | 822 WebViewInternal.prototype.setupWebRequestEvents_ = function() { |
| 809 var self = this; | 823 var self = this; |
| 810 var request = {}; | 824 var request = {}; |
| 811 var createWebRequestEvent = function(webRequestEvent) { | 825 var createWebRequestEvent = function(webRequestEvent) { |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 962 * @private | 976 * @private |
| 963 */ | 977 */ |
| 964 WebViewInternal.prototype.maybeGetExperimentalEvents_ = function() {}; | 978 WebViewInternal.prototype.maybeGetExperimentalEvents_ = function() {}; |
| 965 | 979 |
| 966 /** | 980 /** |
| 967 * Implemented when the experimental API is available. | 981 * Implemented when the experimental API is available. |
| 968 * @private | 982 * @private |
| 969 */ | 983 */ |
| 970 WebViewInternal.prototype.maybeAttachWebRequestEventToWebview_ = function() {}; | 984 WebViewInternal.prototype.maybeAttachWebRequestEventToWebview_ = function() {}; |
| 971 | 985 |
| 986 /** |
| 987 * Implemented when the experimental API is available. |
| 988 * @private |
| 989 */ |
| 990 WebViewInternal.prototype.maybeGetExperimentalPermissions_ = function() { |
| 991 return []; |
| 992 }; |
| 993 |
| 994 /** @private */ |
| 995 WebViewInternal.prototype.getDefaultPermission_ = function(event) { |
| 996 var PERMISSIONS_DEFAULT_ALLOWED = ['loadplugin']; |
| 997 return PERMISSIONS_DEFAULT_ALLOWED.indexOf(event.permission) >= 0; |
| 998 }; |
| 999 |
| 972 exports.WebView = WebView; | 1000 exports.WebView = WebView; |
| 973 exports.WebViewInternal = WebViewInternal; | 1001 exports.WebViewInternal = WebViewInternal; |
| 974 exports.CreateEvent = CreateEvent; | 1002 exports.CreateEvent = CreateEvent; |
| OLD | NEW |