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 = [ | ||||
|   "DOMContentLoadedPromise", | ||||
|   "EventPromise", | ||||
|   "MessagePromise", | ||||
| ]; | ||||
| 
 | ||||
| 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); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * 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"]; | ||||
| 
 | ||||
| const {MessagePromise} = ChromeUtils.import("chrome://remote/content/Sync.jsm"); | ||||
| const {Target} = ChromeUtils.import("chrome://remote/content/Target.jsm"); | ||||
| 
 | ||||
| class Targets { | ||||
|  | @ -21,16 +22,10 @@ class Targets { | |||
|     // whereas it is asynchronously set by the custom element class.
 | ||||
|     // At least ensure that this property is set before instantiating the target.
 | ||||
|     if (!browser.browsingContext) { | ||||
|       await new Promise(resolve => { | ||||
|         const onInit = () => { | ||||
|           browser.messageManager.removeMessageListener("Browser:Init", onInit); | ||||
|           resolve(); | ||||
|         }; | ||||
|         browser.messageManager.addMessageListener("Browser:Init", onInit); | ||||
|       }); | ||||
|       await new MessagePromise(browser.messageManager, "Browser:Init"); | ||||
|     } | ||||
|     const target = new Target(browser); | ||||
| 
 | ||||
|     const target = new Target(browser); | ||||
|     target.connect(); | ||||
|     this._targets.set(target.id, target); | ||||
|   } | ||||
|  | @ -41,8 +36,8 @@ class Targets { | |||
|     if (!browser.browsingContext) { | ||||
|       return; | ||||
|     } | ||||
|     let target = this._targets.get(browser.browsingContext.id); | ||||
| 
 | ||||
|     const target = this._targets.get(browser.browsingContext.id); | ||||
|     if (target) { | ||||
|       target.disconnect(); | ||||
|       this._targets.delete(target.id); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Andreas Tolfsen
						Andreas Tolfsen