RulesetsParent.sys.mjs (2432B)
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 import { 6 OnionAliasStore, 7 OnionAliasStoreTopics, 8 } from "moz-src:///browser/components/onionservices/OnionAliasStore.sys.mjs"; 9 10 const kShowWarningPref = "torbrowser.rulesets.show_warning"; 11 12 /** 13 * This class relays the changes the user's changes from about:rulesets to the 14 * rulesets database. 15 */ 16 export class RulesetsParent extends JSWindowActorParent { 17 constructor(...args) { 18 super(...args); 19 20 const self = this; 21 this.observer = { 22 observe(aSubject, aTopic) { 23 const obj = aSubject?.wrappedJSObject; 24 if (aTopic === OnionAliasStoreTopics.ChannelsChanged && obj) { 25 self.sendAsyncMessage("rulesets:channels-change", obj); 26 } 27 }, 28 }; 29 Services.obs.addObserver( 30 this.observer, 31 OnionAliasStoreTopics.ChannelsChanged 32 ); 33 } 34 35 didDestroy() { 36 Services.obs.removeObserver( 37 this.observer, 38 OnionAliasStoreTopics.ChannelsChanged 39 ); 40 } 41 42 async receiveMessage(message) { 43 switch (message.name) { 44 // RPMSendAsyncMessage 45 case "rulesets:delete-channel": 46 OnionAliasStore.deleteChannel(message.data); 47 break; 48 case "rulesets:enable-channel": 49 OnionAliasStore.enableChannel(message.data.name, message.data.enabled); 50 break; 51 case "rulesets:set-show-warning": 52 Services.prefs.setBoolPref(kShowWarningPref, message.data); 53 break; 54 // RPMSendQuery 55 case "rulesets:get-channels": 56 return OnionAliasStore.getChannels(); 57 case "rulesets:get-init-args": 58 return { 59 showWarning: Services.prefs.getBoolPref(kShowWarningPref, true), 60 }; 61 case "rulesets:set-channel": { 62 const ch = await OnionAliasStore.setChannel(message.data); 63 return ch; 64 } 65 case "rulesets:update-channel": 66 // We need to catch any error in this way, because in case of an 67 // exception, RPMSendQuery does not return on the other side 68 try { 69 const channel = await OnionAliasStore.updateChannel(message.data); 70 return channel; 71 } catch (err) { 72 console.error("Cannot update the channel", err); 73 return { error: err.toString() }; 74 } 75 } 76 return undefined; 77 } 78 }