Files
tubestation/waterfox/browser/components/sidebar/experiments/prefs.js
2025-11-06 14:13:52 +00:00

166 lines
6.5 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Original: https://github.com/mozilla-extensions/webcompat-addon/blob/main/src/experiment-apis/aboutConfigPrefs.js */
'use strict';
const AboutPreferencesWatcher = {
BASE_URL: null, // this need to be replaced with "moz-extension://..../"
BASE_PREF: 'browser.sidebar.', // null,
onPrefChanged(name) {
switch (name) {
case 'browser.tabs.selectOwnerOnClose':
Services.prefs.setBoolPref(`${this.BASE_PREF}simulateSelectOwnerOnClose`, Services.prefs.getBoolPref(name));
break;
case 'browser.tabs.loadInBackground':
Services.prefs.setBoolPref(`${this.BASE_PREF}simulateTabsLoadInBackgroundInverted`, Services.prefs.getBoolPref(name));
break;
case 'browser.tabs.warnOnClose':
Services.prefs.setBoolPref(`${this.BASE_PREF}warnOnCloseTabs`, Services.prefs.getBoolPref(name));
break;
case 'browser.tabs.searchclipboardfor.middleclick':
Services.prefs.setBoolPref(`${this.BASE_PREF}middleClickPasteURLOnNewTabButton`, Services.prefs.getBoolPref(name));
break;
case 'browser.tabs.insertAfterCurrent':
case 'browser.tabs.insertRelatedAfterCurrent': {
const insertAfterCurrent = Services.prefs.getBoolPref('browser.tabs.insertAfterCurrent');
const insertRelatedAfterCurrent = Services.prefs.getBoolPref('browser.tabs.insertRelatedAfterCurrent');
const useTree = (
Services.prefs.getBoolPref(`${this.BASE_PREF}autoAttach`, false) &&
Services.prefs.getBoolPref(`${this.BASE_PREF}syncParentTabAndOpenerTab`, false)
);
Services.prefs.setStringPref(`${this.BASE_PREF}autoAttachOnOpenedWithOwner`,
!useTree ? -1 :
insertRelatedAfterCurrent ? 5 :
insertAfterCurrent ? 6 :
0);
Services.prefs.setStringPref(`${this.BASE_PREF}insertNewTabFromPinnedTabAt`,
!useTree ? -1 :
insertRelatedAfterCurrent ? 3 :
insertAfterCurrent ? 0 :
1);
Services.prefs.setStringPref(`${this.BASE_PREF}insertNewTabFromFirefoxViewAt`,
!useTree ? -1 :
insertRelatedAfterCurrent ? 3 :
insertAfterCurrent ? 0 :
1);
}; break;
}
},
// as an XPCOM component...
classDescription: 'Waterfox Chrome Window Watcher for about:preferences',
contractID: '@waterfox.net/chrome-window-watche-about-preferences;1',
classID: Components.ID('{c8a990cf-b9a3-4b4c-829c-a1dfc5753527}'),
QueryInterface: ChromeUtils.generateQI([
'nsIObserver',
'nsISupportsWeakReference',
]),
// nsIObserver
observe(subject, topic, data) {
switch (topic) {
case 'nsPref:changed':
this.onPrefChanged(data);
break;
}
},
createInstance(iid) {
return this.QueryInterface(iid);
},
};
this.prefs = class extends ExtensionAPI {
getAPI(context) {
const EventManager = ExtensionCommon.EventManager;
const extensionIDBase = context.extension.id.split('@')[0];
AboutPreferencesWatcher.BASE_URL = context.extension.baseURL;
// Synchronize simulation configs with the browser's preferences
for (const [source, dest] of Object.entries({
'browser.tabs.selectOwnerOnClose': `${AboutPreferencesWatcher.BASE_PREF}simulateSelectOwnerOnClose`,
'browser.tabs.loadInBackground': `${AboutPreferencesWatcher.BASE_PREF}simulateTabsLoadInBackgroundInverted`,
'browser.tabs.warnOnClose': `${AboutPreferencesWatcher.BASE_PREF}warnOnCloseTabs`,
'browser.tabs.searchclipboardfor.middleclick': `${AboutPreferencesWatcher.BASE_PREF}middleClickPasteURLOnNewTabButton`,
})) {
Services.prefs.setBoolPref(dest, Services.prefs.getBoolPref(source));
}
Services.prefs.addObserver('browser.tabs.', AboutPreferencesWatcher);
AboutPreferencesWatcher.onPrefChanged('browser.tabs.insertAfterCurrent');
return {
prefs: {
onChanged: new EventManager({
context,
name: 'prefs.onChanged',
register: (fire) => {
const observe = (_subject, _topic, data) => {
fire.async(data.replace(AboutPreferencesWatcher.BASE_PREF, '')).catch(() => {}); // ignore Message Manager disconnects
};
Services.prefs.addObserver(AboutPreferencesWatcher.BASE_PREF, observe);
return () => {
Services.prefs.removeObserver(AboutPreferencesWatcher.BASE_PREF, observe);
};
},
}).api(),
async getBoolValue(name, defaultValue = false) {
try {
return Services.prefs.getBoolPref(`${AboutPreferencesWatcher.BASE_PREF}${name}`, defaultValue);
}
catch(_error) {
return defaultValue;
}
},
async setBoolValue(name, value) {
Services.prefs.setBoolPref(`${AboutPreferencesWatcher.BASE_PREF}${name}`, value);
},
async setDefaultBoolValue(name, value) {
Services.prefs.getDefaultBranch(null).setBoolPref(`${AboutPreferencesWatcher.BASE_PREF}${name}`, value);
},
async getStringValue(name, defaultValue = '') {
try {
return Services.prefs.getStringPref(`${AboutPreferencesWatcher.BASE_PREF}${name}`, defaultValue);
}
catch(_error) {
return defaultValue;
}
},
async setStringValue(name, value) {
Services.prefs.setStringPref(`${AboutPreferencesWatcher.BASE_PREF}${name}`, value);
},
async setDefaultStringValue(name, value) {
Services.prefs.getDefaultBranch(null).setStringPref(`${AboutPreferencesWatcher.BASE_PREF}${name}`, value);
},
async getIntValue(name, defaultValue = 0) {
try {
return Services.prefs.getIntPref(`${AboutPreferencesWatcher.BASE_PREF}${name}`, defaultValue);
}
catch(_error) {
return defaultValue;
}
},
async setIntValue(name, value) {
Services.prefs.setIntPref(`${AboutPreferencesWatcher.BASE_PREF}${name}`, value);
},
async setDefaultIntValue(name, value) {
Services.prefs.getDefaultBranch(null).setIntPref(`${AboutPreferencesWatcher.BASE_PREF}${name}`, value);
},
},
};
}
onShutdown(isAppShutdown) {
if (isAppShutdown)
return;
Services.prefs.removeObserver('browser.tabs.', AboutPreferencesWatcher);
}
};