| 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 // TODO(robwu): Fix indentation. |
| 6 |
| 5 var exceptionHandler = require('uncaught_exception_handler'); | 7 var exceptionHandler = require('uncaught_exception_handler'); |
| 6 var eventNatives = requireNative('event_natives'); | 8 var eventNatives = requireNative('event_natives'); |
| 7 var logging = requireNative('logging'); | 9 var logging = requireNative('logging'); |
| 8 var schemaRegistry = requireNative('schema_registry'); | 10 var schemaRegistry = requireNative('schema_registry'); |
| 9 var sendRequest = require('sendRequest').sendRequest; | 11 var sendRequest = require('sendRequest').sendRequest; |
| 10 var utils = require('utils'); | 12 var utils = require('utils'); |
| 11 var validate = require('schemaUtils').validate; | 13 var validate = require('schemaUtils').validate; |
| 12 | 14 |
| 13 // Schemas for the rule-style functions on the events API that | 15 // Schemas for the rule-style functions on the events API that |
| 14 // only need to be generated occasionally, so populate them lazily. | 16 // only need to be generated occasionally, so populate them lazily. |
| 15 var ruleFunctionSchemas = { | 17 var ruleFunctionSchemas = { |
| 18 __proto__: null, |
| 16 // These values are set lazily: | 19 // These values are set lazily: |
| 17 // addRules: {}, | 20 // addRules: {}, |
| 18 // getRules: {}, | 21 // getRules: {}, |
| 19 // removeRules: {} | 22 // removeRules: {} |
| 20 }; | 23 }; |
| 21 | 24 |
| 22 // This function ensures that |ruleFunctionSchemas| is populated. | 25 // This function ensures that |ruleFunctionSchemas| is populated. |
| 23 function ensureRuleSchemasLoaded() { | 26 function ensureRuleSchemasLoaded() { |
| 24 if (ruleFunctionSchemas.addRules) | 27 if (ruleFunctionSchemas.addRules) |
| 25 return; | 28 return; |
| 26 var eventsSchema = schemaRegistry.GetSchema("events"); | 29 var eventsSchema = schemaRegistry.GetSchema("events"); |
| 27 var eventType = utils.lookup(eventsSchema.types, 'id', 'events.Event'); | 30 var eventType = utils.lookup(eventsSchema.types, 'id', 'events.Event'); |
| 28 | 31 |
| 29 ruleFunctionSchemas.addRules = | 32 ruleFunctionSchemas.addRules = |
| 30 utils.lookup(eventType.functions, 'name', 'addRules'); | 33 utils.lookup(eventType.functions, 'name', 'addRules'); |
| 31 ruleFunctionSchemas.getRules = | 34 ruleFunctionSchemas.getRules = |
| 32 utils.lookup(eventType.functions, 'name', 'getRules'); | 35 utils.lookup(eventType.functions, 'name', 'getRules'); |
| 33 ruleFunctionSchemas.removeRules = | 36 ruleFunctionSchemas.removeRules = |
| 34 utils.lookup(eventType.functions, 'name', 'removeRules'); | 37 utils.lookup(eventType.functions, 'name', 'removeRules'); |
| 35 } | 38 } |
| 36 | 39 |
| 37 // A map of event names to the event object that is registered to that name. | 40 // A map of event names to the event object that is registered to that name. |
| 38 var attachedNamedEvents = {}; | 41 var attachedNamedEvents = {__proto__: null}; |
| 39 | 42 |
| 40 // A map of functions that massage event arguments before they are dispatched. | 43 // A map of functions that massage event arguments before they are dispatched. |
| 41 // Key is event name, value is function. | 44 // Key is event name, value is function. |
| 42 var eventArgumentMassagers = {}; | 45 var eventArgumentMassagers = {__proto__: null}; |
| 43 | 46 |
| 44 // An attachment strategy for events that aren't attached to the browser. | 47 // An attachment strategy for events that aren't attached to the browser. |
| 45 // This applies to events with the "unmanaged" option and events without | 48 // This applies to events with the "unmanaged" option and events without |
| 46 // names. | 49 // names. |
| 47 var NullAttachmentStrategy = function(event) { | 50 function NullAttachmentStrategy(event) { |
| 48 this.event_ = event; | 51 this.event_ = event; |
| 49 }; | 52 } |
| 53 $Object.setPrototypeOf(NullAttachmentStrategy.prototype, null); |
| 54 |
| 50 NullAttachmentStrategy.prototype.onAddedListener = | 55 NullAttachmentStrategy.prototype.onAddedListener = |
| 51 function(listener) { | 56 function(listener) { |
| 52 }; | 57 }; |
| 53 NullAttachmentStrategy.prototype.onRemovedListener = | 58 NullAttachmentStrategy.prototype.onRemovedListener = |
| 54 function(listener) { | 59 function(listener) { |
| 55 }; | 60 }; |
| 56 NullAttachmentStrategy.prototype.detach = function(manual) { | 61 NullAttachmentStrategy.prototype.detach = function(manual) { |
| 57 }; | 62 }; |
| 58 NullAttachmentStrategy.prototype.getListenersByIDs = function(ids) { | 63 NullAttachmentStrategy.prototype.getListenersByIDs = function(ids) { |
| 59 // |ids| is for filtered events only. | 64 // |ids| is for filtered events only. |
| 60 return this.event_.listeners; | 65 return this.event_.listeners; |
| 61 }; | 66 }; |
| 62 | 67 |
| 63 // Handles adding/removing/dispatching listeners for unfiltered events. | 68 // Handles adding/removing/dispatching listeners for unfiltered events. |
| 64 var UnfilteredAttachmentStrategy = function(event) { | 69 function UnfilteredAttachmentStrategy(event) { |
| 65 this.event_ = event; | 70 this.event_ = event; |
| 66 }; | 71 } |
| 72 $Object.setPrototypeOf(UnfilteredAttachmentStrategy.prototype, null); |
| 67 | 73 |
| 68 UnfilteredAttachmentStrategy.prototype.onAddedListener = | 74 UnfilteredAttachmentStrategy.prototype.onAddedListener = |
| 69 function(listener) { | 75 function(listener) { |
| 70 // Only attach / detach on the first / last listener removed. | 76 // Only attach / detach on the first / last listener removed. |
| 71 if (this.event_.listeners.length == 0) | 77 if (this.event_.listeners.length == 0) |
| 72 eventNatives.AttachEvent(this.event_.eventName); | 78 eventNatives.AttachEvent(this.event_.eventName); |
| 73 }; | 79 }; |
| 74 | 80 |
| 75 UnfilteredAttachmentStrategy.prototype.onRemovedListener = | 81 UnfilteredAttachmentStrategy.prototype.onRemovedListener = |
| 76 function(listener) { | 82 function(listener) { |
| 77 if (this.event_.listeners.length == 0) | 83 if (this.event_.listeners.length == 0) |
| 78 this.detach(true); | 84 this.detach(true); |
| 79 }; | 85 }; |
| 80 | 86 |
| 81 UnfilteredAttachmentStrategy.prototype.detach = function(manual) { | 87 UnfilteredAttachmentStrategy.prototype.detach = function(manual) { |
| 82 eventNatives.DetachEvent(this.event_.eventName, manual); | 88 eventNatives.DetachEvent(this.event_.eventName, manual); |
| 83 }; | 89 }; |
| 84 | 90 |
| 85 UnfilteredAttachmentStrategy.prototype.getListenersByIDs = function(ids) { | 91 UnfilteredAttachmentStrategy.prototype.getListenersByIDs = function(ids) { |
| 86 // |ids| is for filtered events only. | 92 // |ids| is for filtered events only. |
| 87 return this.event_.listeners; | 93 return this.event_.listeners; |
| 88 }; | 94 }; |
| 89 | 95 |
| 90 var FilteredAttachmentStrategy = function(event) { | 96 function FilteredAttachmentStrategy(event) { |
| 91 this.event_ = event; | 97 this.event_ = event; |
| 92 this.listenerMap_ = {}; | 98 this.listenerMap_ = {__proto__: null}; |
| 93 }; | 99 } |
| 100 $Object.setPrototypeOf(FilteredAttachmentStrategy.prototype, null); |
| 94 | 101 |
| 95 FilteredAttachmentStrategy.idToEventMap = {}; | 102 utils.defineProperty(FilteredAttachmentStrategy, 'idToEventMap', |
| 103 {__proto__: null}); |
| 96 | 104 |
| 97 FilteredAttachmentStrategy.prototype.onAddedListener = function(listener) { | 105 FilteredAttachmentStrategy.prototype.onAddedListener = function(listener) { |
| 98 var id = eventNatives.AttachFilteredEvent(this.event_.eventName, | 106 var id = eventNatives.AttachFilteredEvent(this.event_.eventName, |
| 99 listener.filters || {}); | 107 listener.filters || {}); |
| 100 if (id == -1) | 108 if (id == -1) |
| 101 throw new Error("Can't add listener"); | 109 throw new Error("Can't add listener"); |
| 102 listener.id = id; | 110 listener.id = id; |
| 103 this.listenerMap_[id] = listener; | 111 this.listenerMap_[id] = listener; |
| 104 FilteredAttachmentStrategy.idToEventMap[id] = this.event_; | 112 FilteredAttachmentStrategy.idToEventMap[id] = this.event_; |
| 105 }; | 113 }; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 124 }; | 132 }; |
| 125 | 133 |
| 126 FilteredAttachmentStrategy.prototype.getListenersByIDs = function(ids) { | 134 FilteredAttachmentStrategy.prototype.getListenersByIDs = function(ids) { |
| 127 var result = []; | 135 var result = []; |
| 128 for (var i = 0; i < ids.length; i++) | 136 for (var i = 0; i < ids.length; i++) |
| 129 $Array.push(result, this.listenerMap_[ids[i]]); | 137 $Array.push(result, this.listenerMap_[ids[i]]); |
| 130 return result; | 138 return result; |
| 131 }; | 139 }; |
| 132 | 140 |
| 133 function parseEventOptions(opt_eventOptions) { | 141 function parseEventOptions(opt_eventOptions) { |
| 134 function merge(dest, src) { | 142 return $Object.assign({ |
| 135 for (var k in src) { | 143 __proto__: null, |
| 136 if (!$Object.hasOwnProperty(dest, k)) { | 144 }, { |
| 137 dest[k] = src[k]; | |
| 138 } | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 var options = $Object.assign({}, opt_eventOptions || {}); | |
| 143 merge(options, { | |
| 144 // Event supports adding listeners with filters ("filtered events"), for | 145 // Event supports adding listeners with filters ("filtered events"), for |
| 145 // example as used in the webNavigation API. | 146 // example as used in the webNavigation API. |
| 146 // | 147 // |
| 147 // event.addListener(listener, [filter1, filter2]); | 148 // event.addListener(listener, [filter1, filter2]); |
| 148 supportsFilters: false, | 149 supportsFilters: false, |
| 149 | 150 |
| 150 // Events supports vanilla events. Most APIs use these. | 151 // Events supports vanilla events. Most APIs use these. |
| 151 // | 152 // |
| 152 // event.addListener(listener); | 153 // event.addListener(listener); |
| 153 supportsListeners: true, | 154 supportsListeners: true, |
| 154 | 155 |
| 155 // Event supports adding rules ("declarative events") rather than | 156 // Event supports adding rules ("declarative events") rather than |
| 156 // listeners, for example as used in the declarativeWebRequest API. | 157 // listeners, for example as used in the declarativeWebRequest API. |
| 157 // | 158 // |
| 158 // event.addRules([rule1, rule2]); | 159 // event.addRules([rule1, rule2]); |
| 159 supportsRules: false, | 160 supportsRules: false, |
| 160 | 161 |
| 161 // Event is unmanaged in that the browser has no knowledge of its | 162 // Event is unmanaged in that the browser has no knowledge of its |
| 162 // existence; it's never invoked, doesn't keep the renderer alive, and | 163 // existence; it's never invoked, doesn't keep the renderer alive, and |
| 163 // the bindings system has no knowledge of it. | 164 // the bindings system has no knowledge of it. |
| 164 // | 165 // |
| 165 // Both events created by user code (new chrome.Event()) and messaging | 166 // Both events created by user code (new chrome.Event()) and messaging |
| 166 // events are unmanaged, though in the latter case the browser *does* | 167 // events are unmanaged, though in the latter case the browser *does* |
| 167 // interact indirectly with them via IPCs written by hand. | 168 // interact indirectly with them via IPCs written by hand. |
| 168 unmanaged: false, | 169 unmanaged: false, |
| 169 }); | 170 }, opt_eventOptions); |
| 170 return options; | 171 } |
| 171 }; | |
| 172 | 172 |
| 173 // Event object. If opt_eventName is provided, this object represents | 173 // Event object. If opt_eventName is provided, this object represents |
| 174 // the unique instance of that named event, and dispatching an event | 174 // the unique instance of that named event, and dispatching an event |
| 175 // with that name will route through this object's listeners. Note that | 175 // with that name will route through this object's listeners. Note that |
| 176 // opt_eventName is required for events that support rules. | 176 // opt_eventName is required for events that support rules. |
| 177 // | 177 // |
| 178 // Example: | 178 // Example: |
| 179 // var Event = require('event_bindings').Event; | 179 // var Event = require('event_bindings').Event; |
| 180 // chrome.tabs.onChanged = new Event("tab-changed"); | 180 // chrome.tabs.onChanged = new Event("tab-changed"); |
| 181 // chrome.tabs.onChanged.addListener(function(data) { alert(data); }); | 181 // chrome.tabs.onChanged.addListener(function(data) { alert(data); }); |
| 182 // Event.dispatch("tab-changed", "hi"); | 182 // Event.dispatch("tab-changed", "hi"); |
| 183 // will result in an alert dialog that says 'hi'. | 183 // will result in an alert dialog that says 'hi'. |
| 184 // | 184 // |
| 185 // If opt_eventOptions exists, it is a dictionary that contains the boolean | 185 // If opt_eventOptions exists, it is a dictionary that contains the boolean |
| 186 // entries "supportsListeners" and "supportsRules". | 186 // entries "supportsListeners" and "supportsRules". |
| 187 // If opt_webViewInstanceId exists, it is an integer uniquely identifying a | 187 // If opt_webViewInstanceId exists, it is an integer uniquely identifying a |
| 188 // <webview> tag within the embedder. If it does not exist, then this is an | 188 // <webview> tag within the embedder. If it does not exist, then this is an |
| 189 // extension event rather than a <webview> event. | 189 // extension event rather than a <webview> event. |
| 190 var EventImpl = function(opt_eventName, opt_argSchemas, opt_eventOptions, | 190 function EventImpl(opt_eventName, opt_argSchemas, opt_eventOptions, |
| 191 opt_webViewInstanceId) { | 191 opt_webViewInstanceId) { |
| 192 this.eventName = opt_eventName; | 192 this.eventName = opt_eventName; |
| 193 this.argSchemas = opt_argSchemas; | 193 this.argSchemas = opt_argSchemas; |
| 194 this.listeners = []; | 194 this.listeners = []; |
| 195 this.eventOptions = parseEventOptions(opt_eventOptions); | 195 this.eventOptions = parseEventOptions(opt_eventOptions); |
| 196 this.webViewInstanceId = opt_webViewInstanceId || 0; | 196 this.webViewInstanceId = opt_webViewInstanceId || 0; |
| 197 | 197 |
| 198 if (!this.eventName) { | 198 if (!this.eventName) { |
| 199 if (this.eventOptions.supportsRules) | 199 if (this.eventOptions.supportsRules) |
| 200 throw new Error("Events that support rules require an event name."); | 200 throw new Error("Events that support rules require an event name."); |
| 201 // Events without names cannot be managed by the browser by definition | 201 // Events without names cannot be managed by the browser by definition |
| 202 // (the browser has no way of identifying them). | 202 // (the browser has no way of identifying them). |
| 203 this.eventOptions.unmanaged = true; | 203 this.eventOptions.unmanaged = true; |
| 204 } | 204 } |
| 205 | 205 |
| 206 // Track whether the event has been destroyed to help track down the cause | 206 // Track whether the event has been destroyed to help track down the cause |
| 207 // of http://crbug.com/258526. | 207 // of http://crbug.com/258526. |
| 208 // This variable will eventually hold the stack trace of the destroy call. | 208 // This variable will eventually hold the stack trace of the destroy call. |
| 209 // TODO(kalman): Delete this and replace with more sound logic that catches | 209 // TODO(kalman): Delete this and replace with more sound logic that catches |
| 210 // when events are used without being *attached*. | 210 // when events are used without being *attached*. |
| 211 this.destroyed = null; | 211 this.destroyed = null; |
| 212 | 212 |
| 213 if (this.eventOptions.unmanaged) | 213 if (this.eventOptions.unmanaged) |
| 214 this.attachmentStrategy = new NullAttachmentStrategy(this); | 214 this.attachmentStrategy = new NullAttachmentStrategy(this); |
| 215 else if (this.eventOptions.supportsFilters) | 215 else if (this.eventOptions.supportsFilters) |
| 216 this.attachmentStrategy = new FilteredAttachmentStrategy(this); | 216 this.attachmentStrategy = new FilteredAttachmentStrategy(this); |
| 217 else | 217 else |
| 218 this.attachmentStrategy = new UnfilteredAttachmentStrategy(this); | 218 this.attachmentStrategy = new UnfilteredAttachmentStrategy(this); |
| 219 }; | 219 } |
| 220 $Object.setPrototypeOf(EventImpl.prototype, null); |
| 220 | 221 |
| 221 // callback is a function(args, dispatch). args are the args we receive from | 222 // callback is a function(args, dispatch). args are the args we receive from |
| 222 // dispatchEvent(), and dispatch is a function(args) that dispatches args to | 223 // dispatchEvent(), and dispatch is a function(args) that dispatches args to |
| 223 // its listeners. | 224 // its listeners. |
| 224 function registerArgumentMassager(name, callback) { | 225 function registerArgumentMassager(name, callback) { |
| 225 if (eventArgumentMassagers[name]) | 226 if (eventArgumentMassagers[name]) |
| 226 throw new Error("Massager already registered for event: " + name); | 227 throw new Error("Massager already registered for event: " + name); |
| 227 eventArgumentMassagers[name] = callback; | 228 eventArgumentMassagers[name] = callback; |
| 228 } | 229 } |
| 229 | 230 |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 | 407 |
| 407 EventImpl.prototype.addRules = function(rules, opt_cb) { | 408 EventImpl.prototype.addRules = function(rules, opt_cb) { |
| 408 if (!this.eventOptions.supportsRules) | 409 if (!this.eventOptions.supportsRules) |
| 409 throw new Error("This event does not support rules."); | 410 throw new Error("This event does not support rules."); |
| 410 | 411 |
| 411 // Takes a list of JSON datatype identifiers and returns a schema fragment | 412 // Takes a list of JSON datatype identifiers and returns a schema fragment |
| 412 // that verifies that a JSON object corresponds to an array of only these | 413 // that verifies that a JSON object corresponds to an array of only these |
| 413 // data types. | 414 // data types. |
| 414 function buildArrayOfChoicesSchema(typesList) { | 415 function buildArrayOfChoicesSchema(typesList) { |
| 415 return { | 416 return { |
| 417 __proto__: null, |
| 416 'type': 'array', | 418 'type': 'array', |
| 417 'items': { | 419 'items': { |
| 418 'choices': $Array.map(typesList, function(el) {return {'$ref': el};}) | 420 __proto__: null, |
| 421 'choices': $Array.map(typesList, function(el) { |
| 422 return { |
| 423 __proto__: null, |
| 424 '$ref': el, |
| 425 }; |
| 426 }), |
| 419 } | 427 } |
| 420 }; | 428 }; |
| 421 }; | 429 } |
| 422 | 430 |
| 423 // Validate conditions and actions against specific schemas of this | 431 // Validate conditions and actions against specific schemas of this |
| 424 // event object type. | 432 // event object type. |
| 425 // |rules| is an array of JSON objects that follow the Rule type of the | 433 // |rules| is an array of JSON objects that follow the Rule type of the |
| 426 // declarative extension APIs. |conditions| is an array of JSON type | 434 // declarative extension APIs. |conditions| is an array of JSON type |
| 427 // identifiers that are allowed to occur in the conditions attribute of each | 435 // identifiers that are allowed to occur in the conditions attribute of each |
| 428 // rule. Likewise, |actions| is an array of JSON type identifiers that are | 436 // rule. Likewise, |actions| is an array of JSON type identifiers that are |
| 429 // allowed to occur in the actions attribute of each rule. | 437 // allowed to occur in the actions attribute of each rule. |
| 430 function validateRules(rules, conditions, actions) { | 438 function validateRules(rules, conditions, actions) { |
| 431 var conditionsSchema = buildArrayOfChoicesSchema(conditions); | 439 var conditionsSchema = buildArrayOfChoicesSchema(conditions); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 442 } | 450 } |
| 443 | 451 |
| 444 validateRules(rules, | 452 validateRules(rules, |
| 445 this.eventOptions.conditions, | 453 this.eventOptions.conditions, |
| 446 this.eventOptions.actions); | 454 this.eventOptions.actions); |
| 447 | 455 |
| 448 ensureRuleSchemasLoaded(); | 456 ensureRuleSchemasLoaded(); |
| 449 // We remove the first parameter from the validation to give the user more | 457 // We remove the first parameter from the validation to give the user more |
| 450 // meaningful error messages. | 458 // meaningful error messages. |
| 451 validate([this.webViewInstanceId, rules, opt_cb], | 459 validate([this.webViewInstanceId, rules, opt_cb], |
| 452 $Array.splice( | 460 $Array.slice(ruleFunctionSchemas.addRules.parameters, 1)); |
| 453 $Array.slice(ruleFunctionSchemas.addRules.parameters), 1)); | |
| 454 sendRequest( | 461 sendRequest( |
| 455 "events.addRules", | 462 "events.addRules", |
| 456 [this.eventName, this.webViewInstanceId, rules, opt_cb], | 463 [this.eventName, this.webViewInstanceId, rules, opt_cb], |
| 457 ruleFunctionSchemas.addRules.parameters); | 464 ruleFunctionSchemas.addRules.parameters); |
| 458 } | 465 } |
| 459 | 466 |
| 460 EventImpl.prototype.removeRules = function(ruleIdentifiers, opt_cb) { | 467 EventImpl.prototype.removeRules = function(ruleIdentifiers, opt_cb) { |
| 461 if (!this.eventOptions.supportsRules) | 468 if (!this.eventOptions.supportsRules) |
| 462 throw new Error("This event does not support rules."); | 469 throw new Error("This event does not support rules."); |
| 463 ensureRuleSchemasLoaded(); | 470 ensureRuleSchemasLoaded(); |
| 464 // We remove the first parameter from the validation to give the user more | 471 // We remove the first parameter from the validation to give the user more |
| 465 // meaningful error messages. | 472 // meaningful error messages. |
| 466 validate([this.webViewInstanceId, ruleIdentifiers, opt_cb], | 473 validate([this.webViewInstanceId, ruleIdentifiers, opt_cb], |
| 467 $Array.splice( | 474 $Array.slice(ruleFunctionSchemas.removeRules.parameters, 1)); |
| 468 $Array.slice(ruleFunctionSchemas.removeRules.parameters), 1)); | |
| 469 sendRequest("events.removeRules", | 475 sendRequest("events.removeRules", |
| 470 [this.eventName, | 476 [this.eventName, |
| 471 this.webViewInstanceId, | 477 this.webViewInstanceId, |
| 472 ruleIdentifiers, | 478 ruleIdentifiers, |
| 473 opt_cb], | 479 opt_cb], |
| 474 ruleFunctionSchemas.removeRules.parameters); | 480 ruleFunctionSchemas.removeRules.parameters); |
| 475 } | 481 } |
| 476 | 482 |
| 477 EventImpl.prototype.getRules = function(ruleIdentifiers, cb) { | 483 EventImpl.prototype.getRules = function(ruleIdentifiers, cb) { |
| 478 if (!this.eventOptions.supportsRules) | 484 if (!this.eventOptions.supportsRules) |
| 479 throw new Error("This event does not support rules."); | 485 throw new Error("This event does not support rules."); |
| 480 ensureRuleSchemasLoaded(); | 486 ensureRuleSchemasLoaded(); |
| 481 // We remove the first parameter from the validation to give the user more | 487 // We remove the first parameter from the validation to give the user more |
| 482 // meaningful error messages. | 488 // meaningful error messages. |
| 483 validate([this.webViewInstanceId, ruleIdentifiers, cb], | 489 validate([this.webViewInstanceId, ruleIdentifiers, cb], |
| 484 $Array.splice( | 490 $Array.slice(ruleFunctionSchemas.getRules.parameters, 1)); |
| 485 $Array.slice(ruleFunctionSchemas.getRules.parameters), 1)); | |
| 486 | 491 |
| 487 sendRequest( | 492 sendRequest( |
| 488 "events.getRules", | 493 "events.getRules", |
| 489 [this.eventName, this.webViewInstanceId, ruleIdentifiers, cb], | 494 [this.eventName, this.webViewInstanceId, ruleIdentifiers, cb], |
| 490 ruleFunctionSchemas.getRules.parameters); | 495 ruleFunctionSchemas.getRules.parameters); |
| 491 } | 496 } |
| 492 | 497 |
| 493 function Event() { | 498 function Event() { |
| 494 privates(Event).constructPrivate(this, arguments); | 499 privates(Event).constructPrivate(this, arguments); |
| 495 } | 500 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 506 'getRules', | 511 'getRules', |
| 507 ], | 512 ], |
| 508 }); | 513 }); |
| 509 | 514 |
| 510 // NOTE: Event is (lazily) exposed as chrome.Event from dispatcher.cc. | 515 // NOTE: Event is (lazily) exposed as chrome.Event from dispatcher.cc. |
| 511 exports.$set('Event', Event); | 516 exports.$set('Event', Event); |
| 512 | 517 |
| 513 exports.$set('dispatchEvent', dispatchEvent); | 518 exports.$set('dispatchEvent', dispatchEvent); |
| 514 exports.$set('parseEventOptions', parseEventOptions); | 519 exports.$set('parseEventOptions', parseEventOptions); |
| 515 exports.$set('registerArgumentMassager', registerArgumentMassager); | 520 exports.$set('registerArgumentMassager', registerArgumentMassager); |
| OLD | NEW |