declined.sys.mjs (2611B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 /** 6 * This file contains code for maintaining the set of declined engines, 7 * in conjunction with EngineManager. 8 */ 9 10 import { Log } from "resource://gre/modules/Log.sys.mjs"; 11 12 import { CommonUtils } from "resource://services-common/utils.sys.mjs"; 13 import { Observers } from "resource://services-common/observers.sys.mjs"; 14 15 export var DeclinedEngines = function (service) { 16 this._log = Log.repository.getLogger("Sync.Declined"); 17 this._log.manageLevelFromPref("services.sync.log.logger.declined"); 18 19 this.service = service; 20 }; 21 22 DeclinedEngines.prototype = { 23 updateDeclined(meta, engineManager = this.service.engineManager) { 24 let enabled = new Set(engineManager.getEnabled().map(e => e.name)); 25 let known = new Set(engineManager.getAll().map(e => e.name)); 26 let remoteDeclined = new Set(meta.payload.declined || []); 27 let localDeclined = new Set(engineManager.getDeclined()); 28 29 this._log.debug( 30 "Handling remote declined: " + JSON.stringify([...remoteDeclined]) 31 ); 32 this._log.debug( 33 "Handling local declined: " + JSON.stringify([...localDeclined]) 34 ); 35 36 // Any engines that are locally enabled should be removed from the remote 37 // declined list. 38 // 39 // Any engines that are locally declined should be added to the remote 40 // declined list. 41 let newDeclined = CommonUtils.union( 42 localDeclined, 43 CommonUtils.difference(remoteDeclined, enabled) 44 ); 45 46 // If our declined set has changed, put it into the meta object and mark 47 // it as changed. 48 let declinedChanged = !CommonUtils.setEqual(newDeclined, remoteDeclined); 49 this._log.debug("Declined changed? " + declinedChanged); 50 if (declinedChanged) { 51 meta.changed = true; 52 meta.payload.declined = [...newDeclined]; 53 } 54 55 // Update the engine manager regardless. 56 engineManager.setDeclined(newDeclined); 57 58 // Any engines that are locally known, locally disabled, and not remotely 59 // or locally declined, are candidates for enablement. 60 let undecided = CommonUtils.difference( 61 CommonUtils.difference(known, enabled), 62 newDeclined 63 ); 64 if (undecided.size) { 65 let subject = { 66 declined: newDeclined, 67 enabled, 68 known, 69 undecided, 70 }; 71 CommonUtils.nextTick(() => { 72 Observers.notify("weave:engines:notdeclined", subject); 73 }); 74 } 75 76 return declinedChanged; 77 }, 78 };