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']; | |
Fady Samuel
2013/09/26 21:27:12
For consistency, could you call to web_view_experi
sadrul
2013/09/26 21:51:33
We discussed offline. This is necessary here to ma
| |
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 |