OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 // This module implements experimental API for <webview>. | 5 // This module implements experimental API for <webview>. |
6 // See web_view.js for details. | 6 // See web_view.js for details. |
7 // | 7 // |
8 // <webview> Experimental API is only available on canary and dev channels of | 8 // <webview> Experimental API is only available on canary and dev channels of |
9 // Chrome. | 9 // Chrome. |
10 | 10 |
(...skipping 29 matching lines...) Expand all Loading... |
40 * @constructor | 40 * @constructor |
41 */ | 41 */ |
42 function ContextMenusOnClickedEvent(opt_eventName, | 42 function ContextMenusOnClickedEvent(opt_eventName, |
43 opt_argSchemas, | 43 opt_argSchemas, |
44 opt_eventOptions, | 44 opt_eventOptions, |
45 opt_webViewInstanceId) { | 45 opt_webViewInstanceId) { |
46 var subEventName = GetUniqueSubEventName(opt_eventName); | 46 var subEventName = GetUniqueSubEventName(opt_eventName); |
47 EventBindings.Event.call(this, subEventName, opt_argSchemas, opt_eventOptions, | 47 EventBindings.Event.call(this, subEventName, opt_argSchemas, opt_eventOptions, |
48 opt_webViewInstanceId); | 48 opt_webViewInstanceId); |
49 | 49 |
50 var self = this; | |
51 // TODO(lazyboy): When do we dispose this listener? | 50 // TODO(lazyboy): When do we dispose this listener? |
52 ContextMenusEvent.addListener(function() { | 51 ContextMenusEvent.addListener(function() { |
53 // Re-dispatch to subEvent's listeners. | 52 // Re-dispatch to subEvent's listeners. |
54 $Function.apply(self.dispatch, self, $Array.slice(arguments)); | 53 $Function.apply(this.dispatch, this, $Array.slice(arguments)); |
55 }, {instanceId: opt_webViewInstanceId || 0}); | 54 }.bind(this), {instanceId: opt_webViewInstanceId || 0}); |
56 } | 55 } |
57 | 56 |
58 ContextMenusOnClickedEvent.prototype = { | 57 ContextMenusOnClickedEvent.prototype = { |
59 __proto__: EventBindings.Event.prototype | 58 __proto__: EventBindings.Event.prototype |
60 }; | 59 }; |
61 | 60 |
62 /** | 61 /** |
63 * An instance of this class is exposed as <webview>.contextMenus. | 62 * An instance of this class is exposed as <webview>.contextMenus. |
64 * @constructor | 63 * @constructor |
65 */ | 64 */ |
(...skipping 21 matching lines...) Expand all Loading... |
87 return $Function.apply(WebView.contextMenusUpdate, null, args); | 86 return $Function.apply(WebView.contextMenusUpdate, null, args); |
88 }; | 87 }; |
89 | 88 |
90 var WebViewContextMenus = utils.expose( | 89 var WebViewContextMenus = utils.expose( |
91 'WebViewContextMenus', WebViewContextMenusImpl, | 90 'WebViewContextMenus', WebViewContextMenusImpl, |
92 { functions: ['create', 'remove', 'removeAll', 'update'] }); | 91 { functions: ['create', 'remove', 'removeAll', 'update'] }); |
93 | 92 |
94 /** @private */ | 93 /** @private */ |
95 WebViewInternal.prototype.maybeHandleContextMenu = function(e, webViewEvent) { | 94 WebViewInternal.prototype.maybeHandleContextMenu = function(e, webViewEvent) { |
96 var requestId = e.requestId; | 95 var requestId = e.requestId; |
97 var self = this; | |
98 // Construct the event.menu object. | 96 // Construct the event.menu object. |
99 var actionTaken = false; | 97 var actionTaken = false; |
100 var validateCall = function() { | 98 var validateCall = function() { |
101 var ERROR_MSG_CONTEXT_MENU_ACTION_ALREADY_TAKEN = '<webview>: ' + | 99 var ERROR_MSG_CONTEXT_MENU_ACTION_ALREADY_TAKEN = '<webview>: ' + |
102 'An action has already been taken for this "contextmenu" event.'; | 100 'An action has already been taken for this "contextmenu" event.'; |
103 | 101 |
104 if (actionTaken) { | 102 if (actionTaken) { |
105 throw new Error(ERROR_MSG_CONTEXT_MENU_ACTION_ALREADY_TAKEN); | 103 throw new Error(ERROR_MSG_CONTEXT_MENU_ACTION_ALREADY_TAKEN); |
106 } | 104 } |
107 actionTaken = true; | 105 actionTaken = true; |
108 }; | 106 }; |
109 var menu = { | 107 var menu = { |
110 show: function(items) { | 108 show: function(items) { |
111 validateCall(); | 109 validateCall(); |
112 // TODO(lazyboy): WebViewShowContextFunction doesn't do anything useful | 110 // TODO(lazyboy): WebViewShowContextFunction doesn't do anything useful |
113 // with |items|, implement. | 111 // with |items|, implement. |
114 WebView.showContextMenu(self.guestInstanceId, requestId, items); | 112 WebView.showContextMenu(this.guestInstanceId, requestId, items); |
115 } | 113 }.bind(this) |
116 }; | 114 }; |
117 webViewEvent.menu = menu; | 115 webViewEvent.menu = menu; |
118 var webviewNode = this.webviewNode; | 116 var webviewNode = this.webviewNode; |
119 var defaultPrevented = !webviewNode.dispatchEvent(webViewEvent); | 117 var defaultPrevented = !webviewNode.dispatchEvent(webViewEvent); |
120 if (actionTaken) { | 118 if (actionTaken) { |
121 return; | 119 return; |
122 } | 120 } |
123 if (!defaultPrevented) { | 121 if (!defaultPrevented) { |
124 actionTaken = true; | 122 actionTaken = true; |
125 // The default action is equivalent to just showing the context menu as is. | 123 // The default action is equivalent to just showing the context menu as is. |
126 WebView.showContextMenu(self.guestInstanceId, requestId, undefined); | 124 WebView.showContextMenu(this.guestInstanceId, requestId, undefined); |
127 | 125 |
128 // TODO(lazyboy): Figure out a way to show warning message only when | 126 // TODO(lazyboy): Figure out a way to show warning message only when |
129 // listeners are registered for this event. | 127 // listeners are registered for this event. |
130 } // else we will ignore showing the context menu completely. | 128 } // else we will ignore showing the context menu completely. |
131 }; | 129 }; |
132 | 130 |
133 WebViewInternal.prototype.maybeGetExperimentalEvents = function() { | 131 WebViewInternal.prototype.maybeGetExperimentalEvents = function() { |
134 return {}; | 132 return {}; |
135 }; | 133 }; |
136 | 134 |
137 /** @private */ | 135 /** @private */ |
138 WebViewInternal.prototype.maybeGetExperimentalPermissions = function() { | 136 WebViewInternal.prototype.maybeGetExperimentalPermissions = function() { |
139 return []; | 137 return []; |
140 }; | 138 }; |
141 | 139 |
142 /** @private */ | 140 /** @private */ |
143 WebViewInternal.prototype.captureVisibleRegion = function(spec, callback) { | 141 WebViewInternal.prototype.captureVisibleRegion = function(spec, callback) { |
144 WebView.captureVisibleRegion(this.guestInstanceId, spec, callback); | 142 WebView.captureVisibleRegion(this.guestInstanceId, spec, callback); |
145 }; | 143 }; |
146 | 144 |
147 WebViewInternal.maybeRegisterExperimentalAPIs = function(proto) { | 145 WebViewInternal.maybeRegisterExperimentalAPIs = function(proto) { |
148 proto.captureVisibleRegion = function(spec, callback) { | 146 proto.captureVisibleRegion = function(spec, callback) { |
149 privates(this).internal.captureVisibleRegion(spec, callback); | 147 privates(this).internal.captureVisibleRegion(spec, callback); |
150 }; | 148 }; |
151 }; | 149 }; |
152 | 150 |
153 /** @private */ | 151 /** @private */ |
154 WebViewInternal.prototype.setupExperimentalContextMenus = function() { | 152 WebViewInternal.prototype.setupExperimentalContextMenus = function() { |
155 var self = this; | |
156 var createContextMenus = function() { | 153 var createContextMenus = function() { |
157 return function() { | 154 return function() { |
158 if (self.contextMenus_) { | 155 if (this.contextMenus_) { |
159 return self.contextMenus_; | 156 return this.contextMenus_; |
160 } | 157 } |
161 | 158 |
162 self.contextMenus_ = new WebViewContextMenus(self.viewInstanceId); | 159 this.contextMenus_ = new WebViewContextMenus(this.viewInstanceId); |
163 | 160 |
164 // Define 'onClicked' event property on |self.contextMenus_|. | 161 // Define 'onClicked' event property on |this.contextMenus_|. |
165 var getOnClickedEvent = function() { | 162 var getOnClickedEvent = function() { |
166 return function() { | 163 return function() { |
167 if (!self.contextMenusOnClickedEvent_) { | 164 if (!this.contextMenusOnClickedEvent_) { |
168 var eventName = 'webViewInternal.onClicked'; | 165 var eventName = 'webViewInternal.onClicked'; |
169 // TODO(lazyboy): Find event by name instead of events[0]. | 166 // TODO(lazyboy): Find event by name instead of events[0]. |
170 var eventSchema = WebViewSchema.events[0]; | 167 var eventSchema = WebViewSchema.events[0]; |
171 var eventOptions = {supportsListeners: true}; | 168 var eventOptions = {supportsListeners: true}; |
172 var onClickedEvent = new ContextMenusOnClickedEvent( | 169 var onClickedEvent = new ContextMenusOnClickedEvent( |
173 eventName, eventSchema, eventOptions, self.viewInstanceId); | 170 eventName, eventSchema, eventOptions, this.viewInstanceId); |
174 self.contextMenusOnClickedEvent_ = onClickedEvent; | 171 this.contextMenusOnClickedEvent_ = onClickedEvent; |
175 return onClickedEvent; | 172 return onClickedEvent; |
176 } | 173 } |
177 return self.contextMenusOnClickedEvent_; | 174 return this.contextMenusOnClickedEvent_; |
178 } | 175 }.bind(this); |
179 }; | 176 }.bind(this); |
180 Object.defineProperty( | 177 Object.defineProperty( |
181 self.contextMenus_, | 178 this.contextMenus_, |
182 'onClicked', | 179 'onClicked', |
183 {get: getOnClickedEvent(), enumerable: true}); | 180 {get: getOnClickedEvent(), enumerable: true}); |
184 | 181 |
185 return self.contextMenus_; | 182 return this.contextMenus_; |
186 }; | 183 }.bind(this); |
187 }; | 184 }.bind(this); |
188 | 185 |
189 // Expose <webview>.contextMenus object. | 186 // Expose <webview>.contextMenus object. |
190 Object.defineProperty( | 187 Object.defineProperty( |
191 this.webviewNode, | 188 this.webviewNode, |
192 'contextMenus', | 189 'contextMenus', |
193 { | 190 { |
194 get: createContextMenus(), | 191 get: createContextMenus(), |
195 enumerable: true | 192 enumerable: true |
196 }); | 193 }); |
197 }; | 194 }; |
OLD | NEW |