test_activeStatus.js (5733B)
1 /* 2 * Test for status handling in Form Autofill Parent. 3 */ 4 5 "use strict"; 6 7 let FormAutofillStatus; 8 9 add_setup(async () => { 10 ({ FormAutofillStatus } = ChromeUtils.importESModule( 11 "resource://autofill/FormAutofillParent.sys.mjs" 12 )); 13 }); 14 15 add_task(async function test_activeStatus_init() { 16 sinon.spy(FormAutofillStatus, "updateStatus"); 17 18 // Default status is null before initialization 19 Assert.equal(FormAutofillStatus._active, null); 20 Assert.equal(Services.ppmm.sharedData.get("FormAutofill:enabled"), undefined); 21 22 FormAutofillStatus.init(); 23 // init shouldn't call updateStatus since that requires storage which will 24 // lead to startup time regressions. 25 Assert.equal(FormAutofillStatus.updateStatus.called, false); 26 Assert.equal(Services.ppmm.sharedData.get("FormAutofill:enabled"), undefined); 27 28 // Initialize profile storage 29 await FormAutofillStatus.formAutofillStorage.initialize(); 30 await FormAutofillStatus.updateSavedFieldNames(); 31 // Upon first initializing profile storage, status should be computed. 32 Assert.equal(FormAutofillStatus.updateStatus.called, true); 33 Assert.equal(Services.ppmm.sharedData.get("FormAutofill:enabled"), false); 34 35 FormAutofillStatus.uninit(); 36 }); 37 38 add_task(async function test_activeStatus_observe() { 39 FormAutofillStatus.init(); 40 sinon.stub(FormAutofillStatus, "computeStatus"); 41 sinon.spy(FormAutofillStatus, "onStatusChanged"); 42 43 // _active = _computeStatus() => No need to trigger _onStatusChanged 44 FormAutofillStatus._active = true; 45 FormAutofillStatus.computeStatus.returns(true); 46 FormAutofillStatus.observe( 47 null, 48 "nsPref:changed", 49 "extensions.formautofill.addresses.enabled" 50 ); 51 FormAutofillStatus.observe( 52 null, 53 "nsPref:changed", 54 "extensions.formautofill.creditCards.enabled" 55 ); 56 Assert.equal(FormAutofillStatus.onStatusChanged.called, false); 57 58 // _active != computeStatus() => Need to trigger onStatusChanged 59 FormAutofillStatus.computeStatus.returns(false); 60 FormAutofillStatus.onStatusChanged.resetHistory(); 61 FormAutofillStatus.observe( 62 null, 63 "nsPref:changed", 64 "extensions.formautofill.addresses.enabled" 65 ); 66 FormAutofillStatus.observe( 67 null, 68 "nsPref:changed", 69 "extensions.formautofill.creditCards.enabled" 70 ); 71 Assert.equal(FormAutofillStatus.onStatusChanged.called, true); 72 73 // profile changed => Need to trigger _onStatusChanged 74 await Promise.all( 75 ["add", "update", "remove", "reconcile"].map(async event => { 76 FormAutofillStatus.computeStatus.returns(!FormAutofillStatus._active); 77 FormAutofillStatus.onStatusChanged.resetHistory(); 78 await FormAutofillStatus.observe( 79 null, 80 "formautofill-storage-changed", 81 event 82 ); 83 Assert.equal(FormAutofillStatus.onStatusChanged.called, true); 84 }) 85 ); 86 87 // profile metadata updated => No need to trigger onStatusChanged 88 FormAutofillStatus.computeStatus.returns(!FormAutofillStatus._active); 89 FormAutofillStatus.onStatusChanged.resetHistory(); 90 await FormAutofillStatus.observe( 91 null, 92 "formautofill-storage-changed", 93 "notifyUsed" 94 ); 95 Assert.equal(FormAutofillStatus.onStatusChanged.called, false); 96 97 FormAutofillStatus.computeStatus.restore(); 98 }); 99 100 add_task(async function test_activeStatus_computeStatus() { 101 registerCleanupFunction(function cleanup() { 102 Services.prefs.clearUserPref("extensions.formautofill.addresses.enabled"); 103 Services.prefs.clearUserPref("extensions.formautofill.creditCards.enabled"); 104 }); 105 106 sinon.stub( 107 FormAutofillStatus.formAutofillStorage.addresses, 108 "getSavedFieldNames" 109 ); 110 FormAutofillStatus.formAutofillStorage.addresses.getSavedFieldNames.returns( 111 Promise.resolve(new Set()) 112 ); 113 sinon.stub( 114 FormAutofillStatus.formAutofillStorage.creditCards, 115 "getSavedFieldNames" 116 ); 117 FormAutofillStatus.formAutofillStorage.creditCards.getSavedFieldNames.returns( 118 Promise.resolve(new Set()) 119 ); 120 121 // pref is enabled and profile is empty. 122 Services.prefs.setBoolPref("extensions.formautofill.addresses.enabled", true); 123 Services.prefs.setBoolPref( 124 "extensions.formautofill.creditCards.enabled", 125 true 126 ); 127 Assert.equal(FormAutofillStatus.computeStatus(), false); 128 129 // pref is disabled and profile is empty. 130 Services.prefs.setBoolPref( 131 "extensions.formautofill.addresses.enabled", 132 false 133 ); 134 Services.prefs.setBoolPref( 135 "extensions.formautofill.creditCards.enabled", 136 false 137 ); 138 Assert.equal(FormAutofillStatus.computeStatus(), false); 139 140 FormAutofillStatus.formAutofillStorage.addresses.getSavedFieldNames.returns( 141 Promise.resolve(new Set(["given-name"])) 142 ); 143 await FormAutofillStatus.observe(null, "formautofill-storage-changed", "add"); 144 145 // pref is enabled and profile is not empty. 146 Services.prefs.setBoolPref("extensions.formautofill.addresses.enabled", true); 147 Assert.equal(FormAutofillStatus.computeStatus(), true); 148 149 // pref is partial enabled and profile is not empty. 150 Services.prefs.setBoolPref("extensions.formautofill.addresses.enabled", true); 151 Services.prefs.setBoolPref( 152 "extensions.formautofill.creditCards.enabled", 153 false 154 ); 155 Assert.equal(FormAutofillStatus.computeStatus(), true); 156 Services.prefs.setBoolPref( 157 "extensions.formautofill.addresses.enabled", 158 false 159 ); 160 Services.prefs.setBoolPref( 161 "extensions.formautofill.creditCards.enabled", 162 true 163 ); 164 Assert.equal(FormAutofillStatus.computeStatus(), true); 165 166 // pref is disabled and profile is not empty. 167 Services.prefs.setBoolPref( 168 "extensions.formautofill.addresses.enabled", 169 false 170 ); 171 Services.prefs.setBoolPref( 172 "extensions.formautofill.creditCards.enabled", 173 false 174 ); 175 Assert.equal(FormAutofillStatus.computeStatus(), false); 176 });