forked from mirrors/gecko-dev
		
	bug 1523104: remote: introduce MessagePromise sync primitive; r=ochameau
Makes the code slightly more pleasant to read.
This commit is contained in:
		
							parent
							
								
									8a01f77453
								
							
						
					
					
						commit
						1601819536
					
				
					 2 changed files with 30 additions and 9 deletions
				
			
		|  | @ -7,6 +7,7 @@ | ||||||
| var EXPORTED_SYMBOLS = [ | var EXPORTED_SYMBOLS = [ | ||||||
|   "DOMContentLoadedPromise", |   "DOMContentLoadedPromise", | ||||||
|   "EventPromise", |   "EventPromise", | ||||||
|  |   "MessagePromise", | ||||||
| ]; | ]; | ||||||
| 
 | 
 | ||||||
| const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); | const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); | ||||||
|  | @ -74,3 +75,28 @@ function DOMContentLoadedPromise(window, options = {mozSystemGroup: true}) { | ||||||
|   } |   } | ||||||
|   return new EventPromise(window, "DOMContentLoaded", options); |   return new EventPromise(window, "DOMContentLoaded", options); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Awaits a single IPC message. | ||||||
|  |  * | ||||||
|  |  * @param {nsIMessageSender} target | ||||||
|  |  * @param {string} name | ||||||
|  |  * | ||||||
|  |  * @return {Promise} | ||||||
|  |  * | ||||||
|  |  * @throws {TypeError} | ||||||
|  |  *     If target is not an nsIMessageSender. | ||||||
|  |  */ | ||||||
|  | function MessagePromise(target, name) { | ||||||
|  |   if (!(target instanceof Ci.nsIMessageSender)) { | ||||||
|  |     throw new TypeError(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   return new Promise(resolve => { | ||||||
|  |     const onMessage = (...args) => { | ||||||
|  |       target.removeMessageListener(name, onMessage); | ||||||
|  |       resolve(...args); | ||||||
|  |     }; | ||||||
|  |     target.addMessageListener(name, onMessage); | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ | ||||||
| 
 | 
 | ||||||
| var EXPORTED_SYMBOLS = ["Targets"]; | var EXPORTED_SYMBOLS = ["Targets"]; | ||||||
| 
 | 
 | ||||||
|  | const {MessagePromise} = ChromeUtils.import("chrome://remote/content/Sync.jsm"); | ||||||
| const {Target} = ChromeUtils.import("chrome://remote/content/Target.jsm"); | const {Target} = ChromeUtils.import("chrome://remote/content/Target.jsm"); | ||||||
| 
 | 
 | ||||||
| class Targets { | class Targets { | ||||||
|  | @ -21,16 +22,10 @@ class Targets { | ||||||
|     // whereas it is asynchronously set by the custom element class.
 |     // whereas it is asynchronously set by the custom element class.
 | ||||||
|     // At least ensure that this property is set before instantiating the target.
 |     // At least ensure that this property is set before instantiating the target.
 | ||||||
|     if (!browser.browsingContext) { |     if (!browser.browsingContext) { | ||||||
|       await new Promise(resolve => { |       await new MessagePromise(browser.messageManager, "Browser:Init"); | ||||||
|         const onInit = () => { |  | ||||||
|           browser.messageManager.removeMessageListener("Browser:Init", onInit); |  | ||||||
|           resolve(); |  | ||||||
|         }; |  | ||||||
|         browser.messageManager.addMessageListener("Browser:Init", onInit); |  | ||||||
|       }); |  | ||||||
|     } |     } | ||||||
|     const target = new Target(browser); |  | ||||||
| 
 | 
 | ||||||
|  |     const target = new Target(browser); | ||||||
|     target.connect(); |     target.connect(); | ||||||
|     this._targets.set(target.id, target); |     this._targets.set(target.id, target); | ||||||
|   } |   } | ||||||
|  | @ -41,8 +36,8 @@ class Targets { | ||||||
|     if (!browser.browsingContext) { |     if (!browser.browsingContext) { | ||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     let target = this._targets.get(browser.browsingContext.id); |  | ||||||
| 
 | 
 | ||||||
|  |     const target = this._targets.get(browser.browsingContext.id); | ||||||
|     if (target) { |     if (target) { | ||||||
|       target.disconnect(); |       target.disconnect(); | ||||||
|       this._targets.delete(target.id); |       this._targets.delete(target.id); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Andreas Tolfsen
						Andreas Tolfsen