| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 // Event management for WebViewInternal. | 5 // Event management for WebViewInternal. |
| 6 | 6 |
| 7 var DeclarativeWebRequestSchema = | |
| 8 requireNative('schema_registry').GetSchema('declarativeWebRequest'); | |
| 9 var EventBindings = require('event_bindings'); | 7 var EventBindings = require('event_bindings'); |
| 10 var IdGenerator = requireNative('id_generator'); | |
| 11 var MessagingNatives = requireNative('messaging_natives'); | 8 var MessagingNatives = requireNative('messaging_natives'); |
| 12 var WebRequestEvent = require('webRequestInternal').WebRequestEvent; | |
| 13 var WebRequestSchema = | |
| 14 requireNative('schema_registry').GetSchema('webRequest'); | |
| 15 var WebView = require('webViewInternal').WebView; | 9 var WebView = require('webViewInternal').WebView; |
| 16 | 10 |
| 17 var CreateEvent = function(name) { | 11 var CreateEvent = function(name) { |
| 18 var eventOpts = {supportsListeners: true, supportsFilters: true}; | 12 var eventOpts = {supportsListeners: true, supportsFilters: true}; |
| 19 return new EventBindings.Event(name, undefined, eventOpts); | 13 return new EventBindings.Event(name, undefined, eventOpts); |
| 20 }; | 14 }; |
| 21 | 15 |
| 22 var FrameNameChangedEvent = CreateEvent('webViewInternal.onFrameNameChanged'); | 16 var FrameNameChangedEvent = CreateEvent('webViewInternal.onFrameNameChanged'); |
| 23 var PluginDestroyedEvent = CreateEvent('webViewInternal.onPluginDestroyed'); | 17 var PluginDestroyedEvent = CreateEvent('webViewInternal.onPluginDestroyed'); |
| 24 var WebRequestMessageEvent = CreateEvent('webViewInternal.onMessage'); | |
| 25 | 18 |
| 26 // WEB_VIEW_EVENTS is a map of stable <webview> DOM event names to their | 19 // WEB_VIEW_EVENTS is a map of stable <webview> DOM event names to their |
| 27 // associated extension event descriptor objects. | 20 // associated extension event descriptor objects. |
| 28 // An event listener will be attached to the extension event |evt| specified in | 21 // An event listener will be attached to the extension event |evt| specified in |
| 29 // the descriptor. | 22 // the descriptor. |
| 30 // |fields| specifies the public-facing fields in the DOM event that are | 23 // |fields| specifies the public-facing fields in the DOM event that are |
| 31 // accessible to <webview> developers. | 24 // accessible to <webview> developers. |
| 32 // |customHandler| allows a handler function to be called each time an extension | 25 // |customHandler| allows a handler function to be called each time an extension |
| 33 // event is caught by its event listener. The DOM event should be dispatched | 26 // event is caught by its event listener. The DOM event should be dispatched |
| 34 // within this handler function. With no handler function, the DOM event | 27 // within this handler function. With no handler function, the DOM event |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 'unresponsive': { | 141 'unresponsive': { |
| 149 evt: CreateEvent('webViewInternal.onUnresponsive'), | 142 evt: CreateEvent('webViewInternal.onUnresponsive'), |
| 150 fields: ['processId'] | 143 fields: ['processId'] |
| 151 }, | 144 }, |
| 152 'zoomchange': { | 145 'zoomchange': { |
| 153 evt: CreateEvent('webViewInternal.onZoomChange'), | 146 evt: CreateEvent('webViewInternal.onZoomChange'), |
| 154 fields: ['oldZoomFactor', 'newZoomFactor'] | 147 fields: ['oldZoomFactor', 'newZoomFactor'] |
| 155 } | 148 } |
| 156 }; | 149 }; |
| 157 | 150 |
| 158 function DeclarativeWebRequestEvent(opt_eventName, | |
| 159 opt_argSchemas, | |
| 160 opt_eventOptions, | |
| 161 opt_webViewInstanceId) { | |
| 162 var subEventName = opt_eventName + '/' + IdGenerator.GetNextId(); | |
| 163 EventBindings.Event.call(this, subEventName, opt_argSchemas, opt_eventOptions, | |
| 164 opt_webViewInstanceId); | |
| 165 | |
| 166 // TODO(lazyboy): When do we dispose this listener? | |
| 167 WebRequestMessageEvent.addListener(function() { | |
| 168 // Re-dispatch to subEvent's listeners. | |
| 169 $Function.apply(this.dispatch, this, $Array.slice(arguments)); | |
| 170 }.bind(this), {instanceId: opt_webViewInstanceId || 0}); | |
| 171 } | |
| 172 | |
| 173 DeclarativeWebRequestEvent.prototype = { | |
| 174 __proto__: EventBindings.Event.prototype | |
| 175 }; | |
| 176 | |
| 177 // Constructor. | 151 // Constructor. |
| 178 function WebViewEvents(webViewInternal, viewInstanceId) { | 152 function WebViewEvents(webViewInternal, viewInstanceId) { |
| 179 this.webViewInternal = webViewInternal; | 153 this.webViewInternal = webViewInternal; |
| 180 this.viewInstanceId = viewInstanceId; | 154 this.viewInstanceId = viewInstanceId; |
| 181 this.setup(); | 155 this.setup(); |
| 182 } | 156 } |
| 183 | 157 |
| 184 // Sets up events. | 158 // Sets up events. |
| 185 WebViewEvents.prototype.setup = function() { | 159 WebViewEvents.prototype.setup = function() { |
| 186 this.setupFrameNameChangedEvent(); | 160 this.setupFrameNameChangedEvent(); |
| 187 this.setupPluginDestroyedEvent(); | 161 this.setupPluginDestroyedEvent(); |
| 188 this.setupWebRequestEvents(); | 162 this.webViewInternal.maybeSetupChromeWebViewEvents(); |
| 189 this.webViewInternal.setupExperimentalContextMenus(); | 163 this.webViewInternal.setupExperimentalContextMenus(); |
| 190 | 164 |
| 191 var events = this.getEvents(); | 165 var events = this.getEvents(); |
| 192 for (var eventName in events) { | 166 for (var eventName in events) { |
| 193 this.setupEvent(eventName, events[eventName]); | 167 this.setupEvent(eventName, events[eventName]); |
| 194 } | 168 } |
| 195 }; | 169 }; |
| 196 | 170 |
| 197 WebViewEvents.prototype.setupFrameNameChangedEvent = function() { | 171 WebViewEvents.prototype.setupFrameNameChangedEvent = function() { |
| 198 FrameNameChangedEvent.addListener(function(e) { | 172 FrameNameChangedEvent.addListener(function(e) { |
| 199 this.webViewInternal.onFrameNameChanged(e.name); | 173 this.webViewInternal.onFrameNameChanged(e.name); |
| 200 }.bind(this), {instanceId: this.viewInstanceId}); | 174 }.bind(this), {instanceId: this.viewInstanceId}); |
| 201 }; | 175 }; |
| 202 | 176 |
| 203 WebViewEvents.prototype.setupPluginDestroyedEvent = function() { | 177 WebViewEvents.prototype.setupPluginDestroyedEvent = function() { |
| 204 PluginDestroyedEvent.addListener(function(e) { | 178 PluginDestroyedEvent.addListener(function(e) { |
| 205 this.webViewInternal.onPluginDestroyed(); | 179 this.webViewInternal.onPluginDestroyed(); |
| 206 }.bind(this), {instanceId: this.viewInstanceId}); | 180 }.bind(this), {instanceId: this.viewInstanceId}); |
| 207 }; | 181 }; |
| 208 | 182 |
| 209 WebViewEvents.prototype.setupWebRequestEvents = function() { | |
| 210 var request = {}; | |
| 211 var createWebRequestEvent = function(webRequestEvent) { | |
| 212 return function() { | |
| 213 if (!this[webRequestEvent.name]) { | |
| 214 this[webRequestEvent.name] = | |
| 215 new WebRequestEvent( | |
| 216 'webViewInternal.' + webRequestEvent.name, | |
| 217 webRequestEvent.parameters, | |
| 218 webRequestEvent.extraParameters, webRequestEvent.options, | |
| 219 this.viewInstanceId); | |
| 220 } | |
| 221 return this[webRequestEvent.name]; | |
| 222 }.bind(this); | |
| 223 }.bind(this); | |
| 224 | |
| 225 var createDeclarativeWebRequestEvent = function(webRequestEvent) { | |
| 226 return function() { | |
| 227 if (!this[webRequestEvent.name]) { | |
| 228 // The onMessage event gets a special event type because we want | |
| 229 // the listener to fire only for messages targeted for this particular | |
| 230 // <webview>. | |
| 231 var EventClass = webRequestEvent.name === 'onMessage' ? | |
| 232 DeclarativeWebRequestEvent : EventBindings.Event; | |
| 233 this[webRequestEvent.name] = | |
| 234 new EventClass( | |
| 235 'webViewInternal.' + webRequestEvent.name, | |
| 236 webRequestEvent.parameters, | |
| 237 webRequestEvent.options, | |
| 238 this.viewInstanceId); | |
| 239 } | |
| 240 return this[webRequestEvent.name]; | |
| 241 }.bind(this); | |
| 242 }.bind(this); | |
| 243 | |
| 244 for (var i = 0; i < DeclarativeWebRequestSchema.events.length; ++i) { | |
| 245 var eventSchema = DeclarativeWebRequestSchema.events[i]; | |
| 246 var webRequestEvent = createDeclarativeWebRequestEvent(eventSchema); | |
| 247 Object.defineProperty( | |
| 248 request, | |
| 249 eventSchema.name, | |
| 250 { | |
| 251 get: webRequestEvent, | |
| 252 enumerable: true | |
| 253 } | |
| 254 ); | |
| 255 } | |
| 256 | |
| 257 // Populate the WebRequest events from the API definition. | |
| 258 for (var i = 0; i < WebRequestSchema.events.length; ++i) { | |
| 259 var webRequestEvent = createWebRequestEvent(WebRequestSchema.events[i]); | |
| 260 Object.defineProperty( | |
| 261 request, | |
| 262 WebRequestSchema.events[i].name, | |
| 263 { | |
| 264 get: webRequestEvent, | |
| 265 enumerable: true | |
| 266 } | |
| 267 ); | |
| 268 } | |
| 269 | |
| 270 this.webViewInternal.setRequestPropertyOnWebViewNode(request); | |
| 271 }; | |
| 272 | |
| 273 WebViewEvents.prototype.getEvents = function() { | 183 WebViewEvents.prototype.getEvents = function() { |
| 274 var experimentalEvents = this.webViewInternal.maybeGetExperimentalEvents(); | 184 var experimentalEvents = this.webViewInternal.maybeGetExperimentalEvents(); |
| 275 for (var eventName in experimentalEvents) { | 185 for (var eventName in experimentalEvents) { |
| 276 WEB_VIEW_EVENTS[eventName] = experimentalEvents[eventName]; | 186 WEB_VIEW_EVENTS[eventName] = experimentalEvents[eventName]; |
| 277 } | 187 } |
| 278 var chromeEvents = this.webViewInternal.maybeGetChromeWebViewEvents(); | 188 var chromeEvents = this.webViewInternal.maybeGetChromeWebViewEvents(); |
| 279 for (var eventName in chromeEvents) { | 189 for (var eventName in chromeEvents) { |
| 280 WEB_VIEW_EVENTS[eventName] = chromeEvents[eventName]; | 190 WEB_VIEW_EVENTS[eventName] = chromeEvents[eventName]; |
| 281 } | 191 } |
| 282 return WEB_VIEW_EVENTS; | 192 return WEB_VIEW_EVENTS; |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 } | 523 } |
| 614 }; | 524 }; |
| 615 | 525 |
| 616 WebViewEvents.prototype.handleSizeChangedEvent = function( | 526 WebViewEvents.prototype.handleSizeChangedEvent = function( |
| 617 event, webViewEvent) { | 527 event, webViewEvent) { |
| 618 this.webViewInternal.onSizeChanged(webViewEvent); | 528 this.webViewInternal.onSizeChanged(webViewEvent); |
| 619 }; | 529 }; |
| 620 | 530 |
| 621 exports.WebViewEvents = WebViewEvents; | 531 exports.WebViewEvents = WebViewEvents; |
| 622 exports.CreateEvent = CreateEvent; | 532 exports.CreateEvent = CreateEvent; |
| OLD | NEW |