Firefox rejects data: URLs in browser.downloads.download with "Access denied for URL data:...", breaking the PDF export. Build the download URL per-browser: a blob: object URL where URL.createObjectURL exists (Firefox background page), falling back to the base64 data: URL for Chrome MV3 service workers (no createObjectURL). Bump version to 1.3.0.
ISMIS Helper
A lightweight Firefox / Chrome extension for the USC ISMIS student portal that:
- Auto-fills and auto-submits your login.
- Auto-accepts the privacy-policy modal.
- Exports a Study Load PDF that matches the official layout — bundled Segoe UI fonts, the USC logo, the course table, and the units total.
One codebase builds for both browsers (see Build).
Install
Temporary/development install. For distribution, publish the built zips to Firefox AMO and the Chrome Web Store — they are store-ready.
Firefox (load temporary add-on)
- Build the Firefox variant (or download
ismis-helper-firefox.zipfrom CI):The output is atnode scripts/build.js firefoxdist/ismis-helper-firefox.zip(unzip it, or usedist/firefox/directly). - Open
about:debuggingin Firefox. - Click This Firefox → Load Temporary Add-on….
- Select
dist/firefox/manifest.json. - Open
https://ismis.usc.edu.phand use the extension.
Chrome (load unpacked)
- Build the Chrome variant (or download
ismis-helper-chrome.zipfrom CI):node scripts/build.js chrome - Unzip
dist/ismis-helper-chrome.zip(or usedist/chrome/directly). - Open
chrome://extensionsin Chrome. - Enable Developer mode (toggle, top-right).
- Click Load unpacked and select the unzipped
dist/chromefolder. - Open
https://ismis.usc.edu.phand use the extension.
For a persistent install, package and publish via Firefox AMO / Chrome Web Store with the same built zips.
Distribute to real users
Firefox (self-hosted, temporary)
Note: Firefox blocks unsigned extensions for normal installs. The proper fix is to sign the add-on via addons.mozilla.org (AMO) and publish it there (or self-host a signed
.xpi). AMO is currently under maintenance, so until it returns, the only way to install the unsigned build is to lower Firefox's signing check on each user's machine. This is a per-user browser setting and is not suitable for a broad audience — use it for personal / small-group use.
- Build the Firefox variant (or download
ismis-helper-firefox.zipfrom a release):node scripts/build.js firefox - In Firefox, open
about:configand accept the warning. - Search for
xpinstall.signatures.requiredand set it tofalse. - Restart Firefox for the change to take effect.
- Install the add-on from the release zip: drag
ismis-helper-firefox.zipinto Firefox (or File → Open File… and select it).
When AMO is back online, prefer the signed route: publish the same zip to AMO (or sign it with
web-ext sign) so users install it normally without touchingabout:config.
Chrome (self-hosted)
Chrome does not require signing for normal installs. Users can install the
built ismis-helper-chrome.zip directly:
- Download
ismis-helper-chrome.zipfrom a release and unzip it. - Open
chrome://extensions, enable Developer mode, and click Load unpacked. - Select the unzipped folder.
For a store experience, publish the same zip to the Chrome Web Store (one-time $5 developer registration).
Features
- Saved login profiles (stored in
browser.storage.local) — only one enabled at a time, with a master on/off toggle. - One-click Download PDF button on the Study Load page.
- PDF settings in the popup:
- Truncate long course descriptions to match the official PDF (default on).
- Show/hide
Year Level, and set a custom Year Level value.
- Bundled Segoe UI fonts for a 1:1 look with the official document.
- Builds and packages automatically via Gitea Actions (zips + versioned releases).
Build
Requires Node.js (the build.js script itself is dependency-free; npm install
is only needed to run the tests).
npm install # dev deps for tests
npm test # run the test suite
npm run build # build both -> dist/*.zip
node scripts/build.js all # build both explicitly
node scripts/build.js chrome # just chrome
node scripts/build.js all --version 1.3.0 # versioned zips
CI (Gitea Actions): on every push, both zips are built, tests run, and the
zips are uploaded as artifacts. When you push a v* tag (e.g. v1.3.0), it
additionally creates a Gitea Release with both versioned zips attached.
Settings
Open the extension popup to:
- Manage login profiles (add / edit / enable).
- Toggle the master on/off switch.
- Set PDF options: truncate descriptions, show/hide
Year Level, custom Year Level.
Data & privacy
- Auto-login stores your portal credentials in plaintext on your own device.
- This is a personal-use helper for the university portal; use it only with your own account.
Development
See AGENTS.md for the repository layout, build model, and coding
conventions for this project.