Combine the CSS files on FF startup

Instead of combining the CSS files during make, just install all of the
fragments and let mobile-config-autoconfig.js combine them.
This commit is contained in:
Oliver Smith 2023-04-06 10:49:21 +00:00
parent d676f135a8
commit fe45bbc8dc
No known key found for this signature in database
GPG key ID: 5AE7F5513E0885CB
3 changed files with 150 additions and 54 deletions

View file

@ -1,4 +1,4 @@
# Copyright 2022 Oliver Smith
# Copyright 2023 Oliver Smith
# SPDX-License-Identifier: MPL-2.0
HEADER_FILE := src/common/header.css
@ -8,18 +8,22 @@ DESTDIR :=
FIREFOX_DIR := /usr/lib/firefox
FIREFOX_CONFIG_DIR := /etc/firefox
all: out/userChrome.css out/userContent.css
all: out/userChrome.files out/userContent.files
clean:
rm -rf out
out:
mkdir out
out/userChrome.css: $(USERCHROME_FILES) out
cat $(USERCHROME_FILES) > $@
out/userChrome.files: $(USERCHROME_FILES) out
for i in $(USERCHROME_FILES); do \
echo "$$i" | cut -d/ -f 2-; \
done > $@
out/userContent.css: $(USERCONTENT_FILES) out
cat $(USERCONTENT_FILES) > $@
out/userContent.files: $(USERCONTENT_FILES) out
for i in $(USERCONTENT_FILES); do \
echo "$$i" | cut -d/ -f 2-; \
done > $@
install: all
install -Dm644 src/policies.json \
@ -28,10 +32,18 @@ install: all
"$(DESTDIR)/$(FIREFOX_DIR)/defaults/pref/mobile-config-prefs.js"
install -Dm644 src/mobile-config-autoconfig.js \
"$(DESTDIR)/$(FIREFOX_DIR)/mobile-config-autoconfig.js"
install -Dm644 "out/userChrome.css" \
"$(DESTDIR)/etc/mobile-config-firefox/userChrome.css"
install -Dm644 "out/userContent.css" \
"$(DESTDIR)/etc/mobile-config-firefox/userContent.css"
install -Dm644 "out/userChrome.files" \
-t "$(DESTDIR)/etc/mobile-config-firefox"
install -Dm644 "out/userContent.files" \
-t "$(DESTDIR)/etc/mobile-config-firefox"
for dir in common userChrome userContent; do \
for i in src/$$dir/*.css; do \
install \
-Dm644 \
"$$i" \
-t "$(DESTDIR)/etc/mobile-config-firefox/$$dir"; \
done; \
done
install -Dm644 org.postmarketos.mobile_config_firefox.metainfo.xml \
"$(DESTDIR)/usr/share/metainfo/org.postmarketos.mobile_config_firefox.metainfo.xml"

View file

@ -1,4 +1,4 @@
/* Copyright 2022 Oliver Smith, Arnaud Ferraris
/* Copyright 2023 Oliver Smith, Arnaud Ferraris
* SPDX-License-Identifier: MPL-2.0
* _ _ _ __ _
* _ __ ___ ___ | |__ (_) | ___ ___ ___ _ __ / _(_) __ _
@ -10,9 +10,9 @@
*
* WARNING: DO NOT EDIT THE COPY OF THIS FILE LOCATED IN YOUR USER PROFILE!
*
* It will be overwritten on upgrade. You should edit the file located in
* It will be overwritten on upgrade. You should edit the files located in
* /etc/mobile-config-firefox/ instead (most package managers won't replace
* files under /etc if they've been edited). Or alternatively, consider cloning
* mobile-config-firefox.git and editing the separate CSS files there, then
* combining them with "make". Patches for useful additions welcome!
* mobile-config-firefox.git and editing the separate CSS files there.
* Patches for useful additions welcome!
*/

View file

@ -10,6 +10,7 @@ Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
var updated = false;
var fragments_cache = {}; // cache for css_file_get_fragments()
// Create <profile>/chrome/ directory if not already present
var chromeDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
@ -81,48 +82,131 @@ function set_default_prefs() {
defaultPref('browser.newtabpage.enabled', true);
}
log("Running mobile-config-autoconfig.js");
// Get an array of paths to the fragments for one CSS file
// name: either "userChrome" or "userContent"
function css_file_get_fragments(name) {
if (name in fragments_cache)
return fragments_cache[name];
var ret = [];
var path = "/etc/mobile-config-firefox/" + name + ".files";
log("Reading fragments from file: " + path);
var file = new FileUtils.File(path);
var istream = Cc["@mozilla.org/network/file-input-stream;1"].
createInstance(Components.interfaces.nsIFileInputStream);
istream.init(file, 0x01, 0444, 0);
istream.QueryInterface(Components.interfaces.nsILineInputStream);
var has_more;
do {
var line = {};
has_more = istream.readLine(line);
ret.push("/etc/mobile-config-firefox/" + line.value);
} while (has_more);
istream.close();
fragments_cache[name] = ret;
return ret;
}
// Create a nsIFile object with one of the CSS files in the user's profile as
// path. The file doesn't need to exist at this point.
// name: either "userChrome" or "userContent"
function css_file_get(name) {
var ret = chromeDir.clone();
ret.append(name + ".css");
return ret;
}
// Delete either userChrome.css or userContent.css inside the user's profile if
// they have an older timestamp than the CSS fragments (or list of CSS
// fragments) installed system-wide.
// name: either "userChrome" or "userContent"
// file: return of css_file_get()
function css_file_delete_outdated(name, file) {
var depends = css_file_get_fragments(name).slice(); /* copy the array */
depends.push("/etc/mobile-config-firefox/" + name + ".files");
for (var i in depends) {
var depend = depends[i];
var file_depend = new FileUtils.File(depend);
if (file.lastModifiedTime < file_depend.lastModifiedTime) {
log("Removing outdated file: " + file.path + " (newer: "
+ depend + ")");
file.remove(false);
return;
}
}
log("File is up-to-date: " + file.path);
return;
}
// Create userChrome.css / userContent.css in the user's profile, based on the
// CSS fragments stored in /etc/mobile-config-firefox.
// name: either "userChrome" or "userContent"
// file: return of css_file_get()
function css_file_merge(name, file) {
log("Creating CSS file from fragments: " + file.path);
var ostream = Cc["@mozilla.org/network/file-output-stream;1"].
createInstance(Components.interfaces.nsIFileOutputStream);
ostream.init(file, 0x02 | 0x08 | 0x20, 0644, 0);
var fragments = css_file_get_fragments(name);
for (var i in fragments) {
var line;
var fragment = fragments[i];
log("- " + fragment);
line = "/* === " + fragment + " === */\n"
ostream.write(line, line.length);
var file_fragment = new FileUtils.File(fragment);
var istream = Cc["@mozilla.org/network/file-input-stream;1"].
createInstance(Components.interfaces.nsIFileInputStream);
istream.init(file_fragment, 0x01, 0444, 0);
istream.QueryInterface(Components.interfaces.nsILineInputStream);
var has_more;
do {
var line = {};
has_more = istream.readLine(line);
line = line.value + "\n";
ostream.write(line, line.length);
} while (has_more);
istream.close();
}
ostream.close();
updated = true;
}
function css_files_update() {
var ff_version = get_firefox_version();
log("Firefox version: " + ff_version);
// Create nsIFile objects for userChrome.css in <profile>/chrome/ and in /etc/
var chromeFile = chromeDir.clone();
chromeFile.append("userChrome.css");
var defaultChrome = new FileUtils.File("/etc/mobile-config-firefox/userChrome.css");
var names = ["userChrome", "userContent"];
for (var i in names) {
var name = names[i];
var file = css_file_get(name);
// Remove the existing userChrome.css if older than the installed one
if (chromeFile.exists() && defaultChrome.exists() &&
chromeFile.lastModifiedTime < defaultChrome.lastModifiedTime) {
log("Removing outdated userChrome.css from profile");
chromeFile.remove(false);
if (file.exists()) {
css_file_delete_outdated(name, file);
}
// Copy userChrome.css to <profile>/chrome/
if (!chromeFile.exists()) {
log("Copying userChrome.css from /etc/mobile-config-firefox to profile");
defaultChrome.copyTo(chromeDir, "userChrome.css");
updated = true;
if (!file.exists()) {
css_file_merge(name, file);
}
}
}
// Create nsIFile objects for userContent.css in <profile>/chrome/ and in /etc/
var contentFile = chromeDir.clone();
contentFile.append("userContent.css");
var defaultContent = new FileUtils.File("/etc/mobile-config-firefox/userContent.css");
log("Running mobile-config-autoconfig.js");
// Remove the existing userContent.css if older than the installed one
if (contentFile.exists() && defaultContent.exists() &&
contentFile.lastModifiedTime < defaultContent.lastModifiedTime) {
log("Removing outdated userContent.css from profile");
contentFile.remove(false);
}
// Copy userContent.css to <profile>/chrome/
if (!contentFile.exists()) {
log("Copying userContent.css from /etc/mobile-config-firefox to profile");
defaultContent.copyTo(chromeDir, "userContent.css");
updated = true;
}
css_files_update();
// Restart Firefox immediately if one of the files got updated
if (updated == true)