Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Custom bindings for the downloads API. | |
| 6 | |
| 7 var downloadsNatives = requireNative('downloads'); | |
| 8 var chromeHidden = requireNative('chrome_hidden').GetChromeHidden(); | |
| 9 var sendRequest = require('sendRequest').sendRequest; | |
| 10 var validate = require('schemaUtils').validate; | |
| 11 | |
| 12 function DownloadsEvent(eventName, opt_argSchemas, opt_extraArgSchemas, | |
| 13 opt_eventOptions) { | |
| 14 if (typeof eventName != 'string') | |
| 15 throw new Error('chrome.DownloadsEvent requires an event name.'); | |
| 16 | |
| 17 this.eventName_ = eventName; | |
| 18 this.determiningFilename_ = (eventName == 'downloads.onDeterminingFilename'); | |
| 19 this.argSchemas_ = opt_argSchemas; | |
| 20 this.extraArgSchemas_ = opt_extraArgSchemas; | |
| 21 this.eventOptions_ = chromeHidden.parseEventOptions(opt_eventOptions); | |
| 22 if (this.determiningFilename_) { | |
| 23 this.subEvents_ = []; | |
| 24 } else { | |
| 25 this.actualEvent_ = | |
| 26 new chrome.Event(eventName, opt_argSchemas, opt_eventOptions); | |
| 27 } | |
| 28 } | |
| 29 | |
| 30 // Test if the given callback is registered for this event. | |
| 31 DownloadsEvent.prototype.hasListener = function(cb) { | |
| 32 if (!this.eventOptions_.supportsListeners) | |
| 33 throw new Error('This event does not support listeners.'); | |
| 34 return this.findListener_(cb) > -1; | |
| 35 }; | |
| 36 | |
| 37 // Test if any callbacks are registered fur thus event. | |
|
vabr (Chromium)
2013/01/11 12:43:40
possibly a typo: "fur thus"
benjhayden
2013/01/11 21:21:27
Done.
| |
| 38 DownloadsEvent.prototype.hasListeners = function() { | |
| 39 if (!this.eventOptions_.supportsListeners) | |
| 40 throw new Error('This event does not support listeners.'); | |
| 41 return (this.determiningFilename_ ? (this.subEvents_.length > 0) : | |
| 42 this.actualEvent_.hasListeners()); | |
| 43 }; | |
| 44 | |
| 45 DownloadsEvent.prototype.addListener = function(cb) { | |
| 46 if (!this.eventOptions_.supportsListeners) | |
| 47 throw new Error('This event does not support listeners.'); | |
| 48 if (!this.determiningFilename_) { | |
| 49 this.actualEvent_.addListener(cb); | |
| 50 return; | |
| 51 } | |
| 52 var entry = {callback: cb}; | |
| 53 entry.determiner_id = downloadsNatives.GetFilenameDeterminerId(); | |
| 54 entry.subEvent = new chrome.Event( | |
| 55 this.eventName_ + '/' + entry.determiner_id, this.argSchemas_); | |
| 56 chromeHidden.internalAPIs.downloadsInternal.addFilenameDeterminer( | |
| 57 entry.determiner_id); | |
| 58 entry.subEventCallback = function() { | |
| 59 var download_id = arguments[0].id; | |
| 60 try { | |
| 61 var result = cb.apply(null, arguments); | |
| 62 if (typeof(result) == 'object' && result.filename) { | |
|
battre
2013/01/11 14:29:37
only if you pass a filename, you allow to set over
benjhayden
2013/01/11 21:21:27
Done.
| |
| 63 chromeHidden.internalAPIs.downloadsInternal.determineFilename( | |
| 64 entry.determiner_id, | |
| 65 download_id, | |
| 66 result.filename, | |
| 67 result.overwrite || false); | |
| 68 } else { | |
| 69 chromeHidden.internalAPIs.downloadsInternal.determineFilename( | |
| 70 entry.determiner_id, | |
| 71 download_id); | |
| 72 } | |
| 73 } catch (e) { | |
| 74 chromeHidden.internalAPIs.downloadsInternal.determineFilename( | |
| 75 entry.determiner_id, | |
| 76 download_id); | |
| 77 throw e; | |
| 78 } | |
| 79 }; | |
| 80 this.subEvents_.push(entry); | |
| 81 entry.subEvent.addListener(entry.subEventCallback); | |
| 82 }; | |
| 83 | |
| 84 DownloadsEvent.prototype.removeListener = function(cb) { | |
| 85 if (!this.eventOptions_.supportsListeners) | |
| 86 throw new Error('This event does not support listeners.'); | |
| 87 if (!this.determiningFilename_) { | |
| 88 this.actualEvent_.removeListener(cb); | |
| 89 return; | |
| 90 } | |
| 91 var idx; | |
| 92 while ((idx = this.findListener_(cb)) >= 0) { | |
| 93 var e = this.subEvents_[idx]; | |
| 94 e.subEvent.removeListener(e.subEventCallback); | |
| 95 chromeHidden.internalAPIs.downloadsInternal.removeFilenameDeterminer( | |
| 96 e.determiner_id); | |
| 97 if (e.subEvent.hasListeners()) { | |
| 98 console.error('Internal error: subEvent has orphaned listeners.'); | |
| 99 } | |
| 100 this.subEvents_.splice(idx, 1); | |
| 101 } | |
| 102 }; | |
| 103 | |
| 104 DownloadsEvent.prototype.findListener_ = function(cb) { | |
| 105 if (!this.determiningFilename_) { | |
| 106 return this.actualEvent_.findListener(cb); | |
| 107 } | |
| 108 for (var i in this.subEvents_) { | |
| 109 var e = this.subEvents_[i]; | |
| 110 if (e.callback === cb) { | |
| 111 if (e.subEvent.findListener_(e.subEventCallback) > -1) | |
| 112 return i; | |
| 113 console.error('Internal error: subEvent has no callback.'); | |
| 114 } | |
| 115 } | |
| 116 | |
| 117 return -1; | |
| 118 }; | |
| 119 | |
| 120 DownloadsEvent.prototype.addRules = function(rules, opt_cb) { | |
| 121 if (!this.eventOptions_.supportsRules) | |
| 122 throw new Error('This event does not support rules.'); | |
| 123 this.eventForRules_.addRules(rules, opt_cb); | |
| 124 } | |
| 125 | |
| 126 DownloadsEvent.prototype.removeRules = function(ruleIdentifiers, opt_cb) { | |
| 127 if (!this.eventOptions_.supportsRules) | |
| 128 throw new Error('This event does not support rules.'); | |
| 129 this.eventForRules_.removeRules(ruleIdentifiers, opt_cb); | |
| 130 } | |
| 131 | |
| 132 DownloadsEvent.prototype.getRules = function(ruleIdentifiers, cb) { | |
| 133 if (!this.eventOptions_.supportsRules) | |
| 134 throw new Error('This event does not support rules.'); | |
| 135 this.eventForRules_.getRules(ruleIdentifiers, cb); | |
| 136 } | |
| 137 | |
| 138 chromeHidden.registerCustomEvent('downloads', DownloadsEvent); | |
| OLD | NEW |