Compare commits

...

4835 commits
6.0.2 ... main

Author SHA1 Message Date
Tom Najdek
44fe83d98b
Update ftl-tx
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
2026-10-10 00:06:33 +02:00
Dan Stillman
d18d2d1701 Run the Windows CI tests when the Windows build files change
Changes in app/win/ (e.g., updated zotero.exe and updater.exe) that
didn't touch config.sh wouldn't trigger the Windows launch test.
2026-10-09 16:14:16 -04:00
Dan Stillman
b0db83d9dc Keep reconnecting to the streaming server after a 4429 close
A 4429 (Too Many Requests) close stopped streaming until restart along
with the other 44xx codes. Retry it on the normal backoff schedule.
2026-10-09 14:47:10 -04:00
Dan Stillman
a69b55ea96 Mark the first request when using Replace Online Library
Add a restoreToServer=1 query parameter so we can identify restores
server-side if necessary
2026-10-09 14:46:19 -04:00
Dan Stillman
5336c3562b Update English strings for Transifex 2026-10-09 14:41:10 -04:00
Dan Stillman
734e2e6840 Update locales from Transifex 2026-10-09 14:40:23 -04:00
Dan Stillman
b551fb6705 Add Unrelate Items to item context menu
Shown when two or more selected items are related to each other.
Removes relations among the selected items only.

https://forums.zotero.org/discussion/comment/519130/#Comment_519130
2026-10-09 13:28:48 -04:00
Dan Stillman
8cf0203bb9 Use "Relate Items" as the undo label for Relate Items 2026-10-09 13:28:47 -04:00
Dan Stillman
d0a728bb78 Update LibreOffice submodule
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Build, Upload (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
2026-10-08 14:21:27 -04:00
Dan Stillman
c280964d46 Name the parent folder in data directory access-denied error 2026-10-08 12:53:38 -04:00
Dan Stillman
338ce732bd Show correct access-denied error when data directory can't be created
The OS.File.makeDir() shim swallowed IOUtils errors, so a failure to
create the data directory showed as a generic "database cannot be
opened" error. For the default location, just explain and quit instead
of offering to choose another directory.

https://forums.zotero.org/discussion/134124/zotero-not-working-on-a-mac
2026-10-08 12:50:58 -04:00
Dan Stillman
9cbba8c4d2 Local API: Decode + as a space in form-encoded requests
Some checks failed
CI / Detect changes (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Test () (push) Has been cancelled
CI / Test (macOS NFS) (push) Has been cancelled
CI / Test (Windows arm64) (push) Has been cancelled
CI / Test (Windows x64) (push) Has been cancelled
File uploads that encoded spaces as + were stored with literal +
characters in the filename.

https://forums.zotero.org/discussion/134038/
2026-10-06 11:33:29 -04:00
Dan Stillman
fb4bed7522 Fix typo in MDPI challenge comment 2026-10-06 10:52:57 -04:00
Dan Stillman
1e2cc6820a Tweak comments for MDPI challenge workaround 2026-10-06 10:50:08 -04:00
Dan Stillman
09c3c8cd3d Clear MDPI's Akamai bot challenge during Find Full Text
MDPI serves a JS proof-of-work interstitial in place of the article
page, so Find Full Text found nothing. Run the challenge in a hidden
browser when a page's meta refresh points to a registered challenge
host, then retry the page.

Also match meta refresh URL= case-insensitively, since MDPI's is
uppercase, and bound meta refreshes by the redirect limit.

https://forums.zotero.org/discussion/132837/
https://forums.zotero.org/discussion/134079/
2026-10-06 10:36:20 -04:00
Dan Stillman
9071805bdc Shorten the default HTTP retry window
Some checks are pending
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
CI / Detect changes (push) Waiting to run
An hour of retries makes sense for syncing, which runs automatically and
can just spin during server maintenance rather than showing errors that
send people to the forums, but it was also inherited by foreground
requests, where it stalled operations the user was waiting on. Sync and
file syncing now ask for the long window explicitly.
2026-10-05 15:31:24 -04:00
Dan Stillman
cdf10bf62b Don't stall the Find Full Text queue on a failing download
A file URL returning a server error was retried for up to an hour inside
the download, and a 429 or Retry-After was waited out there too. Since
the queue processes one item at a time, that blocked every other
selected item. Throttling now goes to Find Full Text's own per-domain
handling, as it did before 10.0, which also needed to read Retry-After
from a fetch Response and parse HTTP-date values.

https://forums.zotero.org/discussion/133703/
2026-10-05 15:25:25 -04:00
Dan Stillman
a6e814417f Stop retrying indefinitely on a repeated Retry-After
Retry-After was honored unconditionally with no attempt limit, so a server
returning 429 or 503 with the header on every request retried forever.
Retry-After waits and backoff intervals now share the errorDelayMax
budget, with each Retry-After counted as at least a second so that a
value of 0 can't loop forever.
2026-10-05 15:23:57 -04:00
Dan Stillman
d81484d2e8 Limit timeout and retries for open-access PDF lookup
This runs during Find Full Text and connector saves, where the default
30-second timeout and hour of 5xx retries are far longer than a user
wants to wait.
2026-10-05 15:09:14 -04:00
Dan Stillman
9b769d3987 Don't retry failing custom Find Full Text resolvers
A custom resolver returning a 429/5xx inherited Zotero.HTTP's default
retry policy, which could cause the whole queue to stall for up to an
hour -- or indefinitely for a Retry-After -- on a dead resolver, despite
the 5-second timeout on the request.

https://forums.zotero.org/discussion/133642/
2026-10-05 15:08:34 -04:00
Dan Stillman
364181f4e7 Send cookies and Referer from HTTP.download()
Since the switch to fetch() in 0fe31b0f04 (Zotero 10.0.0), download
requests didn't use cookies, and the Referer header was silently dropped
as a forbidden header. Sites that check either -- e.g., IEEE Xplore,
which returns a 502 -- failed during Find Full Text.

https://forums.zotero.org/discussion/133703/
2026-10-05 14:18:34 -04:00
Thenewmanator15
ba2d6ecee4
Fix plugin loading on Firefox 153.3 (untrusted URI) (#6058)
As of Firefox 153.3.0esr, Services.scriptloader refuses jar:file: and file:
URIs unless allowUnsafeURL is passed (Mozilla bug 1974213), so no plugin
loads: bootstrap.js fails with "Trying to load untrusted URI", then
"Plugin ... is missing bootstrap method 'startup'".

Pass allowUnsafeURL when loading a plugin's bootstrap.js and prefs.js,
and preference pane scripts, and temporarily enable
security.allow_unsafe_subscript_loads, which covers loads from plugin
code outside the bootstrap scope.

Also add a test that installs a fixture plugin that loads a script from its XPI
and sets a default pref.

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-10-05 10:51:07 -04:00
Dan Stillman
15f6a81181 Refresh tag selector when a tag's type changes between views
Some checks failed
CI / Detect changes (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
CI / Test () (push) Has been cancelled
CI / Test (macOS NFS) (push) Has been cancelled
CI / Test (Windows arm64) (push) Has been cancelled
CI / Test (Windows x64) (push) Has been cancelled
Switching to a view that has the same tags but with different types
(manual vs. automatic) kept the previous list, so with "Show Automatic"
off a tag could show or hide incorrectly.
2026-10-02 12:38:58 -04:00
Dan Stillman
d8382c5c11 Fix manual tags missing from tag selector with automatic tags hidden
If a view contained manual and automatic tags with the same name, only
one was kept, and it would disappear with "Show Automatic" off.

https://forums.zotero.org/discussion/133869/
2026-10-02 12:38:53 -04:00
Dan Stillman
ae50d52589 Ignore invalid display directories in FilePicker
Some checks are pending
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
As of Firefox 140.17/153.4 (Bug 2068406), setting nsIFilePicker's
displayDirectory to a directory that doesn't exist or isn't readable
throws instead of being ignored. This broke callers that pass a saved
path that may be stale (e.g., choosing a PDF/EPUB handler after the old
app's folder was removed, or a missing Scaffold translators directory).
2026-10-01 16:37:58 -04:00
Dan Stillman
4118f47bc3 Mac build: Resolve Firefox source path to absolute path
build-and-unify changes into a temp directory before unifying, so a
relative path (e.g., `.`) broke the mach and objdir references.
2026-10-01 15:20:19 -04:00
Dan Stillman
9e234ee64f Mac build: Add Rust targets to the pinned toolchain
`rustup target add` was run before `rustup default`, so targets were
added to the previous default toolchain rather than $RUST_VERSION.
2026-10-01 15:20:19 -04:00
Dan Stillman
0d0bbc8925 Fix missing action buttons in RTF Scan's Verify Cited Items table
Some checks failed
CI / Detect changes (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
CI / Test () (push) Has been cancelled
CI / Test (macOS NFS) (push) Has been cancelled
CI / Test (Windows arm64) (push) Has been cancelled
CI / Test (Windows x64) (push) Has been cancelled
The action column's width was given as "32px", which VirtualizedTable
now turns into an invalid CSS width, collapsing the column and hiding
the buttons needed to resolve unmapped and ambiguous citations. Also
restore the accept-match icon on ambiguous-citation candidates.

https://forums.zotero.org/discussion/133740/
2026-09-29 12:51:07 -04:00
Dan Stillman
d7751b93d8 Don't match an item by a trashed child item in a search
A condition that matched a child item in the trash rolled up to its
parent when the search had a top-level (or other ancestor) result level,
or when "Include parent and child items of matching items" was checked.

https://forums.zotero.org/discussion/133836/
2026-09-29 11:34:37 -04:00
Dan Stillman
ebdc1287ac Await saving of recognized parent item before moving attachment under it
A standalone PDF recognized by ISBN wasn't moved under the new parent
item, because the move was attempted before the item had been saved
and had an ID.

https://forums.zotero.org/discussion/133957/
2026-09-29 11:33:12 -04:00
Dan Stillman
34000fb29f Fix partially applied upgrades after a transaction timeout
A userdata upgrade that took more than 5 minutes (e.g., dropping a large
legacy word index) was rolled back by Sqlite.sys.mjs, while its remaining
statements autocommitted and marked the database as upgraded, leaving
steps 126 and 127 missing.

Disable the transaction timeout and replace steps 122-129 (added in
Zotero 7, 9, and 10) with step 130, which checks for each change before
making it. To speed up the upgrade, drop the legacy word index without
overwriting the freed pages, since the full text already exists on disk
and we're just rewriting it in fulltext.sqlite.

https://forums.zotero.org/discussion/133859/zotero-connector-in-chrome-not-working
https://forums.zotero.org/discussion/133965/citation-saving-does-not-work-with-zotero-connector-firefox
2026-09-29 11:11:17 -04:00
Dan Stillman
f8ef8e2119 Match native pop-up button metrics for menulists on macOS 26+
Some checks are pending
CI / Build, Upload (push) Waiting to run
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
Firefox has AppKit draw the menulist's capsule and chevron, but it sizes
the box and positions the label itself, using a fixed dropdown border
and the label's CSS margins. On macOS 27 (and probably 26), that left the
label closer to the edges and the chevron than in a native NSPopUpButton.
It also made the box 26.5px tall. Firefox assumes regular pop-up buttons
are 22px tall and only draws them unscaled in boxes up to 2px taller, so
it drew the control at 22px and scaled the image up, enlarging the
capsule and chevron.

Add padding to match native label insets, and trim the label's vertical
margins to keep the box at 24px, so Firefox draws the control unscaled.
The result measures the same as a native NSPopUpButton.
2026-09-28 14:49:08 -04:00
Dan Stillman
9ea080f896 Update Mac launcher and libmozglue for Firefox 153.3.0esr
Build the launcher with the macOS 26.5 SDK. AppKit chooses control metrics
based on the main executable's SDK, so with the old 15.5 launcher, native
buttons and menulists used pre-Tahoe metrics with built-in margins while
Mozilla's XUL (built with 26.5) stopped compensating for them on macOS 26+
(bug 1992898), leaving labels cramped and controls indented.

Also add custom libmozglue.dylib (#6056) and set source info in mozconfig,
which official builds require and which Mozilla only detects automatically
from Mercurial checkouts.
2026-09-28 13:58:47 -04:00
Dan Stillman
df78b51dab Re-sign Mozilla helper apps in unsigned Mac builds with custom components
Mozilla's helper apps (GPU, content, etc.) use the hardened runtime and
Mozilla's Team ID, so in unsigned builds they couldn't load our custom
libmozglue.dylib and failed to launch. Re-sign them ad hoc.
2026-09-28 13:56:59 -04:00
Abe Jellinek
a64e367160
Patch libmozglue to prevent local voices from clicking on macOS 27 (#6056)
---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-09-28 11:44:16 -04:00
Dan Stillman
196bec4e7d Update Mozilla patch for fx153 for macOS 2026-09-28 11:28:58 -04:00
Dan Stillman
c694e88ec3 Revert "Fix cramped button and menulist labels on macOS 26+"
This reverts commit fcbc6ec1d5.
2026-09-28 11:27:41 -04:00
Dan Stillman
fcbc6ec1d5 Fix cramped button and menulist labels on macOS 26+
Firefox stopped inflating native controls on Tahoe (bug 1992898), but
still uses the old widget border sizes, so labels nearly touch the edges
of the new capsule-shaped buttons and run into menulist arrows.
2026-09-28 10:31:30 -04:00
Dan Stillman
e863643a43 Use curl instead of wget in build scripts
Some checks failed
CI / Build, Upload (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Test () (push) Has been cancelled
CI / Test (macOS NFS) (push) Has been cancelled
CI / Test (Windows arm64) (push) Has been cancelled
CI / Test (Windows x64) (push) Has been cancelled
curl is already required, so drop wget as a build requirement.
build_autoupdate.sh now checks the HTTP status code for its ETag cache
instead of relying on wget not creating the file on a 304.
2026-09-26 14:31:03 -04:00
Dan Stillman
8c3b967bf9 Support notarytool keychain profiles for notarization
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Build, Upload (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
If NOTARIZATION_PROFILE is set, notarize_mac_app and notarization_info
authenticate with that stored notarytool profile (e.g., an App Store
Connect API key) instead of an Apple ID and app-specific password,
unlocking the keychain first if needed.
2026-09-25 15:03:45 -04:00
Dan Stillman
53ded5eb44 Update reader submodule 2026-09-25 13:46:40 -04:00
Dan Stillman
cc951f9916 Rebuild Windows zotero.exe/updater.exe stubs from Firefox 153.3.0esr
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
153.3.0esr updated the Chromium sandbox, changing the TargetConfig
interface that xul.dll calls into the launcher's sandbox broker
through. The stubs were still built from 153.0esr, so the 153.3.0esr
xul.dll called the wrong methods and crashed on startup with
"config->SetProcessMitigations(initialMitigations) failed".
2026-09-24 13:37:25 -04:00
Dan Stillman
5237f27060 Update builds to Firefox 153.3.0esr 2026-09-24 09:37:15 -04:00
Martynas Bagdonas
3ff64b658d Fix virtualized table scrollbar width oscillation
The item table mixed fractional and integer widths to calculate scrollbar
padding. At certain pane sizes, changing that padding changed the table
width, causing ResizeObserver to measure and update it again. The loop made
the Info pane and PDF tab flicker and kept CPU busy while idle.

Calculate scrollbar width from matching integer measurements to stop the
feedback loop.

Cause of the reproduced loop: 7df21ed introduced the mixed-width
calculation; f3328b0 made ResizeObserver rerender the table immediately.

Potentially fixes these reports:
- https://forums.zotero.org/discussion/133865/pdf-reader-flickers-shakes-trembles-macos
- https://forums.zotero.org/discussion/133718/bug-after-updating-to-zotero-10-0-2-64-bit-on-windows
- https://forums.zotero.org/discussion/133764/zotero-10-0-2-high-cpu-usage-with-pdf-right-sidebar-open
2026-09-24 09:22:16 +01:00
Abe Jellinek
ed8ca1bfce Item merging: Don't merge web link attachments with different URLs
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
https://forums.zotero.org/discussion/133795
2026-09-23 13:53:08 -04:00
Dan Stillman
22a26bb483 Local API: Fix object writes with API-client-supplied keys
Requests that included a key got a 400 with `'primaryData' not
loaded for item`
2026-09-23 13:21:52 -04:00
Dan Stillman
4e3b208e4a Don't log an error when no bibliography locale is set
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
In the error console in https://forums.zotero.org/discussion/133857/
2026-09-22 16:31:42 -04:00
Dan Stillman
5245b6cf5e Bundle Safari App Extension in release builds
The release script never set SAFARI_APP_EXTENSION, so 10.0 through
10.0.3 shipped with only the web extension, which doesn't run on Big Sur
or Monterey. Only beta builds have been including both.

https://forums.zotero.org/discussion/133871/
2026-09-22 16:14:03 -04:00
Dan Stillman
e061e565b7 Update release script to 10.0 branch 2026-09-22 16:07:56 -04:00
Dan Stillman
8e7639d73d Show virtual rows (e.g., Trash) matching the collection filter
https://forums.zotero.org/discussion/133833/cant-show-trash-via-collections-search
2026-09-21 23:26:03 -04:00
windingwind
7c7560bad1
Fix fcntl() flags not being passed by Subprocess on macOS (#6051)
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
This showed up as devtools failing to start in a -d build on some machines, but any Subprocess.call() could fail because of it.

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-09-21 15:05:34 -04:00
Dan Stillman
b6f0f6c0ba Show login manager error when a credential write fails outside the keystore
Some checks failed
CI / Detect changes (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
CI / Test () (push) Has been cancelled
CI / Test (macOS NFS) (push) Has been cancelled
CI / Test (Windows arm64) (push) Has been cancelled
CI / Test (Windows x64) (push) Has been cancelled
The login manager can fail to store a value even when the OS keystore
works -- e.g., if key4.db is read-only, which Firefox 153 triggers
because NSS now creates a new AES key on the first write. Show the
existing corrupted-logins instructions instead of the keystore alert or
the unencrypted-storage offer, neither of which can help.

Also update the corrupted-logins dialog to add an "Open Profile
Directory" button
2026-09-17 10:37:04 -04:00
Adomas Venčkauskas
213b0d7d76 Update Word for Mac submodule 2026-09-17 12:24:16 +03:00
Dan Stillman
acc4fd5ad2 Pass a temp copy of dragged attachment files on Windows
Allowing only 'copy' for file attachment drags kept File Explorer from
moving files out of 'storage' but locked the cursor at '+' even for
moves within Zotero. Instead, provide the file via a flavor data
provider that copies it to the temp directory when a target asks for it,
so the drag can allow 'copyMove' again and Explorer's move only touches
the copy. A copy's directory is removed once Explorer has moved the file
out of it, at the next drag, or with the temp directory at shutdown.
2026-09-16 22:39:03 -04:00
Dan Stillman
bdb656ad5c Fix dragging file attachments to and from parent items on Windows
Since 56eb77b704, drags of file attachments allow only 'copy' so that
File Explorer doesn't move the file out of storage, but the trees set
dropEffect to 'move' in onDragOver() for drops within Zotero, and OLE
refuses a drop whose dropEffect isn't among the drag's allowed effects.
Have setDropEffect() fall back to an allowed effect and have onDrop()
act on the effect the tree chose, kept in
Zotero.DragDrop.currentDropEffect, rather than on the drop event's
dropEffect.

https://forums.zotero.org/discussion/133765/
2026-09-16 22:38:23 -04:00
Dan Stillman
c30163ed90 Fix row contents shifting when showing a between-rows drop indicator
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
The drop indicator span was inserted before the cells, so the first
cell stopped matching :first-child and picked up inline-start padding.
Insert it after the cells instead.

Regression from 5ca1fbb167, which replaced the .first-column class with
:first-child.
2026-09-16 15:44:05 -04:00
Dan Stillman
1d4b8bc89a Fix WebDAV auth for passwords containing '%' followed by two hex digits
fd812070b6 made _parseURI() decode the URL credentials so that
download() could build its own Basic Auth header from the decoded
values, but request() passed the decoded credentials to xmlhttp.open(),
which percent-decodes them again, so a password like "example%41pass"
was sent as "exampleApass". Re-encode the credentials before passing
them to open().

Fixes #6048
2026-09-16 10:04:14 -04:00
Dan Stillman
3c959e1012 Pass a triggering principal when launching non-HTTP URLs
Some checks failed
CI / Detect changes (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
CI / Test (macOS NFS) (push) Has been cancelled
CI / Test (Windows x64) (push) Has been cancelled
CI / Test () (push) Has been cancelled
CI / Test (Windows arm64) (push) Has been cancelled
Gecko 140.15 made nsIExternalProtocolService.loadURI()'s triggering
principal mandatory, so Zotero.launchURL() threw NS_ERROR_ILLEGAL_VALUE
for any scheme handled by an external app.

https://forums.zotero.org/discussion/133709/
2026-09-11 14:31:51 -04:00
Dan Stillman
ab34e9031a Handle overlong filenames in getClosestDirectory()
Some checks are pending
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Build, Upload (push) Waiting to run
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
relinkAttachment() calls getClosestDirectory() before showing the file
picker, and a too-long filename caused the OS.File.stat() in
getClosestDirectory() to throw, which prevented the file picker from
appearing after clicking Locate.

https://forums.zotero.org/discussion/133685/
2026-09-10 09:53:46 -04:00
Dan Stillman
913aff342d Say a keyring service may need to be installed on Linux
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Build, Upload (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
https://forums.zotero.org/discussion/133599/
2026-09-09 14:34:11 -04:00
Dan Stillman
cc700a1e11 Add a More Information link to keystore failures on Linux
https://forums.zotero.org/discussion/133599/
2026-09-09 14:34:10 -04:00
Dan Stillman
e03920890a Start HiddenBrowser loads from the parent process
Some checks are pending
CI / Build, Upload (push) Waiting to run
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
Firefox ESR 140.15 rejects loads from a content process for URLs that
process couldn't load on its own, including blob: URLs created by chrome
code. Full-text indexing loads HTML attachments through such a URL, so
indexing crashed Zotero with "Illegal load attempt of blob: URL from
web". Loads started by the parent are exempt, so start the load there
and use the child actor only to disable content retargeting.

https://forums.zotero.org/discussion/133661/
2026-09-08 17:08:55 -04:00
Dan Stillman
26988646bf Include the error message in startup error dialogs
SpiderMonkey stacks contain only frames, so the startup error messages
that showed just the stack didn't say what had failed. 9b3d7a32e3 added
the message to one of the three, where a ternary-precedence bug then
dropped the surrounding text instead. Format all three the same way.
2026-09-08 16:12:47 -04:00
Dan Stillman
bdaecbb5cc Detect database corruption reported by a transaction's commit
We only ever checked for corruption errors from transactions in
queryAsync(), so a corruption error raised by the COMMIT that mozStorage
runs itself bypassed the check. A 10.0 schema upgrade -- which heavily
exercises the database -- that failed due to corruption showed "Database
upgrade error" and a single Sqlite.sys.mjs frame instead of the prompt
offering to restore from a backup.

Two users reported this, but it's not clear what triggered it --
corruption usually occurs during a statement, which we did catch. There
may have been some statement transaction whose corruption error was
caught and ignored rather than being left to abort the transaction,
causing SQLite to then block the commit. That's what the test does, and
it fails without the fix.

https://forums.zotero.org/discussion/133611/
2026-09-08 16:01:23 -04:00
Dan Stillman
a43c1d5ad5 Update reader submodule 2026-09-08 09:37:42 -04:00
Dan Stillman
fc17dcd24a Tell the user to set up syncing again if credentials can't be decrypted
Some checks failed
CI / Build, Upload (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Test () (push) Has been cancelled
CI / Test (macOS NFS) (push) Has been cancelled
CI / Test (Windows arm64) (push) Has been cancelled
CI / Test (Windows x64) (push) Has been cancelled
If the keystore's secret is replaced -- say, after a keyring reset --
the stored value won't be able to be decrypted again, so tell them to
try logging in again instead of trying to fix their keyring.

https://forums.zotero.org/discussion/133603/
2026-09-04 18:12:31 -04:00
Dan Stillman
1086d80cec Update reader submodule 2026-09-04 16:06:00 -04:00
Dan Stillman
92dfac8c64 Don't make an unloaded tab reopenable with Undo Close Tab
unload() closes and re-adds the tab, and the close recorded an undo-close
history entry, so Undo Close Tab could open a duplicate of a tab that was
still open.
2026-09-04 15:30:33 -04:00
Dan Stillman
e88b7ee10f Don't clear the hidden flag when refreshing retractions data
_addEntry() wrote the row with REPLACE INTO, listing only itemID and
data, so flag reverted to its default of 0. It's called for every match
on every update, not just new ones, so a retraction the user had hidden
came back as soon as the list changed and Zotero restarted.
2026-09-04 15:07:15 -04:00
Dan Stillman
53bcd30a5f Don't report a window's observers as leaked while it's still closing
A window is marked as closed before its unload handlers run, so the tab
events fired from ZoteroPane.destroy() warned about every observer that
the closing window hadn't torn down yet. The leak check now also requires
the window to be detached from its docShell, and it covers functions. It
caught an observer that outlived its window -- the sync-reminder API key
observer, which is now unregistered on teardown.
2026-09-04 14:40:24 -04:00
Dan Stillman
22a1b33a42 Remove library tree event listeners on teardown
Listeners added to the item and collection trees' event bindings
survived unregister() and held ZoteroPane and the views for as long
as the tree objects did. makeClassEventDispatcher() now provides
clearEventListeners(), which the trees call on unregister, so callers
don't need to remove their own listeners. The collection tree focus
listener, a plain DOM listener, is removed in destroy().
2026-09-04 14:28:11 -04:00
Dan Stillman
0e46a5356b Fix tag selector observer leaks on uninit
Hiding the tag selector destroyed the TagSelectorContainer but left
its media-query listener registered, keeping the destroyed instance
alive for the lifetime of the window and firing setState() on the
unmounted component when the display density changed. The fontSize
pref observer id was also overwritten by the uiDensity registration,
so it was never unregistered.
2026-09-04 14:28:11 -04:00
Dan Stillman
d0a32a3b4f Poll for expected tag selector state in flaky tests
Selecting a collection doesn't wait for the tag selector to re-render,
so waitForTagSelector() could be resolved by the initial render instead
of the awaited change, and the assertions could run against a stale tag
list.
2026-09-04 14:28:11 -04:00
Dan Stillman
b3b6e7f33d Reopen closed reader and note tabs at their original position
The undo-close hooks read the index from the wrong object, so reopened
reader and note tabs were always appended at the end.
2026-09-04 14:24:47 -04:00
Dan Stillman
4d94810def Don't send a conditional request for an invalidated retractions cache
The cached retractions list is saved with the current data version from
the code, which we can bump to make clients discard their cached data
and refetch it. We've never actually done that, but if we did, it
would've hit a bug: init() would've started the refetch but still sent
the cached ETag, so if the list itself hadn't changed, the server
would've returned 304 and nothing would have been updated. The stale
version then would have survived, so the refetch would have been retried
on every startup.
2026-09-04 13:27:12 -04:00
Dan Stillman
54cea6cc37 Update Retraction Watch reason descriptions
Retraction Watch has renamed, merged, and added reason terms since these
were added, leaving only 65 of the 102 entries matching a term still in
use. 90% of retracted items had at least one reason that didn't show a
description, and 21% showed none at all. Rebuilt from the current
Appendix B list, which covers every reason in the data.
2026-09-04 13:12:43 -04:00
Dan Stillman
f3810befde Show file access error for NS_ERROR_FILE_FS_CORRUPTED
Windows returns this for ERROR_FILE_CORRUPT/ERROR_DISK_CORRUPT. It's not
in xpc.msg, so the exception has an empty name and isn't in
Components.results, and it was falling through to the generic file sync
error instead of the file access error with the path. Show a message
about the reported corruption in place of the usual permissions advice.

https://forums.zotero.org/discussion/133592/
2026-09-04 12:37:49 -04:00
Jakob Nylin
e3da52bebc
Match duplicate books by ISBN-10/13 equivalence (#6028)
---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-09-03 12:42:04 -04:00
Martynas Bagdonas
9086156a91 Update document-worker submodule 2026-09-03 18:20:11 +03:00
Dan Stillman
e56fad828d Throw from removed selection methods in pre-release builds
The shims from 5697ee0af7 keep old plugins working for users, but
beta/dev/source builds should still throw to get the attention of
developers and (hopefully breakage-tolerant) beta users.
2026-09-02 22:34:19 -04:00
Dan Stillman
0e00c1ce51 Center single-paragraph items pane status messages when they wrap
Status messages were left aligned for the multi-paragraph intro text,
but in a narrow window, that made single lines that wrapped sit
off-center, so center those instead.
2026-09-02 22:16:13 -04:00
Dan Stillman
5697ee0af7 Shim removed selection methods when a single row is selected
Plugins written for earlier versions call methods like
CollectionTree#getSelectedSearch(), which now throw. We did this
intentionally to make old code more obviously broken, even with single
selection, so developers would fix their code, but we're not yet
blocking plugins that illegitimately declared compatibility with a
future version, so some haven't been updated and are breaking Zotero.
With a single row selected, the pre-10 functions can technically
continue to work, so for now, restore them and just warn and name the
plugin instead of throwing. They still need to throw if multiple rows
are selected, since plugins that haven't been updated can't safely act
on a selection that might span collections or libraries.

https://forums.zotero.org/discussion/133565/
2026-09-02 22:16:13 -04:00
Dan Stillman
fac6c8ebf6 Name the responsible plugin when the items list fails to load
A plugin that monkey-patches a method in the item list's load path --
say, Zotero.CollectionTreeRow.prototype.getItems() -- can throw and
leave the pane showing only "Error loading items list", with nothing in
the error report to identify it. Update the message to name the culprit.

https://forums.zotero.org/discussion/133565/
2026-09-02 22:16:12 -04:00
Dan Stillman
08ed64f17f Fix "false" in Added By/Modified By columns for trashed collections
The row values were computed with `row.isItem && …`, so collection and
search rows in the trash got the boolean `false`, which the table then
rendered as the text "false".

https://forums.zotero.org/discussion/133560/
2026-09-02 12:18:12 -04:00
Dan Stillman
9e28eb0d39 Don't clear the saved session if startup fails
Zotero.Session.save() runs from a quit-application-granted observer
registered before the database checks, but session.json is only read
after them, so a startup error -- an incompatible database from a newer
version, say -- meant that quitting overwrote the file with an empty
state and all open tabs were lost.

https://forums.zotero.org/discussion/133542/
2026-09-01 22:56:41 -04:00
Dan Stillman
661843b03f Fix sync error due to invalid attachment filename
A stored-file path of 'storage:/' -- left behind by the 128 schema step,
which skipped paths with no basename -- triggered an
NS_ERROR_FILE_UNRECOGNIZED_PATH that aborted the whole
checkForUpdatedFiles() loop, so no files synced in the library. Skip an
attachment that throws instead of failing the whole library.

Also apply the setter's directory-path rule in getFilePath[Async]() to
avoid errors elsewhere.

https://forums.zotero.org/discussion/133523/synchronize-issue
2026-09-01 22:52:54 -04:00
Dan Stillman
a0ce7b3256
Show recently used collections in the Add to Collection menu (#6036)
Collections are now tracked as they're selected, added to, or dropped
on, and the five most recent usable targets are listed above the
full collection hierarchy by full path.
2026-09-01 21:59:20 -04:00
Dan Stillman
4a8a88dd41 Fix error using a CSL 0.8 style
transformToDocument() needs a load group, which it takes from the source
document or from the window that created the XSLTProcessor. Neither of
those has existed since 0f2690eb75 in Zotero 8 stopped taking
XSLTProcessor from the hidden window, so the CSL 0.8 → 1.0 upgrade threw
NS_ERROR_FAILURE. In Word, this showed as "Zotero encountered an error
while updating your document."

https://forums.zotero.org/discussion/133543/
2026-09-01 15:45:48 -04:00
Martynas Bagdonas
b4f1deb998 Add note editor indentation strings 2026-09-01 12:06:28 +03:00
Dan Stillman
984a72a3d9 Fix the startup error shown when the database can't be written to
Regression from b27c4cb023 in 10.0, which added pragma commands that
write to the database. If those failed because the database was
read-only, we would show a raw SQLite error instead of the message about
permissions.

https://forums.zotero.org/discussion/133521/error-for-zotero-10-for-mac
2026-08-31 14:23:53 -04:00
Dan Stillman
e679473db1 Remove citeproc-rs
citeproc-rs is no longer maintained, and people who had enabled the
hidden pref were hitting errors.

This also drops the free() call on CSL engines, which only existed to
free the citeproc-rs wasm driver.

https://forums.zotero.org/discussion/133515/
2026-08-31 12:38:05 -04:00
Dan Stillman
30425e024d Revoke the server API key if it can't be stored locally
The login session creates a key on the server before we try to store it,
so each attempt that failed to save the key left an active key behind.
2026-08-31 12:21:52 -04:00
Dan Stillman
c19177a469 Reset the account pane if the login session can't be stored
If storing the API key failed, the pane kept showing the spinner and
"Waiting for login…" until the user clicked Cancel, even though the
login attempt was already over.

https://forums.zotero.org/discussion/133418/
2026-08-31 12:21:29 -04:00
Dan Stillman
ace9fa0227 Report the real cause of an OS keystore failure
Every failure shows "User canceled OS unlock entry" no matter what went
wrong. Test the store for the actual state, and give callers a message
describing what couldn't be accessed.
2026-08-31 12:21:29 -04:00
Dan Stillman
57c8c81872 Don't show credential dialogs during automatic syncs
Both the keystore fallback prompt and the migration alert are reachable
from the credential read paths that a sync uses, so don't show if it's
an automatic sync.
2026-08-31 11:55:58 -04:00
Dan Stillman
892898040b Fall back to saving credentials without OS keystore encryption
Some Linux systems have no Secret Service running, and if users can't
change that (e.g., a managed system), storing an API key fails and login
never completes. Offer to store credentials unencrypted instead, and try
to encrypt them on a later read if the keystore becomes usable.

https://forums.zotero.org/discussion/133418/
2026-08-31 11:44:43 -04:00
Dan Stillman
d276ec19c5 Fix the window lookup for OS keystore alerts
'zotero:main' isn't a registered window type, so the lookup always
returned null and the alerts were never shown.

https://forums.zotero.org/discussion/133418/
2026-08-30 14:52:16 -04:00
Dan Stillman
bccaf46ff2 Advanced search: Reopen the conditions menu to the selection on macOS
Firefox 153 renders a menulist's popup as a native macOS menu, which
can't be opened to a submenu, so revealSelectedCondition() has done
nothing on macOS since the upgrade. Opt this popup out of native
rendering.
2026-08-28 14:16:11 -04:00
Dan Stillman
fa94212496 Advanced search: Use the shared find-as-you-type for the conditions menu
The conditions menu had its own find-as-you-type, which
Utilities.Internal.addMenuFindAsYouType() now provides for any menu.
Matching walks the menu rather than a cached list of every condition, so
typing can no longer select a condition the menu doesn't offer --
Collection and Saved Search are removed when the search spans multiple
libraries.

An attachment or annotation condition is shown with a short label inside
its submenu, so pass the full name to match on, which is what the
menulist shows once the condition is selected.
2026-08-28 14:16:10 -04:00
Dan Stillman
c8b841df8a Advanced search: Show subcollections in submenus
The Collection value menu was a flat list of every collection in the
library, with subcollections set apart by an indent (or hyphens before
606d8f19ba). Build it with Utilities.Internal.createMenuForTarget()
instead, using the new 'filter' feature to limit to collections. The new
FAYT helper preserves matching on subcollections.

If a subcollection is selected, open the path down to the subcollection
when opening the menu. (As of fx153, macOS renders popups as native
menus, which can't be opened to a submenu, so revert to non-native menus
there.) A collection in a submenu can't be a menulist's selected item,
so the condition holds the value and sets the menulist's label and icon
itself, with the collection's path as a tooltip.
2026-08-28 14:13:26 -04:00
Dan Stillman
41353f01cf Add find-as-you-type to createMenuForTarget()
A collection in a submenu can't otherwise be reached from the keyboard.
2026-08-28 14:02:41 -04:00
Dan Stillman
dffcbb553f Add a find-as-you-type helper for menus
A menulist's built-in find-as-you-type searches only the direct children
of its menupopup, so an item in a submenu can't be reached from the
keyboard. addMenuFindAsYouType() matches on every item in the menu
instead.

customElements.js opens a focused menulist when a space is pressed,
which would end a search partway through a name, so defer that while a
search is in progress.
2026-08-28 14:02:41 -04:00
Dan Stillman
eb33fa5835 Move the checkmark to the activated target in createMenuForTarget()
The target menu isn't rebuilt between openings, so the checkmark stayed
on the target the menu was built with. In the New Collection dialog,
whose menu belongs to a menulist, that would leave two checkmarks if you
clicked a different collection and then reopened the menu.
2026-08-28 13:43:37 -04:00
Dan Stillman
07745b634b Add a filter option to createMenuForTarget()
A caller can leave out targets it doesn't want, with an excluded target
replaced by its subcollections.
2026-08-28 11:40:26 -04:00
Dan Stillman
c098f5e84d Show the icon on the checked item in a collection menu on macOS
On macOS, the current target in the New Collection dialog and the Add To
menus showed a checkmark in place of its folder icon -- type="checkbox"
makes nsMenuItemX::SetupIcon() skip the item. The `checked` attribute
alone marks it without suppressing the icon. Windows and Linux draw the
check in place of the icon either way.
2026-08-27 21:02:03 -04:00
Dan Stillman
1d1d32a211 Update builds to Firefox 153.1.0esr
Some checks failed
CI / Test () (push) Has been cancelled
CI / Detect changes (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
CI / Test (macOS NFS) (push) Has been cancelled
CI / Test (Windows arm64) (push) Has been cancelled
CI / Test (Windows x64) (push) Has been cancelled
This also fixes a broken reader with existing profiles due to a Cache
API DB schema version bump in 140.14.0esr that wasn't in 153.0esr.
2026-08-27 15:41:27 -04:00
Dan Stillman
c2052cfff1 Don't add items in imported collections to the import collection
Items are added to the collection created for an import as they're
saved, before the imported collection hierarchy exists, so an item only
in a subcollection ended up in the top collection as well as its own.
Remove those once the hierarchy has been created.

When everything imported belongs to a single top-level collection, that
collection is used for the import rather than being nested inside a
collection named after the file.

https://forums.zotero.org/discussion/133174/
2026-08-27 14:15:19 -04:00
Dan Stillman
61174e2158 Export selected collections as collections
Exporting a collection included only its subcollections, so an item
directly in the collection came through with no collection at all, and
an item in both the collection and a subcollection came through in only
the subcollection.

Exporting a selection of multiple collections exported a flat list of
items with no collections at all.

We now include the selected collection(s), with one exception: if a
saved search is also selected, we export a flat item list, since a
search can't be exported as a collection.
2026-08-27 14:15:19 -04:00
Dan Stillman
e29d8f151e Try to fix Safari extension breakage after app updates
Forcing a Gatekeeper assessment seems to fix the extension when it's
broken. General theory: the system does an assessment while the app is
doing an in-place update, calculates a signature mismatch between the
parent app and the appex (or within one of the bundles?), and caches
that forever, so forcing a reassessment fixes it.
2026-08-27 11:45:03 -04:00
Dan Stillman
8e4ec83abd Rename _checkClientVersion() to _handleClientVersionChange()
The function runs upgrade tasks and records the current version.
2026-08-27 11:38:47 -04:00
Dan Stillman
3b93d33b35 Fix WebDAV downloads with non-ASCII characters in the password
HTTP.download() built the Basic auth header with btoa(), which throws
on code points above 255, so every file download failed immediately
with a TypeError. Requests that go through XMLHttpRequest were
unaffected, since Necko builds the header itself, UTF-8 encoded.

https://forums.zotero.org/discussion/133454/synchronization-error-after-upgrading-to-10-0-1
2026-08-27 10:46:00 -04:00
Dan Stillman
0c9ba2d05c Fix corruption of non-ASCII characters in encrypted credentials
Mozilla's OSKeyStore.encrypt() encodes the string as UTF-8 before
encrypting, but its decrypt() returns the decrypted bytes as a binary
string without decoding them, so a WebDAV password containing non-ASCII
characters came back mojibake and authentication failed.

https://forums.zotero.org/discussion/133465/problem-login-into-webdav-server-with-10-0-1
2026-08-27 10:45:45 -04:00
Dan Stillman
b6efbe880e Pass save options through in Zotero.Collection::removeItems()
addItems() passes its options to Zotero.Item::save(), but removeItems()
dropped everything but skipEditCheck, so callers couldn't batch the
resulting notifications.
2026-08-26 15:24:57 -04:00
Dan Stillman
ff93139cce Localize the search syntax's operators and other words
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Build, Upload (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
Operators can be typed as the Advanced Search shows them, which every
locale already translates, and new keyword messages cover the join
words, "no"/"has", the units of a relative date, and the range forms.

Each range form is given as an example with its two ends filled in, so
that a locale can say it its own way and each form keeps its own words
(e.g., no "between 1970 to 2000").
2026-08-26 15:19:44 -04:00
Dan Stillman
4a250cd20f Support date and count ranges in the search syntax
"year is between 1970 and 2000", "year:1970-2000", "1970..2000", and
"1970 to 2000" all match values within the range, inclusive of both
ends. Ends can be a year, a month ("added between 2024-02 and
2024-06"), a day ("date:2020-03-01..2020-03-15"), or a count ("number
of tags between 2 and 5").
2026-08-26 15:17:55 -04:00
Mynacol
d153397151
Use versioned libc.so instead of /bin/ln on Linux (#6030)
* Fix js-ctypes-based symlinking on Linux by using `libc.so.6` instead of `libc.so` in `OS.File.unixSymlink()` and `Zotero.File.createSymlink()`
* Use that instead of `/bin/ln`, which doesn't exist on NixOS
* Replace `/bin/ln` with `Zotero.File.createSymlink()` in symlinked-database test

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-08-26 13:02:48 -04:00
Dan Stillman
5d20c692e8 Don't use FSEvents when storage isn't on a local volume
FSEvents is backed by a per-volume journal that only local volumes
have. On a network mount the stream is created and started
successfully but never delivers events, so the watcher would report
that nothing had changed for as long as it was used. Check the volume
with statfs() and fall back to scanning.
2026-08-26 10:36:54 -04:00
Dan Stillman
a1ea7037c2 Fix locally missing attachments never being downloaded
Since f21e1b2d32, a full local file scan no longer runs periodically and
on every manual sync, so locally missed attachments stayed marked for
upload and were skipped as unavailable instead of being downloaded.
"Reset File Sync History" marked every attachment for upload, including
files that had never been downloaded, so the forced download check added
in 404fc41b88 found nothing to download.

Missing files are now marked for download when the upload queue is
filled, and in at-sync-time mode they're downloaded in the same sync.
The reset marks them for download directly, and downloads are no longer
skipped just because there were no remote storage changes.

https://forums.zotero.org/discussion/133414/
2026-08-26 10:36:54 -04:00
Dan Stillman
6d8198bbfa Don't offer a nonexistent file when dragging an attachment
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Build, Upload (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
getFilePath() and getFile() return a path whether or not the file
exists, so dragging an attachment that hadn't been downloaded handed
the drop target a path that didn't exist. Missing files also went
unreported by the drag data provider.
2026-08-25 15:25:33 -04:00
Dan Stillman
56eb77b704 Fix dragging attachments to File Explorer
Firefox 140.14 in Zotero 10.0 made the drag transferable's data
principal null for chrome-initiated drags, so the file-promise stream
that File Explorer used couldn't be created and the drop failed with
"Unspecified error". On Windows the promise was just a file:// URL for
the attachment itself, so hand over the file directly instead, and
force a copy so that File Explorer doesn't move it out of storage.

https://forums.zotero.org/discussion/133399/
https://bugzilla.mozilla.org/show_bug.cgi?id=2054665
2026-08-25 15:25:33 -04:00
Dan Stillman
e69ee69218 Fix Software Update window stuck on "Applying update…"
If an update had already finished downloading when the download page was
shown, the page waited for an update-staged notification even when
staging wasn't possible -- e.g., a default Windows installation in
Program Files, which isn't writable -- so it never advanced past
"Applying update…". It now checks whether staging is actually in
progress.

Not yet tested in an updatable build
2026-08-25 11:09:20 -04:00
Adomas Venčkauskas
baa47e3bb9 Remove bibliography when last citation is deleted. Closes #3474 2026-08-25 15:55:11 +03:00
Dan Stillman
753dbf557a Fix stuck "Loading items" at startup
Some checks are pending
CI / Build, Upload (push) Waiting to run
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
The collections tree selects a row as soon as it's initialized, which
raced with the items tree's initialization. If the collections tree won,
onCollectionSelected() threw on the missing items view and no items were
ever loaded.

https://forums.zotero.org/discussion/133379/
https://forums.zotero.org/discussion/133380/
2026-08-24 10:39:10 -04:00
Dan Stillman
786cdea884 Remove dead transaction rollback path
Some checks failed
CI / Detect changes (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
CI / Test () (push) Has been cancelled
CI / Test (macOS NFS) (push) Has been cancelled
CI / Test (Windows arm64) (push) Has been cancelled
CI / Test (Windows x64) (push) Has been cancelled
rollbackAllTransactions() called transactionInProgress() and
rollbackTransaction(), neither of which has existed since nested
transaction support was removed in 14d435b8d8, so it would have thrown
had either of its two callers still been reachable. Both are in code
long since replaced: Zotero.Sync.Server, which uses the synchronous
Zotero.DB.columnQuery(), and an error handler in Zotero.Sync.Storage
that nothing calls.

Drop it along with _transactionNestingLevel, _transactionRollback, and
_shutdown, which nothing reads.
2026-08-22 15:09:37 -04:00
Dan Stillman
f2a42bec15 Retry note saves that time out waiting for the database
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
Any error while saving a note prompted the user to restart Zotero, even
a transaction timeout caused by a long-running operation elsewhere.
Nothing has been written when the wait times out, so retry, unless newer
note content has been handed to the editor in the meantime.

https://forums.zotero.org/discussion/133298/
2026-08-21 16:31:18 -04:00
Dan Stillman
070ae8b615 Don't hold the database to optimize the full-text index
Editing a note flagged it stale, and the background drain indexed it and
then ran an FTS5 'optimize' -- a single statement that rewrites the
content index and can hold the shared database for over a minute --
because the queue was empty again. Note saves waiting on the connection
hit the transaction timeout and told the user to restart Zotero.

Merge the index in bounded steps instead, so no statement runs long
enough to keep other queries waiting, and only after enough items have
been indexed to be worth it.

https://forums.zotero.org/discussion/133298/
2026-08-21 16:31:18 -04:00
Dan Stillman
e8055dfdf2 Open the database only once when callers arrive concurrently
_getConnectionAsync() checked for an existing connection and then awaited
several filesystem operations before assigning one, so callers arriving in
that window each opened their own. Only the last was kept, and the rest
stayed open and unreachable, holding a mozStorage thread apiece until
shutdown.
2026-08-21 16:28:36 -04:00
Dan Stillman
9e45191b22 Stop observing idle after the database is closed permanently
A permanently closed connection kept its idle observer, so it went on
being notified and attempting backups for the life of the process. This
affects plugin databases, which are closed permanently when the plugin
shuts down.
2026-08-21 16:28:35 -04:00
Dan Stillman
7243648ed7 Register the DB backup idle observer only once per connection
The observer was added on every open with no matching removal, so each
reopen left behind another registration that received its own idle
notification. On macOS, where the periodic backup closes and reopens the
connection, the registrations accumulated and multiplied the work done
on each idle.

Addresses #6027
2026-08-21 16:28:35 -04:00
Dan Stillman
85e1cbc75c Don't back up an unchanged database
currentDBTime and lastBackupTime became Date objects when the backup was
made asynchronous in 2014, so comparing them with == has tested object
identity and returned false ever since. The interval check that follows
measures from the backup file's mtime, which a copy inherits from the
database file, so an unchanged database was backed up on every idle.

Fixes #6027
2026-08-21 16:28:35 -04:00
Dan Stillman
ad98e84d24 Fix Any Field searches at a non-item result level
Any Field expands to a generic 'field' condition, which the cross-level
code treated as matching only on top-level items. At an attachment
result level it therefore matched attachments whose parent item had the
value, instead of attachments with the value themselves. Since the
condition stands in for every field, it's now treated as matching at any
level those fields live at.
2026-08-21 12:56:05 -04:00
Dan Stillman
77a3a8815e Add a query syntax to the quick search
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Test (Windows arm64) (push) Blocked by required conditions
CI / Test (Windows x64) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
Zotero.SearchQuery turns a query like `by:smith after:2020 tag:"to read"
crispr` or `creator is smith and (tag is foo or bar)` into a
Zotero.Search, matching whatever text is left over using the current
search mode. Anything that doesn't look like a clause is free text, so a
DOI or a title with a colon in it is matched literally.

The search box syntax-highlights the parts of recognized conditions and
offers autocomplete for condition names, for the values of conditions
that have a fixed set of them (like item type), and for tags and
creators from the selected libraries.
2026-08-20 16:09:20 -04:00
Dan Stillman
766cb079a0 Only defer the quick search while a quotation mark is unclosed
Searching was deferred whenever the query contained a double quotation
mark, with an items-pane message to press Enter. Quoted phrases are no
longer expensive now that Everything mode uses full-text search, so
defer only while an unclosed quote means the phrase is still being
typed, and search as soon as it's closed. Enter still forces a search
mid-quote.
2026-08-20 16:09:20 -04:00
Dan Stillman
0ee3e4052e Don't prompt to save an unchanged saved search
https://forums.zotero.org/discussion/133302/zotero-10-questions-about-search
2026-08-20 15:38:13 -04:00
Dan Stillman
0746c665a9 Don't match dates without a sortable year in "is before" searches
Values without a parsable year are stored with a 0000-00-00 sort key,
and the guard meant to exclude them from comparisons checked the full
multipart value, which is always greater than '0000-00-00'.
2026-08-20 13:19:23 -04:00
Dan Stillman
73f4273e2d Make Original Date a date field
Update the global schema to 45, resolve a field's date type through its
base-field mapping in ItemFields.isDate() (to cover priorityDate), and
convert stored values of date-type fields to multipart dates on schema
upgrade.
2026-08-20 12:57:46 -04:00
Dan Stillman
04796dff22 Use date operators for all date-type item fields in searches
Only Date and Accessed were routed to the datefield condition, so other
date fields (e.g., Filing Date) offered only text operators and
couldn't be compared as dates. Text operators are still accepted on
date fields so existing saved searches keep loading and running.
2026-08-20 12:57:46 -04:00
Dan Stillman
5f978c71ca Detect Windows-on-ARM in dir_build under an emulated shell
The GitHub runner image installs the x64 build of Git for Windows, so
its bash and everything run from it execute under x64 emulation on
Windows on ARM, where uname -m reports x86_64 and the staged build got
the wrong architecture. uname -s still reports the machine, as
MINGW64_NT-10.0-26200-ARM64, so use that instead. If the image ever
installs a native arm64 Git for Windows, uname -m will be correct and
this can go.
2026-08-20 12:34:41 -04:00
Dan Stillman
c220866d9a Use a platform-appropriate path in file access error test
The hardcoded POSIX path isn't valid on Windows.
2026-08-20 12:34:41 -04:00
Dan Stillman
6ce33bcd81 Use forward slashes in ZIP entry names on Windows
The ZIP format requires forward slashes, and nsIZipWriter stores
whatever it's given, so entries for files in subdirectories were
written with backslashes.
2026-08-20 12:34:41 -04:00
Dan Stillman
f5a2985a34 Handle unparseable paths in getClosestDirectory()
On Windows, stat rejects a POSIX-style path with
NS_ERROR_FILE_UNRECOGNIZED_PATH rather than a not-found error.
2026-08-20 12:34:41 -04:00
Dan Stillman
cdb13af13b Wait for the browser process in Windows test runs
zotero.exe is the Mozilla launcher process, which spawns the browser
process and exits, so the test runner checked for the success file and
cleaned up the profile while the app was still starting, and passing
runs were reported as failures that ended at arbitrary points.
2026-08-20 12:34:41 -04:00
Dan Stillman
32640e2019 Wait for test success file to be written before quitting
The write is asynchronous, and on Windows the app quit before it
finished, making passing test runs report failure.
2026-08-20 12:34:40 -04:00
Dan Stillman
22b3daf845 Don't require rsync in build.sh
rsync isn't available on Windows, so fall back to cp for directory
copies.
2026-08-20 12:34:40 -04:00
Dan Stillman
aa49b48915 Don't use rsync and find in prepare_build
Neither is reliably available on Windows, so copy the source tree with
Python when rsync is missing and delete the CSL locale support files
with a directory walk.
2026-08-20 12:34:40 -04:00
Dan Stillman
c7cffdd26c Move prebuilt reader/note-editor files without the shell
The shell glob in the mv breaks on Windows paths, so every Windows
build silently fell back to building the submodules from source.
2026-08-20 12:34:40 -04:00
Dan Stillman
da705c36ec Add a timeout to the SMB and NFS setup steps in CI
The apt mirrors regularly hang for many minutes, which was taking out
random jobs until the job timeout.
2026-08-20 12:34:40 -04:00
Dan Stillman
b930ddb863 Add Windows test jobs for Gecko and network-filesystem changes
Boots the Windows x64 and arm64 builds, which use custom-built Firefox
components rather than stock Mozilla binaries, and runs the DB and file
tests. A Gecko bump commit updates the custom-component hashes in
config.sh along with the version, so this tests each new set of custom
components, which previously required manual Windows testing.
2026-08-20 12:34:40 -04:00
Dan Stillman
847dffbf18 Update CI to Node 24
Include the version in the node_modules cache keys so that a version
change starts fresh caches.
2026-08-20 12:34:40 -04:00
Dan Stillman
96972db8c6 Don't install xvfb in Linux CI
xvfb comes with the GitHub runner image.
2026-08-20 12:34:39 -04:00
Dan Stillman
dac1ad489f Update utilities submodule
Some checks are pending
CI / Detect changes (push) Waiting to run
CI / Test () (push) Blocked by required conditions
CI / Test (macOS NFS) (push) Blocked by required conditions
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
And add test for citing date strings wrapped in double quotes

https://forums.zotero.org/discussion/133277/
2026-08-19 15:28:34 -04:00
Dan Stillman
ed8049dffc Run network-filesystem tests only for relevant changes, and on macOS
Run the smb/nfs test shards and a new macOS NFS job only when the
changes touch the Gecko version or the network-filesystem database
handling, plus on manual and monthly scheduled runs, via a 'changes'
job feeding the test matrix. The macOS job uses the native NFS server
with a loopback mount and runs the real code path that crashed on
network data directories on macOS.
2026-08-19 11:13:15 -04:00
Dan Stillman
e1759daa00 Show in-window message in style preview instead of progress popup
Since 30b5bf4bb9, the popup opens as a dependent window of the main
window, so it appeared behind the Style Preview window and, on Windows,
brought the main window to the front.

https://forums.zotero.org/discussion/133296/
2026-08-19 10:54:56 -04:00
Dan Stillman
4e532a17a2 Skip symlink tests on filesystems without symlink support
CIFS mounts can't create real symlinks without special mount options,
so skip the symlinked-database and broken-symlink tests when a created
symlink doesn't exist or isn't visible as one.
2026-08-19 09:37:38 -04:00
Dan Stillman
ad1bec62f2 Use offline database backups on network filesystems on Linux
The online backup API writes the backup file through SQLite's default
VFS, whose locking can hang on network filesystems -- its lock upgrades
conflict with the SMB byte-range lock mapping on CIFS mounts and retry
forever -- so fall back to an offline backup, which copies the file
with the connection closed. Extends getFileSystemInfo() to Linux using
statfs f_type magic numbers.
2026-08-19 09:37:38 -04:00
Dan Stillman
18f6fa50d5 Add CI test shards with the data directory on SMB and NFS shares
Adds 'smb' and 'nfs' entries to the test matrix that run the DB and
file test suites with the test data directory on a loopback CIFS or
NFS mount, covering the network-filesystem database handling from
bba85a3939. The test harness places the data directory under TMPDIR,
so connection initialization itself runs against the share, which is
where network-filesystem failures (startup crashes and hangs) occur.
The step timeout turns a startup hang into a failure.
2026-08-19 09:37:37 -04:00
Martynas Bagdonas
db1216d3e2 Fix annotations not appearing when imported while reader is opening
Fixes https://forums.zotero.org/discussion/133270/bug-embedded-pdf-annotations-and-highlights-fail-to-render-in-zotero-reader
2026-08-19 10:06:31 +03:00
Dan Stillman
b6837a3a57 Fix doubled Index Statistics numbers after searching in preferences
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
The preferences search feature moves label value attributes into text
content for highlighting, so stats refreshes that set the value
attribute rendered the new number in front of the stale text.

https://forums.zotero.org/discussion/comment/516909/#Comment_516909
2026-08-18 17:42:34 -04:00
Dan Stillman
bba85a3939 Fix database access on network filesystems on macOS and Linux
On macOS, SQLite chooses locking methods based on the filesystem
containing the database, and network filesystems (e.g., SMB, NFS),
read-only volumes, and filesystems without byte-range locking get
methods without shared-memory support, which WAL requires. Opening a
database with an adjacent WAL file on those crashes -- Mozilla's VFS
wrapper hides the missing shared-memory methods from SQLite's WAL
support check -- so the first Zotero 10 run converted the database to
WAL and every launch after that segfaulted during connection
initialization.

On macOS, mirror SQLite's method selection and use a rollback journal
when shared memory isn't available, converting an existing WAL database
before opening it: an empty WAL by reverting the header format versions
in place, and a non-empty WAL by replaying it into a temporary copy on
local disk that replaces the database file only after passing an
integrity check. A WAL file next to an already-converted database
(e.g., from an interrupted conversion) goes through the same
conversion. Also use openNotExclusive during integrity checks and
corruption recovery, which otherwise fail on SMB shares with an I/O
error from the exclusive open lock.

This corrects 22055d92b7, which passed openNotExclusive on all
platforms for an open failure described as affecting macOS and Linux,
and expected locking_mode=EXCLUSIVE to keep the WAL index in heap
memory with no -shm file. Neither claim held up: mozStorage opens the
WAL while initializing the connection, before any pragma can run, so
the index uses shared memory unless the exclusive VFS is in use, and
the exclusive open works on Linux CIFS mounts -- where non-exclusive
access instead made SQLite's lock-upgrade sequence trip over the SMB
byte-range lock mapping, leaving startup hung and the database never
created. So pass openNotExclusive only on macOS. On Linux this restores
unix-excl, which performs all locking under a single held lock and
keeps the WAL index in heap memory; Windows has no distinct exclusive
VFS and is unaffected.

https://forums.zotero.org/discussion/133258/
2026-08-18 14:38:37 -04:00
Dan Stillman
5757396197 Fix changelog URL generation for two-digit major versions
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
The short version was derived from the first three characters of the
version string, so 10.0 produced a detailsURL of "10._changelog".
2026-08-17 12:10:35 -04:00
Dan Stillman
5a6c9245f0 Fix locale update script under rpl 2.x
rpl 2.1.0 guesses each file's character encoding instead of assuming
UTF-8, and aborts on some locale files, leaving the script's later
steps unrun. Pin the encoding, and use -exec + so a failure in one of
these passes actually stops the script.

Also drop the ⏎ replacement, which hasn't matched anything since 2013
and would now insert real newlines rather than literal \n, truncating
.properties entries.
2026-08-17 09:57:58 -04:00
Abe Jellinek
844bd87824 Update reader submodule
Some checks failed
CI / Test (shard 1) (push) Has been cancelled
CI / Test (shard 2) (push) Has been cancelled
CI / Test (shard 3) (push) Has been cancelled
CI / Test (shard 4) (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
2026-08-14 13:41:03 -04:00
Dan Stillman
e0f9710c46 Update utilities submodule
edtf.js is replaced with a built-in parser in date.js, so it no longer
needs to be loaded at startup.
2026-08-14 10:44:23 -04:00
Maximilian Schmidt
b8fdee865a
Fix zero local data object versions (#6016)
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
2026-08-13 11:23:05 -04:00
Dan Stillman
29a4d9d140 Skip focus traversal tests when the pane window can't be activated
The traversal waits on focus/blur events, which Gecko fires only while
the window is active, so a window that can't be activated -- another
app focused during a local run, or intermittent deactivation in CI --
timed out after 10 seconds instead of reporting that it couldn't run.
2026-08-13 10:43:51 -04:00
Dan Stillman
472a0bf856 Update utilities submodule
And add a test for citing a spelled-out BCE date, which citeproc-js
rendered as AD.
2026-08-13 10:01:09 -04:00
Tom Najdek
68bec97114
Add support for importing from encrypted Mendeley Desktop DB (#6019) 2026-08-13 09:33:41 -04:00
Dan Stillman
4a6a8220ff Fix error from header element in updater window
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
attributeChangedCallback() runs before the content has been rendered.
2026-08-12 17:18:52 -04:00
Dan Stillman
f53d4b5eca fx153: Fix update window getting stuck on "Looking for changes"
Firefox 153 removed the wizard's extra1 and extra2 buttons, so onLoad()
threw while caching their labels and never got to starting the update
check or adding the page handlers. Create the buttons ourselves instead.
2026-08-12 17:18:52 -04:00
Dan Stillman
1d6158dfd8 Remove Linux i686 build support 2026-08-12 16:36:41 -04:00
Dan Stillman
5df473cf96 Fix grep warnings about stray backslashes during MAR builds 2026-08-12 16:29:20 -04:00
Dan Stillman
e7767c5bfa Don't build Linux i686 updates for Zotero 11
i686 builds are gone as of Zotero 11, so a full build failed trying to
package a linux-i686 MAR from a staging directory that no longer exists.
Skip the architecture entirely, and don't download it for older FROM
versions when building incrementals.
2026-08-12 16:29:20 -04:00
Dan Stillman
8d01216e5c Fix flaky search tests that used common words
Tests asserted exact search results for words like "one" and "two", so
a leftover item from an earlier test whose random title contained one
of the words as a substring could match and fail the assertion. Use
distinctive random strings instead.
2026-08-12 14:24:22 -04:00
Dan Stillman
8ac1273acb Support citing EDTF dates in the Date field and Extra
EDTF dates -- ranges ("2021/2026"), uncertain/approximate dates
("2004-06~"), and BCE dates ("-0429") -- and common equivalent notations
("1995-1996", "2021-22", "~1995", "ca. 1995", "429 BCE") are now passed
to citeproc-js as CSL date ranges, circa flags, and negative years.
Previously, such dates were mangled or dropped entirely unless entered as
CSL variables in Extra.

CSL date variables in Extra get the same parsing.

Other date handling in the client doesn't understand EDTF yet: the y/m/d
indicator in the date field doesn't reflect EDTF parsing, date searches
only match a range by its start date, and BCE dates still can't be
sorted.

Addresses #637
2026-08-12 14:11:26 -04:00
Dan Stillman
399a63ade2 Fix CI failures from items-in-view count updates
The debounced count update from fe35127f50 went through itemSelected()
and fired on any notifier change, so a pending timer could bump the
itemSelected spy after a test reset it, failing "shouldn't select a
modified item" in CI. Emit rowCountChange only when the row count
actually changed, and re-render the item pane message directly.
2026-08-12 13:25:34 -04:00
Dan Stillman
d9d52de516 Check that local app/ matches commit being built before deploying
The build-and-deploy scripts run scripts and config from the local
checkout but build source files from the tip of the remote branch, so
a stale or wrong-branch checkout could silently build with the wrong
Gecko version or omni patches.
2026-08-12 12:46:30 -04:00
Dan Stillman
a9e765e37f Remove 8.0 release build script 2026-08-12 12:46:30 -04:00
Abe Jellinek
fdec96911c Update reader submodule
Some checks are pending
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Test (shard 1) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
2026-08-11 13:42:41 -06:00
Abe Jellinek
ad7159834c Reader: Add support code for popup position persistence 2026-08-11 13:42:20 -06:00
Adomas Venčkauskas
e5508e870c Actually return 400 and throw when multipart body is malformed.
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
Closes #6009
2026-08-10 16:16:00 +03:00
Dan Stillman
896582ab32 Hash files incrementally in md5Async() instead of blocking main thread
Some checks are pending
CI / Build, Upload (push) Waiting to run
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
md5Async() read and hashed the entire file synchronously on the main
thread. Read the file via an input stream pump instead, with file I/O
off the main thread and hashing done a segment at a time.
2026-08-09 22:11:42 -04:00
Dan Stillman
c1cdd038a2 Select item explicitly in item-pane refresh test
The test relied on the automatic selection of a newly created item,
which can lose the race with a view switch (e.g., from another library
selected by a previous test), leaving the info pane empty.
2026-08-09 22:09:02 -04:00
Dan Stillman
fe35127f50 Update items-in-view count when rows change without a selection
Notifier events that added or removed rows (e.g., items downloaded
during a sync) didn't update the no-selection message in the item pane,
so the count went stale until the selection changed. The row provider
now emits a rowCountChange event, and the pane re-renders the count,
debounced, when nothing is selected.
2026-08-09 14:49:21 -04:00
Dan Stillman
b8cbdc8c95 Document in-memory state handling for transaction rollbacks 2026-08-09 14:33:22 -04:00
Dan Stillman
04321fc627 Restore cached user name on transaction rollback
Zotero.Users.setName() updated the in-memory cache even if the
transaction was later rolled back, so a retry (e.g., of a failed sync
download batch) would skip rewriting the users row.
2026-08-09 14:29:48 -04:00
Dan Stillman
3630b904d7 Process downloaded objects in batched transactions
Saving each downloaded object in its own transaction made large
download syncs extremely slow, since every object required a separate
disk commit. Objects are now saved in batches sized by the existing
notifier batch ramp, and a failed batch is reprocessed individually so
that an error still rolls back only that object's save. The cached
parent item is reloaded on rollback, since it would otherwise keep
collections added via newParentItemCollections in memory and the retry
would skip writing them.
2026-08-09 14:22:21 -04:00
Dan Stillman
646fbfae65 Don't treat error in commit callback as a rollback
An error thrown from a commit callback rejected executeTransaction()
even though the transaction had been committed, so callers would treat
saved data as rolled back, and rollback callbacks (e.g., the notifier
reset) ran against committed data. Commit-callback errors are now
logged instead, and any error after a successful commit skips rollback
callbacks and is marked with 'committed' on the error object.
2026-08-09 14:22:21 -04:00
Dan Stillman
46603ca4eb Discard queued commit callbacks on transaction rollback
If a transaction was rolled back, callbacks queued via
addCurrentCallback('commit') stayed queued and ran after the next
successful commit, potentially applying in-memory cache updates for
rolled-back data.
2026-08-09 14:22:20 -04:00
Dan Stillman
1d279fba5b Add executeTransactionWithForcedRollback() test helper
Runs a function within a transaction that's rolled back at the end,
with rollback callbacks guaranteed to have run by the time it returns.
Replaces try/catch blocks in existing tests that threw and caught a
marker string from executeTransaction() to force a rollback.
2026-08-09 14:22:20 -04:00
Dan Stillman
45867cea54 Update reader submodule
Some checks failed
CI / Build, Upload (push) Has been cancelled
CI / Test (shard 1) (push) Has been cancelled
CI / Test (shard 2) (push) Has been cancelled
CI / Test (shard 3) (push) Has been cancelled
CI / Test (shard 4) (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
2026-08-07 21:02:49 -04:00
Dan Stillman
c87328ada9 Fix leading space in creator autocomplete values
the all-creators mode (fieldmode 2) concatenated
firstname || ' ' || lastname, so a two-field creator without a first
name produced ' last', which advanced search fields inserted with the
space.
2026-08-07 11:03:57 -04:00
Dan Stillman
8f6dc583b8 Skip startup full-text index purge and optimize when unnecessary
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
purgeOrphanedContent() ran on every startup, unlike the other
data-object purges, which are gated on the purge.* prefs.
startQueueDrain() also ran an FTS5 'optimize' even when the queues were
empty.

Gate the former on purge.items and the latter on having indexed
something.
2026-08-06 15:06:40 -04:00
Dan Stillman
3af8cea1af Name annotation types by type alone in the Advanced Search
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
The menu labeled Annotation Type listed "Highlight annotation" and "Image
Annotation", from the strings the reader announces annotations with. Use
the short names, which existed for two of the six.
2026-08-05 15:02:21 -04:00
windingwind
09249bfb73
fx153: Interface should load with nsIID instead of string (#6008) 2026-08-05 14:18:32 -04:00
Dan Stillman
8fb2870f93 Restore dxcompiler.dll on Windows for WebGPU and leave WebGPU pref on
mozinference (which is currently CPU-only) is better for many tasks, but
plugins may want WebGPU for some features (e.g., chatbots), so just
follow Firefox, which currently enables it by default for Windows and
Apple Silicon macOS. Adds 5.8 MB compressed to the Windows installer.
2026-08-05 14:10:04 -04:00
Dan Stillman
9da57a9fe3 Search: Allow binding a group whose conditions match at any level
Binding is meaningful for a condition that matches at every level -- a
tag bound to an attachment means the tag is on the attachment -- but a
group carrying one lost the binding as soon as the search was
serialized, so "items with an attachment tagged foo" couldn't be built.
2026-08-05 13:14:37 -04:00
Dan Stillman
b83342d8e0 Include numeric cell values in row accessibility labels
The row label builder skipped values that weren't strings, so a numeric
cell -- a note count, or a pre-1000 year (which is parsed with
parseInt()) -- announced only its column
name.

Also switch to formatColumnName() while we're here, so row labels
resolve the column name the same way the header does.
2026-08-05 13:09:58 -04:00
Dan Stillman
2f90893e59 Fix clearing the previous sort column's persisted direction
The guard tested the newly clicked column's settings entry while the
delete targeted the previously sorted column's, so the old direction
survived when the new column had no entry, and clicking threw when the
old column had none.
2026-08-05 13:02:24 -04:00
Dan Stillman
8052b8f9e2 Fix system-handler detection for PDFs/EPUBs on Windows 11
Windows 11 now stores default-app choices for protected file types
(e.g., .pdf) in a new UserChoiceLatest registry key [1], so the manual
registry lookup returned a stale value -- typically Edge -- instead of
the user's actual choice. Resolve the handler via nsIMIMEService, which
queries the effective association from the OS shell, and return false
for Microsoft Store apps, which have no launchable executable, so that
the file is opened via ShellExecute (albeit without a page number).

https://forums.zotero.org/discussion/133026/default-pdf-reader-stuck-on-edge

[1] https://kolbi.cz/blog/2025/04/20/userchoicelatest-microsofts-new-protection-for-file-type-associations/
2026-08-05 11:56:45 -04:00
Dan Stillman
aaeb9c6c9a fx153: Don't bundle unused Firefox runtime files
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
Skip crashhelper (all platforms -- the crash reporter is disabled) and
desktop-launcher and nmhproxy.exe (Windows).

Also skip dxcompiler.dll (Windows, 22 MB), which is loaded only by
WebGPU, now also disabled via pref. Nothing renders with WebGPU, and
local ML -- including any future plugin API -- should go through
Firefox's inference libraries (mozinference/onnxruntime), which are
compiled CPU-only.
2026-08-04 14:42:40 -04:00
Dan Stillman
adc5648d29 fx153: Restore pass-through clicks on toolbarbutton dropmarkers
XULButtonElement only opens a type=menu button's menu when the button
is the event's original target, which worked before because xul.css
gave .toolbarbutton-menu-dropmarker 'pointer-events: none'. That rule
was removed along with the dropmarker element, so clicks on our
recreated dropmarker did nothing.
2026-08-04 14:42:39 -04:00
Dan Stillman
300305a9fb fx153: Set menu icons via --menuitem-icon for in-content menus
The menu icon element is now an <html:img> that renders the 'image'
attribute or 'content: var(--menuitem-icon)', and 'list-style-image' is
ignored, so iconic menuitems showed broken-image placeholders on
Windows and Linux. list-style-image is kept for native macOS menus,
which still read it.
2026-08-04 14:42:39 -04:00
Dan Stillman
97de8858fe fx153: Use font glyphs for Windows titlebar buttons
Firefox 153 removed the chrome://browser/skin/window-controls/ SVGs and
now draws the caption buttons with Segoe Fluent Icons glyphs (falling
back to Segoe MDL2 Assets on Windows 10), which broke the Windows build.
Port the new browser.css button styling and stop keeping the removed
directory in build.sh.
2026-08-04 14:42:06 -04:00
Dan Stillman
770f44568c Update Windows build to Firefox 153.0esr 2026-08-04 12:55:27 -04:00
Dan Stillman
a2a419c6da Match field values without regard to case or accents for 'is'
An exact-match condition compared with SQLite's case-sensitive '=' and
skipped the normalized shadow columns, so 'publication is "review of
finance"' missed "Review of Finance" while every other kind of search
matched it.
2026-08-03 18:59:01 -04:00
Dan Stillman
0ae2e42ca2 Use proper accent color for the selected autocomplete row
In an autocomplete popup, focus remains in the text field, so the
inactive selection color was being used instead.
2026-08-03 18:59:01 -04:00
Dan Stillman
1dffe21de0 fx153: Don't embed source-repo info in custom Windows builds
Some checks failed
CI / Test (shard 3) (push) Has been cancelled
CI / Test (shard 4) (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
CI / Test (shard 1) (push) Has been cancelled
CI / Test (shard 2) (push) Has been cancelled
Better fix than d5aacafe3f -- we don't need source-repo info in our
builds at all, so just disable MOZ_INCLUDE_SOURCE_INFO rather than
synthesizing it.
2026-08-03 18:59:01 -04:00
Dan Stillman
d5aacafe3f fx153: Stamp the git source repo and changeset for Windows packaging
Firefox's official-build source-repo.h generator only auto-detects
Mercurial, so building from our git checkout left the file empty and
packaging failed with "no preprocessor directives found". Derive
MOZ_SOURCE_REPO and MOZ_SOURCE_CHANGESET from git in the mozconfig so
configure records them for any invocation, including a manual
./mach package.
2026-08-03 18:32:11 -04:00
Dan Stillman
ea30bbd2af Update version to 11.0 2026-08-03 14:14:05 -04:00
Dan Stillman
72115c3cb4 Set Rust default toolchain before adding the target
Some checks failed
CI / Test (shard 1) (push) Has been cancelled
CI / Test (shard 2) (push) Has been cancelled
CI / Test (shard 3) (push) Has been cancelled
CI / Test (shard 4) (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
app/win/build added the cross-compilation target to whatever toolchain
was default before switching to RUST_VERSION, so after a Rust version
bump the new toolchain lacked the aarch64/i686 target and the arm and
win32 builds failed at configure. Set the default first.
2026-08-03 13:06:24 -04:00
Dan Stillman
6f3e4b5499 fx153: Update Mozilla patch for Windows 2026-08-03 12:33:59 -04:00
Dan Stillman
e4ee85296c fx153: Update Rust version for Mozilla builds 2026-08-03 12:09:02 -04:00
Dan Stillman
b5ceb6fa65 fx153: Don't assign oncommand attribute strings to .oncommand
Bug 1974578 added oncommand to GlobalEventHandlers for the Invoker
Commands API, so the assignment in _initImportedNodesPostInsert() -- an
inert expando write until now -- started setting the WebIDL event
handler, and [LegacyTreatNonObjectAsNull] turns a string into null. That
wiped the handlers compiled when the pane fragment was imported, leaving
every inline oncommand handler in the preferences panes dead.

importNode() compiles the attribute handlers itself, so the loop can
just be removed.
2026-08-03 11:48:42 -04:00
Dan Stillman
35a70117b0 fx153: Restore the toolbarbutton dropmarker
Bug 1980856 removed both wantdropmarker support and the rule that gave
.toolbarbutton-menu-dropmarker its image, once Firefox's last consumer
stopped using it, so the New Item, Add Attachment, and New Note buttons
lost their chevrons, along with the ones in advanced search, the feed
settings dialog, and Scaffold.

Draw it with a background, since a <dropmarker> doesn't render
list-style-image, and use chevron-6 to match the quick search dropmarker
and the menu marker on our own buttons. The rule also moves out of the
toolbarbutton block, since a plain <button> can host one too.
2026-08-03 11:48:42 -04:00
Dan Stillman
030cd3dc5e fx153: Drop the hover background on native search clear buttons
It runs into the field's focus ring, and we don't use hover effects on
comparable buttons.
2026-08-03 11:48:42 -04:00
Dan Stillman
503bb03aec fx153: Hide the native clear button in search fields
Firefox now creates a clear button for <input type="search"> in chrome
documents regardless of layout.forms.input-type-search.enabled (bug
1655503), which doubled up with the one we draw ourselves.
2026-08-03 11:48:42 -04:00
Dan Stillman
3430ad241b fx153: Keep our own Assets.car in the Mac app
Firefox 153 ships an asset catalog with its own AppIcon, which the merge
from Firefox's Resources copied over ours, so the app got the Firefox
icon.
2026-08-03 11:48:42 -04:00
Dan Stillman
00cad2ced0 Remove 32-bit Linux build support
Mozilla stopped publishing linux-i686 builds after Firefox 144, so there's
no 153 runtime to build against.
2026-08-03 11:48:42 -04:00
Dan Stillman
2bd9342188 Don't inject a platform wizard stylesheet on macOS
There's no mac wizard.css -- the shared one from the global list is all
macOS needs, as on Linux -- so this only produced a missing-file warning
whenever a <wizard> was created.
2026-08-03 11:48:42 -04:00
Dan Stillman
d43dc2fa37 Fail the xulrunner download on an HTTP error
Without -f, curl saves the error page and the download appears to succeed,
so a missing build fails later with a confusing "Unrecognized archive
format" from tar.
2026-08-03 11:48:42 -04:00
Dan Stillman
78d21617af fx153: Hide the about:addons sidebar
The sidebar customizations all broke: the category buttons are
moz-page-nav-buttons now rather than button[name="..."], and the Settings
and Support links moved out of <sidebar-footer> into a secondary nav. The
sidebar also has a heading now that duplicates the main pane's "Manage
Your Plugins", so hide the whole column instead of the pieces.
2026-08-03 11:48:41 -04:00
Dan Stillman
7793b469c9 fx153: Hide the Help button label on macOS
-moz-mac-help-button draws the question mark itself, and the Help label is
now painted over it at the bottom of the settings panes. Firefox hides the
label the same way for the Page Info help button (bug 2009625).
2026-08-03 11:48:41 -04:00
Dan Stillman
8110ab4eea Add a newline after the Zotero prefs in the built prefs file
Babel strips the trailing newline from defaults/preferences/zotero.js, so
the platform-specific prefs appended after it shared a line with the last
Zotero pref.
2026-08-03 11:48:41 -04:00
Dan Stillman
45e38322e1 fx153: Keep backup-constants.mjs
SelectableProfile.sys.mjs now statically imports BackupService, which
statically imports chrome://browser/content/backup/backup-constants.mjs,
so startup failed once SelectableProfileService was instantiated as a
command-line handler.
2026-08-03 11:48:41 -04:00
Dan Stillman
2eba3398e9 fx153: Restore Settings in the macOS application menu
nsMenuBarX now looks for a menuitem with the id menu_settings on Ventura
and later, falling back to menu_preferences only on older versions, so
declare both the way Firefox does.
2026-08-03 11:48:41 -04:00
Dan Stillman
01b7d0667c fx153: Move to nsIPKCS11Token for the NSS key database
Bug 2037682 removed nsIPK11TokenDB in favor of getting the internal key
token directly from @mozilla.org/security/internalkeytoken;1, and bug
2043434 replaced initPassword()/needsUserInit with changePassword().
2026-08-03 11:48:41 -04:00
Dan Stillman
a32dd2b959 fx153: Don't freeze built-ins in the translation sandbox
Bug 2017957 made Cu.Sandbox freeze built-ins by default for
system-principal sandboxes, so the translation framework's assignments to
Promise silently failed and loading the framework threw on
Zotero.Promise.method.
2026-08-03 11:48:41 -04:00
Dan Stillman
6fbe5e4135 fx153: Match XUL boolean attributes in selectors without a value
Bug 2008041 made disabled, checked, hidden, collapsed, and selected
boolean attributes, so their value is empty and [disabled="true"] no
longer matches. Nothing sets any of them to "false", so matching on
presence alone is equivalent.
2026-08-03 11:48:40 -04:00
Dan Stillman
567cc2d43a fx153: Set XUL hidden/collapsed as boolean attributes
Bug 2008041's change to boolean attributes also covers hidden and
collapsed, whose UA selectors became [hidden] and [collapsed], so
setAttribute('hidden', false) now hides the element. Switch the setters
that can be passed a falsy value to toggleAttribute(), read them with
hasAttribute(), and match the [collapsed=true] selectors in our own
stylesheets to the new presence-only form.
2026-08-03 11:48:40 -04:00
Dan Stillman
f245f5c2b2 fx153: Set XUL checked/disabled as boolean attributes
Bug 2008041 made them html-style boolean attributes, so presence alone
means true and setAttribute('disabled', false) now disables the element.
Switch the sites that can be passed a falsy value to toggleAttribute(),
read them with hasAttribute(), and drop a disabled="false" from markup.
Sites that only ever pass true are left alone.
2026-08-03 11:48:40 -04:00
Dan Stillman
bcd8ad20ec fx153: Use command events for checkbox changes
Bug 2009806 moved XUL checkbox click handling into C++ and dropped the
CheckboxStateChange event, so listen for command instead. The event now
only fires on user interaction, so the tests have to click the checkboxes
rather than assign to .checked.
2026-08-03 11:48:40 -04:00
Dan Stillman
eac3838f00 fx153: Use ChromeUtils.predictRemoteTypeForURI() in HiddenBrowser
Bug 2011326 moved remote type prediction into C++ and removed
E10SUtils.predictOriginAttributes() and getRemoteTypeForURI(). The
resulting TypeError meant nothing ever loaded in the hidden browser.
2026-08-03 11:48:40 -04:00
Dan Stillman
bca6537e6d fx153: Allow eval() in the parent process
Translators are evaluated with the system principal, which worked until
now only because nsContentSecurityUtils::IsEvalAllowed() exempted any
profile with "JS hacks" present -- which for us meant
xpinstall.signatures.required being false. Bug 2038660 dropped that
exemption, so ask for eval explicitly.
2026-08-03 11:48:40 -04:00
Dan Stillman
5ea6243384 fx153: ownerGlobal -> documentGlobal
Bug 2033243 renamed the attribute and moved it from EventTarget to Node.
2026-08-03 11:48:40 -04:00
Dan Stillman
3bb3b4f2c9 fx153: Move off the removed synchronous nsILoginManager methods
findLogins() now throws, and removeLogin()/modifyLogin()/removeAllLogins()
are Async-suffixed and return promises. Without this, Zotero couldn't read
the stored API key and showed the corrupted-logins-database error on
startup.

There's no synchronous read left, so Zotero.Sync.Runner.enabled -- which is
consulted from places that can't await -- now reads a value that
hasCredentials() caches.
2026-08-03 11:48:39 -04:00
Dan Stillman
1c005c7e21 fx153: Re-enable chrome: DTD loading
Bug 2043845 put the FORCE_ALLOWED_DTD content policy type behind a pref
that's off for everything but Thunderbird, so NS_NewChannel() refused the
load with NS_ERROR_CONTENT_BLOCKED and the XML parser silently skipped the
entity. Custom elements whose markup uses DTD entities then failed to
parse with "not well-formed XML".
2026-08-03 11:48:39 -04:00
Dan Stillman
14b43c9559 fx153: Disable Firefox's baseline CSP for chrome: documents
Bug 2038660 applies "script-src chrome: resource: moz-src:" to every
chrome: document, which blocks inline <script>s and inline event
handlers, so the main window loaded but ran none of its scripts.

We should move our inline scripts and event handlers into separate files
so that we can drop the pref.
2026-08-03 11:48:39 -04:00
Dan Stillman
b7232f130f fx153: Don't remove the Pocket actor, removed from Firefox 2026-08-03 11:48:39 -04:00
Dan Stillman
c192127ab1 fx153: Take over <search-textbox>, removed from Firefox
Mozilla removed the widget and its stylesheet in bug 1968916 without a
drop-in replacement, so bring both into Zotero. The two rules that lived
in Firefox's UA sheets (text-shadow and -moz-window-dragging) move to
_search.scss, and the aria-autocomplete removal that fetch_xulrunner
used to patch in is now part of the widget itself.
2026-08-03 11:48:39 -04:00
Dan Stillman
d701c43862 fx153: Restore autocomplete popup sizing from the anchor element
Firefox now sizes autocomplete popups to their content (bug 2045828), so
add the --panel-width calculation back instead of adjusting it.
2026-08-03 11:48:39 -04:00
Dan Stillman
06848ce17f fx153: Update about:addons patches for the ES module split
aboutaddons.js and aboutaddonsCommon.js were split into
aboutaddons-utils.mjs plus per-component modules under components/, and
the addon details template moved out of aboutaddons.html into
addon-details.mjs.

The unsigned-addon warning is now suppressed through Firefox's own
isUnsignedWarningMessageDisabled(), which is otherwise gated on
MOZILLA_OFFICIAL.
2026-08-03 11:48:38 -04:00
Dan Stillman
408179ad09 fx153: Anchor the actor-removal patterns in ActorManagerParent
AboutTranslations and the PictureInPicture actors moved out of the
JSWINDOWACTORS literal into conditional assignments after it.

Anchor every pattern to the start of the line while we're here, since
'PictureInPicture: {' matched the MozTogglePictureInPicture event name in
the new file and silently deleted everything through the next '  },'.
2026-08-03 11:48:38 -04:00
Dan Stillman
242bbccda5 Update Mac and Linux builds to Firefox 153.0esr 2026-08-03 11:48:38 -04:00
Dan Stillman
fdd3434349 Update English strings for Transifex 2026-08-03 11:12:15 -04:00
Dan Stillman
c9d5aa3c8e Use general strings for file renaming prompt buttons
The invalid-template prompt had its own strings for "Go Back" and
"Reset to Default".
2026-08-03 11:08:55 -04:00
Dan Stillman
d54327a045 Fix retracted-item icon spacing in items list
Some checks failed
CI / Test (shard 1) (push) Has been cancelled
CI / Test (shard 2) (push) Has been cancelled
CI / Test (shard 3) (push) Has been cancelled
CI / Test (shard 4) (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
The gap after the icon came from whitespace baked into the legacy
cross.png, so it disappeared when the icon switched to the
edge-to-edge cross.svg and the title abutted the icon.
2026-08-01 10:42:29 -04:00
Mynacol
b5ea455c1f
Fix release build on x86 mac (#5926)
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
While trying to [fix](https://github.com/NixOS/nixpkgs/pull/519431) another issue in the Zotero package for nixpkgs, I discovered a new bug. When setting a non-`source` update channel, the build fails on MacOS with x86 architectures.

The build fails with:
```
source not found twice in ChannelPrefs

source

stringWithCString:encoding:
```
Which definitely means it is caused by the `strings` command [here](https://github.com/zotero/zotero/blob/main/app/mac/set-channel-prefs-channel#L29).

When manually executing the strings command on the file, I can repeat getting only one `source` result on x86 mac, while getting two on arm64 or linux. After digging around, I tried with the flag `-arch all`, and both `source` values are found on x86 mac. Full command: `strings -n 3 -arch all $binary`.
2026-07-31 13:41:33 -04:00
Adomas Venčkauskas
9c03a93e00
Fix tree multi-selection collapse/expand behaviour (#5983)
Closes #5974.

Additional fixes for broken item tree behaviour when multiple items are
selected, and changing focus with ctrl/cmd-arrow keys.

Aligned Collection Tree/Virtualized Tree collapse/expand behaviour when
multiple containers are selected, one of them is focused, and arrow key
left-right is pressed, to the behaviour in Item Tree - now all of them
are collapsed/expanded.

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-07-31 13:25:01 -04:00
Martynas Bagdonas
a7cae87be8
Improve undo/redo in the note editor (#3398)
- Fix "redo" command not enabled in the note editor
- Centralize note editor undo and redo commands
- Update note editor submodule

Co-authored-by: Tom Najdek <tom@doppnet.com>
2026-07-31 14:22:53 +02:00
Dan Stillman
4ec5ba9c27 Don't fail translation on open-access lookup error 2026-07-30 20:59:07 -04:00
Dan Stillman
7abcf23ef7 Move PMC lookup after open-access lookup
The PMC lookup in #5906 was added before the OA lookup, but the OA
lookup often returns a PMC URL of its own (including, at least now, for
the DOI given in the PR), with a direct file URL rather than a page to
scrape, so try it first and fall back to the PMCID-derived URL only when
it turns up nothing.
2026-07-30 20:56:28 -04:00
Dan Stillman
8bebaf0ead Fix open-access lookup for PMCID items during in-app translation
Since #5906, the 'oa' resolver list can start with a plain URL object
for items with a PMCID, but _getOpenAccessPDFURLs() and
saveOpenAccessAttachment() called resolvers[0](), which threw for those
items -- skipping the lookup silently in the first case and failing the
save in the second.
2026-07-30 20:55:16 -04:00
Dan Stillman
80658e928e Handle download challenge on PubMed Central
PMC now returns a proof-of-work challenge page in place of the PDF.
2026-07-30 16:49:59 -04:00
Dan Stillman
4388f6da20 Drop redundant charset extraction in blobToText()
readAsText() already reads the charset from the blob's type when no
encoding is passed, so pulling it out first had no effect. The regex
was also missing a quantifier and captured a single character, which
readAsText() discarded as an unrecognized label.
2026-07-30 15:49:43 -04:00
Dan Stillman
9ed00c843d Don't update read status when using Show File
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
Show File triggered a file 'open' notification, so revealing a file
moved its item to the top of Recently Read. Use a separate 'reveal'
event, which file syncing still observes to queue a modification check.

https://forums.zotero.org/discussion/133006/
2026-07-30 13:43:41 -04:00
Dan Stillman
08880f7a0e Update citeproc.js to include Juris-M/citeproc-js#286
Ignore unknown style-level attributes instead of failing to load the
style, so that additive style-level attributes can be adopted in future
CSL versions without breaking deployed processors [1].

[1] https://discourse.citationstyles.org/t/faster-csl-specification-updates/2050
2026-07-30 09:43:01 -04:00
Tom Najdek
c39f16891f Extend the template engine and add template validation (#5989)
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
- Fix multiple potential scenarios causing a template engine crash
 - Add support for specifying string literals in the template engine
 - Validate `if/else/elseif` order and matching clause closures
 - Validate to ensure every `{{` is properly closed with a matching `}}`
 - When a template is invalid, display a warning, do not offer batch-renaming tools, do not update synced setting
 - When a template is invalid, prompt the user to fix or reset the template when

Closes #5965
2026-07-29 13:30:12 -04:00
Tom Najdek
efcfaec5d4 Move templating engine to a standalone, lazy-loaded module (#5989) 2026-07-29 13:30:03 -04:00
Dan Stillman
dc6d55a137 Remove collectionTreeRow from the plugin menu context
Menu plugins reading it acted on one arbitrary row of the selection.
Reading it now throws and names collectionTreeRows, which the context
has already provided since multi-collection selection landed.

The context now copies property descriptors rather than values, since
copying values would evaluate the throwing collectionTreeRow getter for
every menu.
2026-07-29 13:22:58 -04:00
Dan Stillman
783da0e66e Don't offer Remove from Collection if saved search is selected
Collections and saved searches can be selected together, and the
search's items don't need to be in any of the collections, which would
result in search-only items being moved to the trash.
2026-07-29 13:12:47 -04:00
Dan Stillman
1d97f6448e Replace ItemTree#collectionTreeRow with a validated view mode
The view-wide branches (trash, duplicates, feeds, Recently Read) read
the first selected row, which multi-collection selection preserved with
a getter rather than updating. setCollectionTreeRows() now derives the
kind of view the selection adds up to, throwing if the rows disagree,
and those branches test it.
2026-07-29 13:12:47 -04:00
Dan Stillman
5d1a2cba32 Remove the singular collection tree selection getters
Multi-collection selection left .collectionTreeRow and similar in place
to reduce breakage, but that would just leave plugins and other callers
potentially broken when multiple rows were selected. All singular
getters now throw and say what to use instead. getSelectedLibraryIDs()
was added to replace getSelectedLibraryID().
2026-07-29 13:12:47 -04:00
Dan Stillman
e45871fa9d Don't treat a selected saved search as a collection
Collections and saved searches can be selected together, so a
collection-item change called getDescendents() on rows that don't have
it and compared search IDs against collection IDs.
2026-07-29 12:55:41 -04:00
Dan Stillman
c92c75eb36 Mark read attachments in every selected library
Recently Read rows can span libraries, but read attachments were marked
as matches for the first row's library only, leaving the rest as grayed
context rows.
2026-07-29 12:55:40 -04:00
Dan Stillman
3da869b2e6 Keep library headers in place when the items list is re-sorted
Header and spacer rows stayed in the row list during a sort and were
ordered as if they were items, so a column sort could move them out of
position.
2026-07-29 11:33:15 -04:00
Dan Stillman
85a33e1586 Don't treat library header and spacer rows as items
Code walking the items list assumed every row was an object, so the
headers and spacers shown whenever more than one row is selected got
picked up as items: getSortedItems() passed them to export and report
generation, restoring from the trash called item methods on them, and
the item pane counted them in "N items in this view".
2026-07-29 11:33:14 -04:00
Dan Stillman
3bf74a3e46 Local API: Actually exempt file uploads from Zotero-Server-ID
The requireServerIDOnWrite flag was added to the base endpoint class but
never set on the upload receiver, so uploads sent without the header
were still rejected with 428.
2026-07-29 10:18:45 -04:00
Dan Stillman
ae98136ec8 Save uploaded objects to the sync cache on an unchanged response
The cache-existence check didn't await getCacheObject(), so the
promise was always truthy and no cache object was ever saved for
objects the server reported as unchanged. Without a cached version,
later remote changes to those objects produced avoidable conflicts.
2026-07-29 00:06:42 -04:00
Dan Stillman
2fb8d69a93 Auto-resolve lastRead conflicts without a cached version
lastRead conflicts were auto-resolved only when a cached version of
the object was available, so differing read times could still trigger
the conflict resolution window.
2026-07-28 23:56:29 -04:00
Abe Jellinek
681c48f1c2 Local API: Don't validate Zotero-Server-ID for file uploads
Some checks are pending
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
https://github.com/urschrei/pyzotero/issues/344#issuecomment-5108140508
2026-07-28 12:34:40 -06:00
Dan Stillman
caeffa9f41 Citation dialog: Hide the citation preview until the citation has items
Show the preview area and its toggle button only once there is
something to preview, instead of showing a "Preview" placeholder in an
empty dialog.
2026-07-28 12:29:59 -04:00
Dan Stillman
b66519cb4c Citation dialog: Hide the list layout divider when the list is empty
With nothing in the list, the layout's divider sat directly above the
bottom area's divider, showing a doubled line below the input field.
2026-07-28 12:18:21 -04:00
Dan Stillman
db5e7edb49 Citation dialog: Show number of items the + button will add in a tooltip
The citation dialog's + column now has a tooltip that reflects how
many items a click will add based on the current selection, e.g.,
"Add 3 Items to Citation".
2026-07-28 12:18:13 -04:00
Dan Stillman
7925b4e9ac Citation dialog: Add all selected items on + click in Library mode
Clicking the + button on a row that is part of a multi-item selection
now adds all selected items to the citation, matching the existing
list-mode behavior. Clicking + on an unselected row still adds only
that item.
2026-07-28 12:16:41 -04:00
Dan Stillman
93d66e3999 Citation dlg: Don't enter locator-typing mode after adding multiple items
With focus moving back to the input after a multi-item add, a typed
number was applied as a page locator to every just-added item. It now
starts a search instead. Single-item adds still enable the typed-locator
shortcut.
2026-07-28 12:16:11 -04:00
Dan Stillman
938c414e0c Citation dialog: Fix post-add scroll crash that left focus in the items list
_scrollItemTreeToRow() parsed the row index from the wrong rowID
segment, so it threw on every call, and adding items from the items list
never returned focus to the input as intended.
2026-07-28 12:16:01 -04:00
Dan Stillman
8526a022ec Move local API authorization prompt button labels to general strings 2026-07-28 10:04:02 -04:00
Tom Najdek
75b78b410b
Ensure emoji detection works as intended with Unicode 17 implementation (#6004) 2026-07-28 10:02:35 -04:00
Abe Jellinek
a37a9e782a Add Zotero-Server-ID, require for writes, validate when provided
Every local API response includes a stable per-database server ID so
that clients can partition cached data, especially local object
versions, by Zotero instance. Write requests must include the ID, and
when it's provided on any request it must match the current server.

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-07-28 09:57:44 -04:00
Abe Jellinek
77f2432103 Local API: Support write requests
Add support for item, collection, and search writes (POST/PUT/PATCH/
DELETE), tag deletion, full-text writes, and the three-phase file
upload flow. Writes require a local API key granted by the user via a
confirmation dialog (POST /api/local/authorize) and follow the web
API's concurrency model, with If-Unmodified-Since-Version and
per-object version preconditions checked against local versions.

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-07-28 09:57:44 -04:00
Abe Jellinek
9dd17a212e Track data object versions locally
Add a clientVersion column for items, collections, searches, and
libraries, incremented once per library per transaction on every
object save or deletion. The local API reports these versions instead
of synced versions -- in object JSON, format=versions, since=
filtering, and Last-Modified-Version -- since synced versions don't
reflect local changes and are 0 for unsynced objects. Group metadata
responses keep reporting the synced group version, which has no local
counterpart.

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-07-28 09:57:43 -04:00
Dan Stillman
12114f6a86 Fix binary file corruption in multipart/form-data parsing
_decodeMultipartData() trimmed each part body, mangling file content that
begins or ends with a whitespace byte (e.g., a PDF ending in a newline).
2026-07-28 09:57:43 -04:00
Dan Stillman
ce20a5f228 Ship legacy Safari App Extension alongside the web extension on Mac
Developer ID-signed Safari web extensions load only in Safari 18.4 and
later -- older Safari blocks them at the code-signing layer -- so macOS
11 and 12 users, whose Safari versions top out at 16.6 and 17.6, lost
the connector with the web extension conversion.

Embed the prebuilt legacy App Extension ($SAFARI_APP_EXTENSION, set by
the deploy scripts) at Contents/PlugIns/ZoteroSafariExtension.appex with
the historical bundle identifier, and move the web extension to
Contents/PlugIns/ZoteroSafariWebExtension.appex with a new
.SafariWebExtension identifier. The web extension's
SFSafariAppExtensionBundleIdentifiersToReplace key causes Safari
versions that can load it to hide the App Extension and migrate its
enabled state, while older Safari shows only the App Extension.

Also remove the removed-files entries for the App Extension's
resources, which would otherwise delete them on update.

https://forums.zotero.org/discussion/132925/
2026-07-28 07:24:27 -04:00
Dan Stillman
91d7e73d26 Strip com.apple.FinderInfo xattrs from files in Mac disk images
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
hdiutil makehybrid gives every file on the image non-empty Finder info
(it sets an icon location), which appears as a com.apple.FinderInfo
extended attribute. codesign --verify --strict rejects FinderInfo as
detritus, and it can cause Safari to fail to load the web extension.
(Reported by a user with Safari 17.6 on macOS 12. No other reports from
the beta, so maybe not universal.) The Safari App Extension apparently
wasn't affected, since it shipped with the same attributes for years.

Convert the hybrid image to a read-write image, mount it, strip the
attributes from its files, and compress from that. The volume header is
untouched, so the open-folder flag that makes Finder open the volume
window on mount is preserved.

Only fresh installs from the DMG were affected. The updater writes fresh
files without the attributes, so copies updated in place were clean.
(Notably, this is the reverse of the post-update extension breakage for
which the standard advice has always been to delete Zotero.app and
redownload. Following that advice is exactly what resulted in a broken
copy here.)

https://forums.zotero.org/discussion/132925/
2026-07-27 15:31:18 -04:00
Dan Stillman
566115dc7c Use a fixed menu padding on Windows and Linux
Some checks failed
CI / Test (shard 1) (push) Has been cancelled
CI / Test (shard 2) (push) Has been cancelled
CI / Test (shard 3) (push) Has been cancelled
CI / Test (shard 4) (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
The toolkit's default menuitem padding is em-based, so it balloons
with the UI font size in menulist dropdowns (e.g., the item type
menu), which inherit that font, forcing long lists to scroll. macOS
uses a fixed value on all menus and is unaffected. Match that on
Windows and Linux, slightly roomier, so every menu stays compact
regardless of font size.

https://forums.zotero.org/discussion/132797/request-for-compact-view-in-dropdown-menus
2026-07-24 13:30:36 -04:00
Dan Stillman
512a2444d8 Add timeout to HiddenBrowser::getPageData()
The queries wait for the document to be ready, so a page that never
finished loading would hang the caller -- e.g., full-text indexing --
forever.
2026-07-24 13:11:50 -04:00
Dan Stillman
9eea7d9a0c Disable JavaScript when indexing HTML files
Page scripts otherwise run during indexing and can hang it. JavaScript
was disabled here in 2a7f31813e for the same reason, but that was lost
in the fx-compat rewrite (13adfd131c).

https://forums.zotero.org/discussion/132901/
2026-07-24 13:11:50 -04:00
Dan Stillman
3a54a5ecb1 Fix allowJavaScript option in HiddenBrowser
allowJavaScript: false didn't disable scripts for a system-principal
document, such as a blob: URL created from chrome code, which runs
scripts regardless of the allowJavascript flag. Sandbox the document
instead, forcing a null principal and blocking script execution.
2026-07-24 13:11:50 -04:00
Dan Stillman
0b32e93cb1 Batch retraction refresh notifications instead of one per item
The retraction checker fired a separate 'refresh' notification for
every matched item on each check, including already-known retractions
that hadn't changed. At startup this produced a burst of events that
forced observers like the item tree to rebuild repeatedly. Batch each
operation's changes into a single notification, and notify only for
items whose retraction state actually changed.
2026-07-24 10:56:36 -04:00
Dan Stillman
a81af0c268 Don't show Extra migration progress window unnecessarily
The candidate scan counted items whose Extra content parsed as fields
but couldn't actually be migrated (e.g., fields already set on the
item), so the window could appear on every global schema update without
changing anything.

Also use a dedicated headline instead of "Upgrading database…", and show
the window only if the migration is still running after 500 ms.
2026-07-23 23:21:01 -04:00
Martynas Bagdonas
ea4b301f73 Avoid SDT test fixture updates on version bumps
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
2026-07-23 20:24:21 +03:00
Dan Stillman
4f825ad50c Don't throw getting the filename of a stored file with a corrupt path
A stored file's path is normally 'storage:<filename>', which is parsed
as a string, but some ancient libraries apparently have relative paths
('../.../foo.pdf') that fell through to PathUtils.filename() and threw
NS_ERROR_FILE_UNRECOGNIZED_PATH, breaking syncing.

Resolve stored-file leaves as strings regardless of prefix and reserve
PathUtils.filename() for linked files, whose paths are genuine absolute
paths.

https://forums.zotero.org/discussion/132861/zotero-sync-issue-id-1987012678
2026-07-23 11:12:12 -04:00
Dan Stillman
6fb30346e6 Bundle Safari web extension instead of Safari App Extension
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
The connector is now a Safari web extension, so the bundled appex is a
static wrapper stub whose placeholder resources are replaced at build
time with a connector build via $SAFARI_EXT_RESOURCES. The stub only
needs to be rebuilt when the native wrapper project changes, not for
connector releases.
2026-07-22 15:11:23 -04:00
Dan Stillman
a4b39b91f3 Exclude trashed items from tag autocomplete suggestions
https://forums.zotero.org/discussion/132875/some-tag-suggestions-appearing-capitalised
2026-07-22 11:46:52 -04:00
Dan Stillman
146520aed5 Reload quick search when changing the search mode
Changing the quick-search mode dropdown didn't re-run the current
search, since the filter was applied without a mode and the unchanged
search text made setSearch() report no change.

Regression from 5ca1fbb167

https://forums.zotero.org/discussion/132873/beta-quick-search-isnt-reloaded-when-changing-search-mode
2026-07-22 11:14:23 -04:00
Dan Stillman
cddb19bf36 Only reject and strip actual directory paths in stored-file filenames
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
ee68452b treated any backslash as a directory separator, in both the
attachmentPath setter and the userdata 128 migration. But backslashes
are technically valid on Linux/macOS and appear in real filenames (due
to LaTeX in titles, etc.), so that would wrongly throw on or truncate
them. Only a forward slash (never valid in a filename) or a Windows
absolute path (drive-letter or UNC prefix) reliably indicates a leaked
directory path, so treat just those as paths and leave bare backslashes
alone. We should make sure we're running getValidFileName() everywhere
to avoid saving those.
2026-07-21 16:02:40 -04:00
Dan Stillman
e81e72dccf Fix negated Title/Creator/Year and Any Field advanced searches
These conditions expanded into an OR-group across their underlying
fields, so a "does not contain"/"is not" operator matched almost every
item: any item missing one of the fields satisfied that field's negated
condition. Use an AND-group for negative operators, so the value must be
absent from every field.

https://forums.zotero.org/discussion/132835/
2026-07-21 14:15:45 -04:00
Dan Stillman
40974e493d Fix Cmd/Ctrl-A not selecting all libraries when feeds are visible
Selecting all libraries pulled in feed rows, which belong to a different
visibility group and so can't be shown together, collapsing the
selection back to a single row. Constrain the all-libraries scope to the
current selection's visibility group. Also preventDefault() the shortcut
so it no longer falls through to the cmd_selectAll key command, which
threw NS_ERROR_FAILURE.

https://forums.zotero.org/discussion/132843/beta-cannot-select-all-libraries
2026-07-21 14:04:00 -04:00
Dan Stillman
621c0fbb91 Fix storageLocal test broken by ee68452b0
The download-rename test used a backslash as its sample invalid
character, which now throws in the attachmentFilename setter. Use a
colon instead, which still tests download-time filtering.
2026-07-21 11:08:42 -04:00
Dan Stillman
ee68452b05 Disallow slashes in stored-file attachment paths
Someone ended up (via a plugin, presumably) with stored-file attachments
with a full path after 'storage:', which broke file syncing. Throw when
setting a stored-file path containing a slash, and strip paths from
existing filenames in a schema update step. No particular reason to
think that the file with that basename will exist in the storage dir,
but at least it will be looking for the right file and not be totally
broken.

Separately, the dataserver will clean up filenames with full paths and
block going forward.

https://forums.zotero.org/discussion/132822/reference-sychronization-error
2026-07-21 10:40:59 -04:00
Dan Stillman
5877952954 Add accented stop-words to abbreviations word list
Accented stop-words weren't matched by the existing unaccented
entries (e.g., "fur"), so automatic journal abbreviation kept and
capitalized them: "Jahrbuch für Heimatkunde" became "Jahrb. Für
Heimatkunde" instead of "Jahrb. Heimatkunde".

https://groups.google.com/g/zotero-dev/c/uP18QEKe2JU/m/AsoGWxd9AwAJ
2026-07-20 22:52:51 -04:00
Tom Najdek
ccb592ba68
Advanced Search: Use dedicated WCAG-compliant colors for a warning (#5990)
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
2026-07-20 23:37:23 +02:00
Abe Jellinek
ddcdea3795 Read Aloud: Reword highlight granularity to "Highlight current" 2026-07-20 13:43:39 -04:00
Abe Jellinek
14c6167a4c Update reader submodule 2026-07-20 10:50:56 -04:00
Abe Jellinek
5a785c4e0f Read Aloud: Support highlight granularity customization & timestamps 2026-07-20 10:50:56 -04:00
Dan Stillman
ccbeab61e2 Stop full-text index queue drains that aren't making progress
Some checks failed
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
CI / Test (shard 1) (push) Has been cancelled
CI / Test (shard 2) (push) Has been cancelled
CI / Test (shard 3) (push) Has been cancelled
CI / Test (shard 4) (push) Has been cancelled
If queued items can't be indexed and removed for any reason, the
startup and background drains would otherwise run forever. Stop after
three passes without the queues shrinking; the items are picked up
again on the next trigger.
2026-07-18 14:33:21 -04:00
Dan Stillman
59c1801a10 Fix looping re-extraction of full-text queue items with no text
If a queued attachment was missing its cache file and re-extraction
produced no text, nothing was recorded in the index state, so the
content-index queue selected the same items forever and the startup
drain never finished.

https://forums.zotero.org/discussion/132808/
2026-07-18 14:33:13 -04:00
Dan Stillman
0dc256166a Check content-index drain time budget between items
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
The budget was only checked after each 50-item chunk, so a chunk of
large documents could tie up the main thread for longer than maxTime.
2026-07-17 14:07:38 -04:00
Dan Stillman
8437de1a4f Clarify Index Statistics labels
Say "Attachments indexed"/"Partially indexed" instead of
"Indexed"/"Partial", reverse "File or full-text content not
available", and list notes last so the attachment rows are contiguous.
2026-07-17 13:58:42 -04:00
Abe Jellinek
4a7c359ae2
Add Clear All Last Read Dates… to Recently Read context menu (#5879) 2026-07-17 13:52:37 -04:00
Dan Stillman
f171e7b5d8 Clear read-only attribute on Windows if file removal fails
A stale read-only file in the temp directory caused the bundled styles
update to fail at every startup, which also broke Quick Copy and note
translators. Try to clear it automatically in
Zotero.File.removeIfExists().

https://forums.zotero.org/discussion/132781/
https://forums.zotero.org/discussion/132798/
2026-07-17 13:19:25 -04:00
Martynas Bagdonas
c233fcf5f0 Fix reopening reader tabs during queued close notifications
Fixes https://forums.zotero.org/discussion/comment/515471/#Comment_515471
2026-07-17 20:11:49 +03:00
Dan Stillman
30b5bf4bb9 Keep progress popups from floating over other apps' windows
The progress popup was opened with alwaysontop, which is system-wide,
so a long-running popup (e.g., full-text indexing) stayed on top of
other apps' windows after switching away from Zotero. Open it as a
dependent window instead, which keeps it above only the Zotero window.
2026-07-17 12:45:24 -04:00
Dan Stillman
d739fed03e Tweak wording in full-text indexing progress window 2026-07-17 12:41:30 -04:00
Dan Stillman
bcfa43b7e9 Fix routing of search terms mixing CJK and non-ASCII words
A term mixing CJK with non-ASCII words (e.g., Cyrillic plus Japanese)
was routed to the CJK index with only its CJK characters, matching
every document that contained those. Treat any non-CJK letter or digit
as making a term mixed-script, which falls back to a literal scan of
the cached text.
2026-07-17 12:41:30 -04:00
Dan Stillman
0ce289a7fe Use a word index for full-text content search
Replace the trigram FTS5 index for attachment content with a unicode61
word index, so terms match whole words with the final token as a prefix
("archive" matches "archives", but "ion" doesn't match "condition"), as
in the pre-FTS5 word index. A multi-word phrase gets adjacent-token
candidates from the index and is then verified against the cached text
of just those items, since FTS5 ignores what separates adjacent tokens;
the verification treats whitespace and hyphen runs as equivalent
(they're frequently extraction layout or styling) but requires other
punctuation to match literally. Notes keep the trigram index and CJK
matching is unchanged; the index database version is bumped so the
index is rebuilt.

Follow-up to #5979
2026-07-17 12:41:19 -04:00
Dan Stillman
228799774f Sign both per-arch JNA .jnilibs in LibreOffice plugin during Mac build
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
JNA 5.x ships per-architecture macOS native libraries instead of a
single com/sun/jna/darwin/ directory, so the notarization re-signing
step failed with "filename not matched".

This step can be removed entirely once the plugin ships a jna.jar
without the macOS natives, which are never loaded.
2026-07-16 12:54:47 -04:00
Dan Stillman
f8f83cceac Update global schema (locales) 2026-07-16 12:29:53 -04:00
Dan Stillman
10b1dbb785 Update locales from Transifex 2026-07-16 12:28:02 -04:00
Dan Stillman
994d557e92 Say "Migrating" instead of "Updating" user data tables in debug output
"Updating" appears all over debug output, so this makes schema
migrations easier to search for.
2026-07-16 11:46:47 -04:00
Dan Stillman
fb20a84ab7 Handle stale WAL files in corrupted-database recovery
SQLite replays a leftover -wal file (e.g., from a force-quit) into
whatever file next occupies the database path, so copying a backup
over zotero.sqlite produced a corrupted-database error, and the
automatic restore recreated the same mismatch and failed every time.

When corruption is detected, check if the database file is valid without
its journal files, and if so, save a verified copy and restart, swapping
the copy in at the next startup before the database is reopened. (The
copy is made before shutdown because SQLite automatically checkpoints
the WAL into the database file when the last connection closes, which
would write the stale WAL data into the file.) Otherwise, move journal
files along with the .damaged file to clear them from the main path
before restoring from the automatic backup or creating a new database.

Since a mismatched WAL can cause subtle data damage without errors, also
run a full integrity check at startup after an unclean shutdown. Skip
the explicit close-time WAL checkpoint once corruption has been flagged,
and truncate the WAL during idle maintenance to limit stale WAL data.
2026-07-16 11:43:31 -04:00
Dan Stillman
a2c7e0c00e Support saving and restoring main-window progress meter state
showZoteroPaneProgressMeter() now returns a token capturing the
previous message, meter mode and position, and owner, and
restoreZoteroPaneProgressMeter() restores that state if no other
operation has changed the display since, with nested tokens restoring
in reverse order.
2026-07-16 11:43:31 -04:00
Dan Stillman
6c5d160895 Fix citing and locale selection for locales without a CSL locale
The CSL locales repository replaced locales-sr-RS.xml with script
variants, so citing with a stored or default 'sr-RS' locale loaded no
terms and failed with an et-al error. Resolve unavailable locales to
the closest available CSL locale (sr-Cyrl-RS for sr-RS) when rendering
and in locale selectors.

https://forums.zotero.org/discussion/comment/515598/#Comment_515598
2026-07-16 11:28:21 -04:00
Dan Stillman
d3b04e7748 Date forced backups from the backup time
Backup copies preserve the database file's mtime, and the backup
interval is measured from the backup file's mtime, so a forced
pre-update backup of a long-idle database could be rotated out a day
early. Regular backups still keep the database mtime, which the
unchanged-database check relies on.
2026-07-15 22:48:08 -04:00
Dan Stillman
404fb4c3ae Fix backup before user-initiated DB repair
The backup before repairing integrity-check errors from the Advanced
pane has thrown a TypeError since backUpDatabase() started requiring an
options object in 8.0, aborting the repair. Also force the backup so a
recent automatic backup can't cause it to be skipped.
2026-07-15 22:43:24 -04:00
Dan Stillman
d78cceac71 Don't repeat forced pre-update backup after a failed schema update
If a schema update committed the userdata upgrade but kept failing in a
later step, each restart forced another rotation backup of the
now-upgraded database, deleting the pre-upgrade backup after numBackups
restarts. Record the pending target versions in the database when
making a forced backup and skip the backup while they're unchanged, so
the pre-update backup survives the normal rotation period.
2026-07-15 22:42:26 -04:00
Dan Stillman
cae3ab6160 Fix layout of main-pane progress bar with text label
E.g., "Upgrading database…"
2026-07-15 18:24:21 -04:00
Dan Stillman
73c45f8ec9 Show "Upgrading database…" based on upgrade duration
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
Replace the manually maintained minorUpdateFrom flag, which was easy to
forget to update when adding a slow upgrade step and couldn't account
for database size or hardware. The message is now shown for any upgrade
still running after 500 ms.
2026-07-15 17:58:43 -04:00
Dan Stillman
ea2ee7391d Force a regular backup before all DB upgrades, and drop versioned backups
Versioned backups (zotero.sqlite.<version>.bak) were kept until the
next userdata upgrade, potentially bloating the data directory by
gigabytes, while minor upgrades made no backup at all. Now any userdata
upgrade, integrity check, or global schema update forces a rotation
backup. Since versioned backups ignored backup.numBackups, setting that
to 0 now fully disables backups, including before upgrades.
2026-07-15 17:43:29 -04:00
Dan Stillman
02fb0e92ed Rework the Index Statistics preferences pane
Show indexing progress as a bar (items in the search index out of those
that will be) that resolves to "up to date", alongside
Indexed/Partial/Notes counts and a "File or full-text content not
available" count for attachments with no local file or full-text
content. While the pane is open, trigger indexing directly so it
advances as the user watches.

Remove the Rebuild Index and Clear Index buttons. Rebuild Index marked
all content unsynced and re-uploaded it, triggering a server reindex and
re-download on other devices, and the per-item reindex paths now cover
what needed it -- raising a length limit re-extracts only the affected
items, and unindexed items are indexed automatically. Clear Index wiped
the local index and extracted-text cache files, a destructive action
that shouldn't be exposed.
2026-07-15 15:36:40 -04:00
Dan Stillman
3ec407d861 Add full-text searching of note content
Note content is indexed into fulltext.sqlite, making note searches
accent- and case-insensitive and matching the note's plain text rather
than its HTML markup. To avoid re-indexing on every auto-save, a save
flags the note for background indexing, and searches match a flagged
note from its normalized text in memory until it's indexed.

Closes #378
2026-07-15 15:36:40 -04:00
Dan Stillman
5ade25f5f5 Drop the unused savedSearchConditions required column (#5962)
The condition `required` flag was removed in #5962, but the column was
kept so older clients could still read the database. The full-text
search changes bump the userdata compatibility version, locking out
those clients, so the column can now be dropped.
2026-07-15 15:36:40 -04:00
Dan Stillman
7c2a1d127d Add full-text content search via FTS5
Index attachment content into a contentless trigram FTS5 table in a
separate, attached fulltext.sqlite, normalized so matching is accent-
and case-insensitive. For content containing CJK characters, a companion
'ascii'-tokenized table holds bigrams so 1-2 character CJK queries, which
the trigram tokenizer can't match, still work. The extracted text still
lives in the .zotero-ft-cache files, so the index is fully derived and
rebuildable.

Use the FTS index for the fulltextContent condition, falling back to the
cached-text scan for queries too short to index, and point quick
search's content matching at the FTS index in place of the now-removed
word index. (One side effect: quick search now matches attachment
content by substring rather than by word.)

Already-extracted content is migrated into the index at startup, slowing
down on active usage. A background queue then extracts not-yet-indexed
attachments gradually when Zotero is idle. Attachments with no local
file or full-text content are recorded as missing. Content downloaded
via sync is processed into the index immediately when the sync finishes,
rather than waiting for idle like it did before, so it's searchable
immediately in on-demand file-download mode.

The index DB is tied to the main DB via the local user key and rebuilt
if they don't match (e.g., after a delete-and-resync). We compact it by
running FTS5's 'optimize' command once the indexing queue drains, and we
vacuum the attached database when necessary to reclaim disk space.

Closes #2038, #2044
Addresses #1595
2026-07-15 15:36:40 -04:00
Dan Stillman
e2536ba299 Add DBConnection hooks for auxiliary attached databases
Code that attaches its own database to the main connection needs to hook
into that connection's lifecycle. Add onIdle() to run maintenance (e.g.,
vacuuming) during the main database's idle maintenance, and
addCorruptionHandler() to handle a corruption error for the attached
database (after confirming that the main database is actually corrupt,
so a corrupt attached database doesn't trigger main-database recovery).
2026-07-15 15:36:40 -04:00
Dan Stillman
ae46954167 Add DBConnection.loadExtension()
Load a bundled SQLite extension (e.g., FTS5) by name. mozStorage
disables generic extension loading but allows specific bundled ones.
Extensions are registered per connection, so a loaded extension is
remembered and re-loaded automatically after a reconnect, before
onConnect() callbacks run.
2026-07-15 15:36:40 -04:00
Dan Stillman
da88c63231 Make the collection tree filter accent-insensitive
Addresses #1300
2026-07-15 15:36:40 -04:00
Dan Stillman
984c0a7f8c Make the tag selector filter accent-insensitive
Addresses #1300
2026-07-15 15:36:40 -04:00
Dan Stillman
3bd8d641b8 Make item search accent-insensitive
Search now ignores accents, so "seance" matches "séance" and vice versa.

Text is normalized with Unicode NFKD compatibility decomposition (which
also handles typographic ligatures, superscripts, full-width forms,
etc.) plus a small map for letters NFKD leaves alone (ø, œ, æ, ß, ...)
and the fraction slash, via Z.Utilities.Internal.normalizeForSearch().
The HTML tags we support in item fields are stripped, so markup isn't
matched (#81). Typographic quotes (#29, #1876) and dashes are folded to
ASCII.

Each searchable column gets a normalized shadow column --
itemDataValues.valueNormalized, tags.nameNormalized,
creators.firstNameNormalized/lastNameNormalized, and
itemAnnotations.textNormalized/commentNormalized -- populated at write
time and matched via COALESCE(normalized, raw) LIKE. NULL is stored when
normalizing only changes case, so plain-ASCII values are only stored
once. This covers the contains/doesNotContain/beginsWith operators in
both quick search and Advanced Search.

The new columns are local-only derived data and aren't synced. Older
clients will ignore them, so this doesn't break DB compatibility.
Existing rows are backfilled after the startup sync by
Zotero.Schema.populateNormalizedSearchColumns(), which should only take
a few seconds on most databases.

Closes #29, #81, #1300, #1876
2026-07-15 15:36:40 -04:00
Dan Stillman
d0f8d438b5 Clarify naming of the full-text sync content processor
Rename the sync-delivered full-text content processor's methods and
state to "sync content" (registerSyncContentProcessor,
processSyncedContent, indexSyncedContent, getSyncedContentCacheFile,
etc.), so it reads distinctly from the local index-building queues added
for content search. No behavior change.
2026-07-15 15:36:40 -04:00
Dan Stillman
cf09a0547c Regenerate SDT test pack fixture for pdf processor version 3
The document-worker bump raised SDT_PROCESSOR_VERSIONS.pdf from 2 to 3,
so the test's "valid" pack fixture (embedding version 2) was rejected as
stale-processor during generation, failing "should generate the pack when
missing."
2026-07-15 15:01:22 -04:00
Dan Stillman
c6595d6456 Update CSL locales 2026-07-15 13:08:36 -04:00
Dan Stillman
4f45db5009 Update translators submodule 2026-07-15 12:52:54 -04:00
Dan Stillman
933e207013 Update document-worker submodule 2026-07-15 12:52:00 -04:00
Dan Stillman
0ba89211ce Fix race between lastRead update and content-type fix on file open
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
viewAttachment() fired the 'open' notification before launchFile() saved
a sniffed content type, so AttachmentReadObserver's concurrent lastRead
save could reload the item and discard the pending change, leaving the
attachment with a blank or incorrect content type.
2026-07-14 14:01:07 -04:00
Dan Stillman
bdea584a17 Update LibreOffice submodule 2026-07-14 13:39:07 -04:00
Dan Stillman
1a5e32a7b6 Update document-worker submodule 2026-07-14 11:05:43 -04:00
Dan Stillman
142f77b094 Update reader submodule (SDT) 2026-07-14 11:05:29 -04:00
Dan Stillman
6e35bd1497 Focus the pane window before the focus traversal tests
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
The #focus() Tab/Shift-Tab tests wait on focus/blur events, which fire
only while the window is active. It intermittently loses activation in
CI's Xvfb, so call win.focus() in beforeEach when the window isn't
active.
2026-07-13 17:28:00 -04:00
nexdep
2c6185d8f1
Add Attachment Storage Type search condition (#5875)
---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-07-13 15:57:37 -04:00
Dan Stillman
89880e3284 CI: Record which test drops the main window's activation
Temporary diagnostic for the intermittent shift-tab focus-test timeout.
A central afterEach in runtests.js tracks when
Services.focus.activeWindow stops being the main window; the shift-tab
test logs the last-active and first-inactive test in its timeout
message, to identify what leaves the pane inactive in CI.
2026-07-13 15:27:39 -04:00
Dan Stillman
5a8badae7b Revert "Activate window in focus traversal tests, fixing intermittent timeouts"
This reverts commit 03a610e696.

activate() foregrounds a window via the window manager, which CI's Xvfb
doesn't have, so activateZoteroPane() in beforeEach just hangs there
instead of fixing anything. Restore the temporary open-window logging to
try to catch what leaves the pane window inactive.
2026-07-13 15:15:13 -04:00
Dan Stillman
28867883a1 Don't let embedded note images match searches in the items list
An image pasted into a note is stored as a hidden attachment, so a
matching search condition (e.g., "# of Tags" is 0) would pull the
image's parent item into the results with no visible match.
2026-07-13 14:32:40 -04:00
Dan Stillman
cdb9134537 Add "# of Notes", "# of Attachments", and "# of Annotations" search conditions
Notes and attachments are counted on regular items, and annotations on an
attachment or across a regular item's attachments; other rows are excluded
rather than always matching with a count of 0. Trashed children aren't
counted.
2026-07-13 14:18:59 -04:00
Dan Stillman
7cdd74bd2b Add "# of Tags" advanced search condition
Closes #158
2026-07-13 13:38:22 -04:00
Dan Stillman
24fe50cfd5 Add "is empty"/"is not empty" advanced search operators
Available for text, date, and number fields and creators. Previously only
possible via a doesNotContain hack with an empty value.
2026-07-13 13:38:22 -04:00
Dan Stillman
c181aac7f6 Citation dialog: Fix grouping of selected and open items
The front-most tab's item appeared under Selected Items instead of Open
Documents, and the library tab's actual selection wasn't shown. Selected
Items now always reflects the item tree selection, and an item that's both
selected and open stays under Open Documents (sorted after the front-most
tab) so that suggestions specific to open documents (e.g., the current page
number, planned in #6001) can apply to it. Notes open in tabs now appear
under Open Documents when adding a note.
2026-07-13 11:41:19 -04:00
Dan Stillman
582333397d Citation dialog: Allow typed locator after Cmd/Alt-Tab away and back
https://forums.zotero.org/discussion/132673/
2026-07-12 18:40:06 -04:00
Dan Stillman
5fe4c901ed Update stale downloadUpdate() usage in update dialog
Some checks failed
CI / Test (shard 1) (push) Has been cancelled
CI / Test (shard 2) (push) Has been cancelled
CI / Test (shard 3) (push) Has been cancelled
CI / Test (shard 4) (push) Has been cancelled
CI / Utilities Tests (push) Has been cancelled
CI / Build, Upload (push) Has been cancelled
downloadUpdate() is now async, takes a single argument, and returns a
result code rather than a state string, so the "failed" check could
never match.
2026-07-10 15:49:19 -04:00
Dan Stillman
8eb71a588d Fix download progress in update dialog
nsIProgressEventSink's onProgress()/onStatus() no longer take a context
argument.

Fixes #3130
2026-07-10 15:49:18 -04:00
Dan Stillman
dea2fb8491 Fix build_for_deploy dying silently on an empty incrementals file 2026-07-10 15:26:52 -04:00
Dan Stillman
6225931f93 Clear the quick search from every selected collection when prefilling
Opening the Advanced Search from the quick search cleared the search
text only on the first selected row, while the quick search had applied
it to all of them, so with a multi-collection selection the other
collections stayed filtered by the now-invisible text -- both while the
advanced search was open and after closing it.
2026-07-10 11:45:29 -04:00
Dan Stillman
540735785d Prompt before discarding saved-search edits via the Advanced Search toggle
With the saved-search editor open, Cmd/Ctrl-Shift-F replaced it with the
temporary Advanced Search pane and the search field's close button
closed it, in both cases discarding the editor's working copy with no
way to recover the edits. Move the collection-switch save prompt into a
shared helper and show it before replacing or closing the editor.
Choosing Save on a collection switch now continues the switch directly
instead of relying on the save's modify notification to re-sync the view.
2026-07-10 11:45:29 -04:00
Dan Stillman
4188ef0ebc Don't drop an annotationAuthor value while its author menu is loading
onConditionSelected() populates the Author value menu asynchronously,
and until it finished, the row's default textbox was still the visible
value control, so serializing the row (running or saving the search)
replaced the loaded author with an empty value. Serialize the stored
value while the menu is pending, and invalidate the population if a
newer condition selection takes over meanwhile.
2026-07-10 11:45:29 -04:00
Dan Stillman
ccc7d0a5ad Fix focus target when a keyboard removal prunes a group
removeRow() remembered the removed row's index within its own group,
but when the removal emptied the group and pruned it, the index was
applied to the ancestor's children, focusing an unrelated row. Track the
pruned group's slot in its parent instead.
2026-07-10 11:45:29 -04:00
Dan Stillman
3a34c6a18f Run a focused button's action on Enter in Advanced Search
The pane-level Enter handler ran the default action (save in the saved
editor, submit in the temporary pane) regardless of the event target, so
Enter with focus on the Cancel button saved and closed the editor, and
Enter on Clear ran the search. Click the focused button instead, which
the platform otherwise only does for Space.
2026-07-10 11:45:29 -04:00
Dan Stillman
a6c3ad51ef Keep a group's same-entity binding visible when it no longer qualifies
The "in the same annotation" binding menu was hidden as soon as a group
no longer had two conditions at the bound level, but the group's stored
binding was still saved and applied. After switching one of two bound
annotation conditions to another type, the group looked like a plain
"Match all of the following" group but still required a single
annotation to satisfy all of its conditions, and no control was left to
see or clear the binding.

Show the menu whenever the group is bound, drop the binding only once no
condition at its level remains, and refresh the menus before
collectGroup() in updateSearch() so the first save after such an edit
doesn't serialize stale state.
2026-07-10 11:45:28 -04:00
Dan Stillman
1e0cf49a16 Don't refresh the items list when clearing an unset advanced search
setAdvancedSearch() invalidated the row unconditionally, unlike
setSearch()/setTags(), so merely opening or closing the Advanced Search
pane (which applies a null filter) re-queried and rebuilt the items
list. A passed search is still always applied, since its conditions may
have been edited in place, and setFilter() still waits for a refresh
already in flight so that callers see the settled view.
2026-07-10 11:45:28 -04:00
Dan Stillman
cc28fad6da Roll a standalone attachment's annotations up to the attachment itself
_rollUpAnyToLevel() only followed an annotation's parent when the
attachment itself had a parent, so in a search for top-level items, a
tag on a standalone attachment's annotation matched nothing.
2026-07-10 11:45:28 -04:00
Dan Stillman
d95d8f294d Fix serialization of the result level seeded for a migrated childNote
The condition seeded by _loadConditions() used `mode: undefined`, but
toJSON() only omits the "/mode" suffix when the mode is exactly false
(what parseCondition() returns), so a saved search migrated from the
obsolete childNote condition serialized -- and synced -- the condition
as "resultLevel/undefined".
2026-07-10 11:45:28 -04:00
Dan Stillman
c43f028c96 Remove dead code left over from the Advanced Search dialog
onLibraryChange() has no callers since library changes re-render the
pane, and .active/doCommand() belonged to the removed dialog's search
box.
2026-07-10 11:45:28 -04:00
Dan Stillman
8daed576ba Make first top-level joinMode win in combineConditions()
_buildQuery() already uses the first top-level joinMode for the
full-text post-filter; with multiple top-level joinMode conditions (only
creatable via the API), combineConditions() used the last.
2026-07-10 11:45:28 -04:00
Dan Stillman
2c62010c4c Fix misplaced comma 2026-07-10 11:45:28 -04:00
Abe Jellinek
0a67f4967c Read Aloud: Update skip button tooltip text
#5998
2026-07-10 11:17:23 -04:00
Abe Jellinek
64165eabf6 ItemTree#selectItems(): Clear advanced search if item doesn't match
Some checks are pending
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Build, Upload (push) Waiting to run
Extends existing handling for tag selection and quicksearch to handle
advanced search as well.

Fixes #5996 (not just for zotero://select but for all selectItems()
callers)
2026-07-09 14:11:36 -04:00
Dan Stillman
243ef0e28f Fix historical comments from 606d8f19ba 2026-07-09 13:12:43 -04:00
Dan Stillman
606d8f19ba Advanced search: Indent subcollections in Collection condition menu
Instead of just prefixing the labels with "-", indent the whole row,
including the icon. This looks better and fixes FAYT on subcollection
names.

https://forums.zotero.org/discussion/132561/
2026-07-09 13:09:24 -04:00
Dan Stillman
03a610e696 Activate window in focus traversal tests, fixing intermittent timeouts
The #focus() Tab/Shift-Tab tests dispatch synthetic keydowns and wait on
a focusin event to sync with the collections search field's async
(setTimeout) focus. Gecko only fires focus/blur events while the window
is active, so when the pane window wasn't active -- it opens in the
background on macOS/Windows and can lose activation on Linux/CI -- the
focusin never fired and the test hung until Mocha's timeout. Activate
the window in beforeEach, as the item pane and tags box focus tests
already do.

Also removes the temporary open-window logging added in e1f19f34f5.
2026-07-09 11:00:24 -04:00
Dan Stillman
c3787495cc Don't show empty-library message for empty search with no groups
hasItems() also now short-circuits with LIMIT 1 rather than counting all rows

https://forums.zotero.org/discussion/132635/zotero-beta-empty-database-message-when-no-results
2026-07-09 10:38:43 -04:00
Dan Stillman
e1f19f34f5 CI TEMP: Debugging for shift-tab focus test timeouts 2026-07-09 10:32:53 -04:00
Dan Stillman
1c9bf88888 Unpack update archives for different architectures in parallel
Some checks are pending
CI / Test (shard 1) (push) Waiting to run
CI / Test (shard 2) (push) Waiting to run
CI / Test (shard 3) (push) Waiting to run
CI / Test (shard 4) (push) Waiting to run
CI / Utilities Tests (push) Waiting to run
CI / Build, Upload (push) Waiting to run
2026-07-08 12:10:46 -04:00
Dan Stillman
39a1c56f6c Cache update diffs and compressed files across builds
Cache patches and compressed files by content hash so that they're reused
across FROM versions and releases. Cache entries are touched when used and
expire after 60 days.

The cache key includes a tag covering the xz/mbsdiff versions and the
compression options, so entries are invalidated when the toolchain changes.
2026-07-08 12:10:45 -04:00
Dan Stillman
d07dd66c21 Parallelize update MAR generation
Run the per-file mbsdiff/xz work in make_incremental_update.sh and
make_full_update.sh through a parallel job pool, largest files first, and
assemble the manifests serially afterward, producing byte-identical MARs.

Set UPDATE_PACKAGING_JOBS to override the number of parallel jobs.
2026-07-08 12:10:45 -04:00
Dan Stillman
3ae3bd41dc itemPaneTest: Scroll to attachments pane instead of relying on pin
The pinned pane doesn't reliably trigger a render of an out-of-view pane in
this state, so scroll to the pane the way the surrounding tests do.
2026-07-08 10:50:32 -04:00
Dan Stillman
4314494455 Include callback source in waitForCallback timeout errors
The stack for these errors is stripped as internal frames, so the error
didn't indicate which wait timed out.
2026-07-08 10:50:32 -04:00
Dan Stillman
f9e711a9b2 itemPaneTest: Wait for window resize in attachments pane beforeEach
Tests that shrink the window to test visibility-based rendering restore the
height on their last line without waiting for it to apply, so the next test
could start rendering while the window was still 100px tall. The attachments
box's async render is skipped for panes outside the viewport and only retried
on scroll, so the pane never rendered and assertions on it failed or timed
out.
2026-07-08 10:50:32 -04:00
Dan Stillman
77a3cd82a9 itemPaneTest: Wait for attachments box render of the correct item
waitForPreviewBoxRender() without an item id returns immediately if the box
still holds the previous item's completed render, so on a slow machine the
row assertions could run before the new item's async render started.
2026-07-08 10:50:32 -04:00
Dan Stillman
49e284bab0 recognizeDocumentTest, translatorsTest: Initialize translators in before()
EPUB recognition translates the EPUB's RDF metadata, and
Zotero.Translators.save() requires translators to be loaded. The full test
run relied on an earlier test file having initialized translators.
2026-07-08 10:50:32 -04:00
Dan Stillman
7d33215a37 recognizeDocumentTest: Restore translate stub in afterEach after failure
Tests restore the stub at the end of the test body, so a failure left
Zotero.Translate.Search.prototype.translate wrapped and retries failed with
"Attempted to wrap translate which is already wrapped".
2026-07-08 10:50:32 -04:00
Dan Stillman
dfd745c5d5 Log test failures that will be retried
The reporter only showed the final failure, so if a retry failed differently
(e.g., from a stub left wrapped by the first failure), the original error was
lost.
2026-07-08 10:50:32 -04:00
Dan Stillman
1fe9cad5f8 citationDialogTest: Initialize styles in before()
Zotero.Cite.getLocatorString() requires Zotero.Styles.init() to have run.
The full test run relied on an earlier test file (bibliographyTest) having
initialized styles.
2026-07-08 10:50:32 -04:00
Dan Stillman
62a431f42b CI: Don't run duplicate jobs for same-repo pull requests
Pushes to branches in this repo already run CI, so run pull_request jobs only
for PRs from forks, which don't trigger push runs here. The push run's checks
still appear on the PR, since checks are attached to the head commit. (This
skips merge-commit testing for same-repo PRs -- the push run tests the branch
as-is.)
2026-07-08 10:50:32 -04:00
Dan Stillman
4c392c4764 CI: Run tests in 4 parallel shards
Each shard job builds and runs a quarter of the test files via runtests.sh -p.
The deployment ZIP upload and utilities tests move to separate jobs. With the
default fail-fast matrix behavior, a failure in one shard cancels the others.
2026-07-08 10:50:32 -04:00
Dan Stillman
bd25413213 runtests.sh: Add -p option to run a shard of the test files (e.g., -p 2/4)
The sorted file list is split into contiguous chunks of roughly equal total
file size, using size as a stand-in for run time, so new test files are
included automatically and slow test files are spread across shards rather
than landing in the same shard by chance. Contiguous chunks preserve the
alphabetical run order of a full run, so files keep the same preceding files
as in a full run except at chunk starts, and a shard can be reproduced locally
by passing its first and last files to -s and -e.
2026-07-08 10:50:32 -04:00
Dan Stillman
094d5cc2b6
Update staged builds in place for faster dev builds (#5994)
After a full build, dir_build saves a manifest of build/ files to
staging/.build-manifest. On subsequent runs, if all changed files are
ones that build.sh copies into omni.ja unmodified (chrome/, components/,
resource/, and test/ when tests are staged), zip just those files into
the staged omni.ja instead of rebuilding, taking rebuilds from ~15
seconds to ~0.3 seconds on an M1 Mac. Files are prescreened by size and
mtime so that only changed files need to be hashed. Zotero .ftl files
are also updated at their localization/<locale>/ paths, and test files
are also copied to the staged tests/ directory.

Any other change triggers an automatic full rebuild: files transformed
by build.sh (defaults/, chrome.manifest, version, translators/, styles/,
mozilla .ftl files, CSL locales), removed files, changes to build inputs
in app/ (detected via a size/mtime fingerprint, with xulrunner runtimes
covered by the hash-* files written by fetch_xulrunner), or requesting
tests or devtools that the staged build doesn't include.

Other changes:

- dir_build no longer takes -q and always skips omni.ja compression and
  optimization, which only matter for distribution builds made via
  build.sh. Use -f (dir_build or build_and_run) to force a full rebuild.
- build_and_run now always rebuilds. -r is deprecated, and -n skips the
  rebuild and just launches the app.
- build_and_run no longer passes -purgecaches. Startup caches are
  invalidated automatically when the BuildID changes, which now happens
  whenever omni.ja is modified (including via add_omni_file), so
  relaunching an unchanged build can use the startup cache.
- build_and_run and runtests.sh invoke js-build directly instead of via
  'npm run', which saves ~270ms of npm overhead per build.
- The Word integration dylib is now ad-hoc-signed by dir_build, and only
  on full rebuilds, since incremental updates don't invalidate the
  existing signature. This also covers test builds, which were never
  signed before.
- dir_build removes broken symlinks left in build/ when source files are
  deleted, which previously broke rsync in prepare_build.
2026-07-08 10:07:58 -04:00
Martynas Bagdonas
225e91c5e7 Tabs: Fix audio status validation
Validate the status argument instead of the unrelated title identifier, so invalid audio status updates fail with the intended error.
2026-07-08 14:52:31 +03:00
Martynas Bagdonas
2b7f46227f Reader: Reliably deactivate the docShells of hidden reader tabs
The reader now releases its rendered pages while its document is
hidden, which requires document.visibilityState to be truthful: it's
driven by docShellIsActive, which also controls event-loop throttling
for background tabs. The flag was maintained by scattered one-off
writes and went stale on the transitions they didn't cover: a tab
opened in the background ran at foreground priority (unthrottled rAF
and timers) with a 'visible' document until the next tab switch, and a
hidden tab kept an active docShell forever after its Read Aloud
playback was paused or stopped — in both cases keeping the reader from
ever releasing memory.

Replace the writes with a single _updateDocShellActivity() that
re-derives the state — active only while the tab is selected or
playing Read Aloud — called from the three places its inputs change:
tab creation, tab selection, and Read Aloud status changes.
2026-07-08 14:51:07 +03:00
Dan Stillman
55eceab3b3 Update English strings for Transifex
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
2026-07-05 11:23:51 -04:00
Dan Stillman
e2db3c7966 Citation dialog: Handle citation processor errors gracefully
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
If the preview fails, log the error and show "Preview unavailable"
instead of breaking the item-add flow with an unhandled rejection.

If io.sort() fails during accept, log and continue unsorted -- the
insert runs the same processor operation, so a real failure triggers the
document-update error dialog instead of a stuck progress window.
Skipping the sort doesn't affect the inserted citation, which the
processor sorts itself. It only determines the stored item order, and
with it the initial bubble order if the citation is edited later -- the
reopened dialog re-sorts once cited data has loaded.
2026-07-03 16:01:50 -04:00
Dan Stillman
cddf0ea237 Update citeproc.js to include Juris-M/citeproc-js#281
Fixes HTML appearing in citations after an error during citation preview

https://forums.zotero.org/discussion/132539/
2026-07-03 15:53:12 -04:00
Dan Stillman
057966000c Advanced search: Don't move focus to the results when running the search
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Behavior regression in #5658

https://forums.zotero.org/discussion/132526/10-0-beta-8-number-of-results-in-the-new-advanced-search
2026-07-02 12:59:25 -04:00
Dan Stillman
e416ea2dfa Fix repeated save prompt after trashing the saved search being edited
Deleting a search in the collections pane moves it to the trash rather
than erasing it, so the check that closes the saved-search editor when
the edited search is deleted didn't catch it. The save-changes prompt
then appeared on the next selection change, and canceling couldn't
restore the removed row, so the prompt reappeared on every selection
until choosing Don't Save. Treat a trashed search like a deleted one
and close the editor without prompting.
2026-07-02 12:44:07 -04:00
Dan Stillman
2f364f2fab Allow creating a saved search with collections or searches selected
Previously a search could be saved only at a library root. Now the Save
Search button is enabled when collections and/or saved searches within
a single editable library are selected, and the selection is added to
the saved search as collection/savedSearch conditions -- an 'any' group
of them when more than one row is selected. If the search's own join
mode is 'any', its existing conditions move into an 'any' group of
their own so the scope conditions apply to every result instead of
joining the OR. A 'recursive' condition is included per the
recursiveCollections pref.

https://forums.zotero.org/discussion/132528/beta-cannot-create-a-saved-search-from-a-collection
2026-07-02 12:38:52 -04:00
Dan Stillman
a48336350a Remove .swp file committed by accident 2026-07-02 10:54:04 -04:00
Martynas Bagdonas
af704dc119 Update document-worker submodule and report SDT progress 2026-07-02 15:04:31 +03:00
Dan Stillman
26c30d8ecd Allow browsing an attachment's annotations in search results
With "Hide Non-Matching Annotations" enabled, an attachment displayed as
empty and non-expandable if no annotations matched the search, so
searching by any non-annotation condition made it impossible to expand
attachments to browse their annotations. Now only hide the non-matching
annotations when the attachment actually has a matching one.

https://forums.zotero.org/discussion/132519/beta-advanced-search-cannot-expand-annotations-of-search-results
2026-07-01 22:13:38 -04:00
Tom Najdek
95ee1c616c
Fix xulrunner_hash to read the hash from openssl output on LibreSSL/macOS
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Previous command only worked with OpenSSL's labeled output where the hash is the second field; the update also handles LibreSSL (macOS), which prints just the bare hash.
2026-07-01 20:14:30 +02:00
Dan Stillman
40b272c46b Add -b (build-only) flag to beta_build_and_deploy 2026-06-30 17:44:49 -04:00
Dan Stillman
1d8cdb13c1 Update Windows build to Firefox 140.12.0esr 2026-06-30 16:41:38 -04:00
Dan Stillman
163c27ca79 Keep Advanced Search button visible when the item pane is wide
When the item pane is dragged wide, the items pane is squeezed and the
quick search wrapper kept its intrinsic width and overflowed, pushing the
trailing Advanced Search button out under the item pane. Let the wrapper
shrink so the button stays within the pane.

Fixes #5982
2026-06-30 15:57:06 -04:00
Dan Stillman
d28bdd8d6e Update Mac and Linux builds to Firefox 140.12.0esr
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-06-30 15:09:55 -04:00
Abe Jellinek
279e25c57e
Preferences: Scroll first search result into view (#5976) 2026-06-30 14:21:30 -04:00
Dan Stillman
13bd8c9d8d
Group attachment and annotation conditions into Advanced Search submenus (#5981) 2026-06-30 14:20:47 -04:00
Tom Najdek
7f30b0e47d
Respect skipDateModifiedUpdate of the operation when undoing it, fix #5971 2026-06-30 18:23:23 +02:00
Abe Jellinek
f3328b02ee
Item/collection tree: Resize using ResizeObserver, not debounce (#5977) 2026-06-30 08:44:18 -04:00
Adomas Venčkauskas
9cffc1c7c2 Update LibreOffice submodule 2026-06-30 14:35:38 +03:00
Dan Stillman
36d025f6a9 Update item count on every items-view refresh
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
The 'items in this view' count failed to update when the result set
changed without a selection change (e.g., quick search, tag filter, or
sort with nothing selected). The listener that refreshes the item pane
on refresh was registered in 8277277948 to fire only once, on initial
load, so later refreshes never recomputed the count.

This is all a regression from the items tree refactor (cbbff600a6),
which stopped running itemSelected() on every refresh.
2026-06-29 15:12:22 -04:00
Tom Najdek
2d56936bfe
Fix surplus space left behind after editing Extra in batch mode, fix #5969 2026-06-29 18:42:25 +02:00
Tom Najdek
2006cdac6d
Improve the behavior of read-only fields in batch edit mode, fix #5968
- Fix a bug where focusing on a read-only field with a common value across items would clear the field and display a "Multiple" placeholder instead
- Fix read-only date fields always showing "Multiple" in batch edit mode, even when values are genuinely different
- Read-only fields are now focusable in batch edit mode
2026-06-29 17:17:33 +02:00
Dan Stillman
02b19d0cde Match multi-level search condition against any ancestor level for descendant results
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
A field that exists at more than one level (e.g., Title, on both
top-level items and attachments) targeting a descendant result level
only matched the closest ancestor, so searching annotations by Title
found nothing, since it checked the parent attachment's title rather
than the top-level item's. Map down from each ancestor level and union
them, testing the predicate once so its bound parameters aren't
duplicated.

Addresses #5978
2026-06-26 16:53:52 -04:00
Dan Stillman
340ba92513 Show "Search subcollections" only with a Collection condition
The option only affects Collection conditions, so hide it -- and don't
emit the 'recursive' condition -- when the search has none.
2026-06-26 16:29:34 -04:00
Dan Stillman
6c7c661fb1 Advanced search: Separate Saved Search from the Collection condition
Saved searches were folded into the "Collection" condition's value menu
in 2016 (9c52ebdf8b), for reasons I can't totally remember. Give Saved
Search its own condition again.
2026-06-26 16:24:49 -04:00
Dan Stillman
a1f36f750e Advanced search: Fix extra padding on nonexistent icon in hint button
Addresses #5978
2026-06-26 15:55:32 -04:00
Dan Stillman
fe340283c1 Crop Advanced Search label so buttons stay visible when window is narrow
Addresses #5978
2026-06-26 15:55:32 -04:00
Dan Stillman
0e587176e8 Advanced search: Match condition value field height to drop-down menus
Addresses #5978
2026-06-26 15:55:32 -04:00
Dan Stillman
d4507544af Advanced search: Reduce the condition row's control gap to 6px
Addresses #5978
2026-06-26 15:55:32 -04:00
Dan Stillman
98308c65b9 Advanced search: Drop the extra padding on the 'Find' line
Add a bit more inline padding to the whole pane to compensate, so the Find
line and conditions box aren't too close to the left edge.

Addresses #5978
2026-06-26 15:54:49 -04:00
Dan Stillman
f7e67f6643 Advanced search: Match the level-warning text size to the binding hint
Addresses #5978
2026-06-26 15:53:38 -04:00
Dan Stillman
cf7ee984ea Advanced search: Hide obsolete Child Note condition and migrate to Note
Addresses #5978
2026-06-26 15:53:07 -04:00
Dan Stillman
3875f411e5 Advanced search: Show binding hints and warnings on condition select
Not just on value entry, but add an exception for a new row created with
the + button

Addresses #5978
2026-06-26 15:52:34 -04:00
Dan Stillman
680452cc59 Advanced search: Update condition grouping icon and add ungroup button
Addresses #5978
2026-06-26 15:52:16 -04:00
Dan Stillman
3544848e5f Keep an edited search condition value when switching condition types
Addresses #5978
2026-06-26 15:50:58 -04:00
Dan Stillman
b56c153125 Fix Attachment Last Read search condition by matching at attachment level
Addresses #5978
2026-06-26 15:50:17 -04:00
Dan Stillman
2717aafedd Add annotation type, color, and author search conditions
Add annotationType, annotationColor, and annotationAuthor conditions,
each tagged `level: 'annotation'` so the cross-level search logic maps
and negates them correctly. The value fields are drop-down menus: the
annotation types, the reader's color palette, and the library's
existing annotation authors.

Ported from #5839. The PR kept a negated annotation condition (e.g.,
"Annotation Color" "is not" "yellow") from matching every non-annotation
item by checking whether the condition name contained "annotation". This
does the same using the condition's level, which the cross-level logic
already handles, so the existing annotationText and annotationComment
conditions are covered too.

Fixes #5837
2026-06-26 13:08:15 -04:00
Dan Stillman
cb2110e1c1 Move the annotation conditions into the main search menu
Addresses #5978
2026-06-26 12:48:48 -04:00
Dan Stillman
2239dd20a4 Update global schema version for search-condition-group gate (#5962)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-06-25 16:14:38 -04:00
Dan Stillman
60807d552c Remove the search condition required flag (#5962)
The flag forced a condition to be ANDed even in "any" mode, but
condition groups now express that directly. It was never exposed in the
search UI and nothing seems to have been using it.

addCondition()/updateCondition() now throw if passed a truthy
`required`. Not dropping the column now to preserve DB compatibility.
2026-06-25 16:14:38 -04:00
Dan Stillman
ccf6f18643 Prefill Advanced Search from the quick search (#5962)
Opening Advanced Search from a non-empty quick search reproduces the
current quick search mode as editable conditions, one per word (or quoted
phrase) joined with "all":

- Title/Creator/Year: a single Title, Creator, Year condition per word,
  with the result level set to item (the mode matches only top-level items)
- All Fields & Tags: a single Any Field condition per word
- Everything: Any Field + Full Text Content as an "any" group per word
  (relies on grouped full-text composing correctly in SQL)

The Title/Creator/Year mode needs a condition to map to, so add a "Title,
Creator, Year" search condition that expands to the same field set as the
quick search mode (title, publication title, short title, court, year,
citation key, creator), mirroring how Any Field matches All Fields & Tags.
Like Any Field, it expands at query-build time, so the saved search stores
a single condition and its sub-fields don't need their own entries in the
condition menu.
2026-06-25 16:14:38 -04:00
Dan Stillman
786b85bf2d Expand Any Field in place so it nests correctly (#5962)
An Any Field condition expands into field/tag/note/creator conditions for
the term. Splice the expansion in right after the condition so it stays at
the same nesting depth, rather than appending it to the end of the
processing queue, which would emit it at the top level instead of within
its group. (Top-level Any Field is unaffected.)
2026-06-25 16:14:38 -04:00
Dan Stillman
0529c9a579 Match Any Field search condition to the All Fields & Tags quick search mode (#5962)
Add annotation text and comments to the conditions the Any Field
condition expands to, matching the fields covered by the All Fields &
Tags quick search mode, as the comment already says is intended. Key
detection and quoted-phrase splitting still differ, since those depend
on the quick search string parsing that Any Field doesn't do.
2026-06-25 16:14:38 -04:00
Dan Stillman
092295da22 Add result-level controls to the Advanced Search builder (#5962)
- Reword the header as one sentence with a result-level menu ("Find
  [attachments] matching [all] of the following:")
- Provide a per-group menu to bind the group's descendant conditions to
  the same attachment, note, or annotation (e.g., one annotation that is
  both red and contains a given word, not two different ones)
- Show a hint that offers to group ungrouped sibling conditions (e.g.,
  two annotation conditions at the top level, to bind them to one
  annotation)
- Show a warning when conditions can't combine at the chosen result
  level (e.g., an annotation condition with a note result level)
- Remove the two legacy checkboxes:
  - "Show top-level items" becomes result level = top-level item and is
    migrated on save
  - "Include parent and child items", which has no result-level
    equivalent, keeps working, stays editable, and round-trips on
    searches that already have it, but it isn't offered on new searches
    and is removed on save if unchecked
2026-06-25 16:14:38 -04:00
Dan Stillman
8b5a77a75e Support cross-level conditions and a result level in search (#5962)
Give a search a result level -- top-level item, attachment, note, or
annotation -- and map every condition to that level, so one search can
mix conditions that match at different levels of the item hierarchy
(e.g., a top-level item with a given author and a red annotation on one
of its PDFs). Each condition carries the level(s) it matches at: a match
is mapped up to an ancestor or down to a descendant, level-agnostic
conditions (tags) roll up to the result level, and fields that exist on
both items and attachments (title, url, accessDate) match natively at
either. The result level is stored as a `resultLevel` marker condition
alongside the join mode.

This also removes the temporary annotation-parent hacks, which the
general cross-level mapping replaces.
2026-06-25 16:14:38 -04:00
Dan Stillman
1341b6d5cc Style Advanced Search conditions as a divided, indented list (#5962) 2026-06-25 16:14:38 -04:00
Dan Stillman
cdc70d1280 Compose grouped full-text conditions in SQL (#5962)
A fulltextContent condition was evaluated as a global post-filter keyed
on the search's top-level join mode -- correct for a top-level
condition, but not for one inside a group, which must combine with its
siblings under the group's own join mode. The new condition grouping UI
allows fulltextContent to be placed within groups, and we need to do so
to prefill the advanced-search pane from an "Everything" quicksearch.

Materialize a grouped fulltextContent into an itemID set and emit it as an
ordinary itemID IN/NOT IN predicate, so combineConditions composes it
under the group's join mode. Top-level fulltextContent keeps the existing
post-filter unchanged.

This also removes the quicksearch full-text post-filter special case. A
quick search puts its full-text in per-word "any" groups, so the
_hasQuicksearch flag was needed to make the post-filter union those
matches rather than intersect them under the top-level "all" join. Now
that the grouped full-text is composed in SQL it never reaches the
post-filter, so the flag is gone.
2026-06-25 16:14:38 -04:00
Dan Stillman
5904f0e4bf Diff saved-search conditions as an ordered list (#5962)
With condition groups, the position of conditions and the pairing of
groupStart/groupEnd markers are meaningful, but conditions were diffed
as an unordered member set (compared by value, with additions appended).
A sync-conflict merge could reorder conditions or add/drop group
markers, corrupting the group structure.

Diff them as a single ordered unit instead, like creators. This changes
how concurrent edits to a search are reconciled: rather than merging the
two sides' conditions member by member, a conflicting edit now resolves
wholesale -- the remote condition list replaces the local one (searches
auto-merge to the remote version); a one-sided change still applies that
side's full list. Discarding one side of a rare simultaneous edit is
acceptable and avoids silently corrupting a grouped search's structure.

This was the only user of SearchConditions.equals(), so remove it.
2026-06-25 16:14:38 -04:00
Dan Stillman
d808988540 Add condition grouping UI to Advanced Search (#5962)
Render the search as a tree of groups: a root group plus nested
search-condition-group elements, each with its own join-mode menu and a
remove control. Each condition row gets a "( )" button that wraps it in
a new group in place, so further conditions can be added to combine with
it under a separate join mode. Switch the builder to rebuild-from-tree --
the DOM is the source of truth and the search's flat conditions (with
groupStart/joinMode/groupEnd markers) are regenerated on each edit, so
the old conditionID-as-index tracking is gone.
2026-06-25 16:14:38 -04:00
Dan Stillman
c01def2a85 Support nested condition groups in saved searches (#5962)
Replace the flat anySQL/quicksearch-block assembly in _buildQuery with a
recursive tree of AND/OR groups, built and reduced by a new
Zotero.Search.combineConditions() helper. groupStart/groupEnd markers
delimit nested groups and a joinMode marker sets each group's mode, so a
saved search can combine conditions with arbitrary nesting and per-group
join modes. The per-condition SQL generation is unchanged.

For example, a search built as

    search.addCondition('joinMode', 'all');
    search.addCondition('title', 'contains', 'foo');
    search.addCondition('groupStart', 'true', '');
    search.addCondition('joinMode', 'any');
    search.addCondition('tag', 'is', 'x');
    search.addCondition('tag', 'is', 'y');
    search.addCondition('groupEnd', 'true', '');

means "title contains 'foo' AND (tag is 'x' OR tag is 'y')". The 'true'
operator on the group markers is an unused placeholder -- they carry no
value, but a condition's operator can't be empty.

The quick search (matching multiple words) and the Any Field condition
previously had their own special handling in the query builder; they now
use the same grouping as everything else, so that code is gone. Behavior
for existing non-grouped searches is unchanged; new tests cover nested
groups and combineConditions() directly.
2026-06-25 16:14:38 -04:00
Abe Jellinek
9a4317daa7 Preferences: Trim search term
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Fixes #5975
2026-06-25 09:35:47 -04:00
Dan Stillman
8f96a6d191 Enable Reset File Sync History for read-only libraries
https://forums.zotero.org/discussion/132375/switching-file-sync-settings-for-group
2026-06-25 09:34:47 -04:00
Dan Stillman
aab912e4ee Support Select All (Cmd/Ctrl-A) in the collection tree
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
A plain select-all would mix uncombinable rows, so scope it to the
current selection's type: a library selection expands to all library
roots; a collection selection to every collection sharing a parent with
a selected one (so multi-level/multi-parent selections expand within
each branches); and a Recently Read selection to Recently Read in every
library. Other rows -- saved searches, Unfiled, Trash, etc. -- have no
useful expansion, so the tree's key handler leaves the selection
untouched instead of clearing it.
2026-06-24 14:23:08 -04:00
Dan Stillman
d7660f2f27
Add local-cache versioning for Read Aloud audio (#5967)
Version Read Aloud cache keys with the server-provided cacheVersion so
a version bump misses stale entries and re-fetches correct audio, prune
obsolete entries once per session, and skip caching responses sent with
Cache-Control: no-store.
2026-06-24 11:21:09 -04:00
Dan Stillman
962e1334c8 Inset item tree focus ring so its top isn't clipped
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Regressed by f4adb452ee, which dropped the items-tree body's top padding
to 0 for sticky section headers; the scroll container's overflow then
clipped the top of the first row's focus ring, which drew outside the
row box.
2026-06-23 09:35:25 -04:00
Tom Najdek
40cb1cfa84
Fix stale itemType in _previousData (#5964)
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
This fixes a problem where, on subsequent item type changes, a stale itemType is reported and the filename is not updated.
2026-06-19 16:34:23 -04:00
Dan Stillman
35317982f5 Make the sticky library header opaque to pointer events
The pinned sticky section header was opaque to paint but had
pointer-events: none, so clicks, drag-starts, and drops fell through to
the item occluded underneath it.

Make the opaque content capture pointer events instead. Clicks no-op
(header rows aren't selectable), drags don't start (header rows aren't
draggable), and drops on the header are rejected so they're a no-op
rather than acting on the list underneath.

Also drop the index > 0 exception when skipping non-selectable rows in
_onSelection(), so clicking a non-selectable row at the top (i.e., the
first library's header) is a true no-op instead of scrolling to the top.

Also skip non-selectable rows in handleActivate(), since the header can
now be double-clicked; without this it would try to open the library as
an item.

Fixes #5960
2026-06-19 16:07:53 -04:00
Dan Stillman
bdf79336f9 Account for sticky section header when scrolling a row into view
Arrow-key navigation scrolled the newly selected row flush with the top
of the view, leaving it hidden behind the pinned sticky section header.
Reserve a row's worth of space at the top so the row lands below the
pinned header.

Fixes #5959
2026-06-19 14:28:40 -04:00
Tom Najdek
e71bd89e0d Add support for undo/redo (#5823)
---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-06-19 14:12:54 -04:00
Tom Najdek
c92148c3ec Add batch editing support for fields (#5823)
---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-06-19 14:12:54 -04:00
Dan Stillman
8d7f5a39f9 Don't include trashed items in Advanced Search outside the trash
#5658 added includeDeleted to the Advanced Search outside the trash, so
trashed items kept matching: trashing a result removed its row, but
re-running the search brought it back. Exclude deleted items by default,
the same as a quick search, and only include them when viewing the trash,
where the scope returns only deleted items.

Fixes #5956
2026-06-19 14:07:43 -04:00
Dan Stillman
ff094330f5 Don't show all trashed collections/searches during a search in trash
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
When viewing the trash, trashed collections and saved searches were appended
to the items list unconditionally, so every advanced search (and quick search)
in the trash matched all of them. Now they're filtered by name during a quick
search and excluded entirely when an advanced search or tag filter is active,
since they can't match item-level conditions or tags.

Fixes #5957
2026-06-19 13:43:53 -04:00
Dan Stillman
4a318617d6 Don't crash on unbalanced {{endif}} in template engine
An {{endif}} without a matching {{if}} popped the base level off the
stack, leaving it empty and throwing "level is undefined" on the next
part. A malformed filename format template could therefore break file
attaching entirely.

https://forums.zotero.org/discussion/132296/pdfs-have-stopped-attaching-after-upgrade-to-zotero-9
2026-06-19 13:05:19 -04:00
Tom Najdek
6092b0335c
Fix auto-renaming not triggering when parent item type changes 2026-06-19 15:04:56 +02:00
Dan Stillman
35c8448582 Advanced search: Move focus to next "-" button when removing row via keyboard 2026-06-19 00:14:06 -04:00
Dan Stillman
e37a7d8f06 Advanced search: Don't run the search on Shift-Enter 2026-06-19 00:14:06 -04:00
Dan Stillman
2e79bbe402 Advanced search: Focus condition drop-down when adding row via keyboard 2026-06-19 00:14:05 -04:00
Dan Stillman
e38f8f78b0 Advanced search: Add find-as-you-type for all conditions
Closes #5953
2026-06-19 00:14:05 -04:00
Dan Stillman
90aa5d33a0 Fix first-column (Title) header label alignment after item tree refactor
The refactor dropped the 8px (COLUMN_PADDING / 2) offset that makes up
for the inline-start padding the first cell omits, so the header label
sat 8px too far left of the item titles.
2026-06-18 23:32:47 -04:00
Dan Stillman
f4adb452ee Keep the sticky items-list section header clear of the scrollbar
Pin the header inside the scrolling body as a zero-height position:
sticky element so its width tracks the body's content box and it lines
up with the rows without any JS geometry. Reserve a scrollbar gutter so
the macOS overlay scrollbar doesn't float over the content (the opaque
header must paint above the rows to occlude them, and so above the
scrollbar, so it can't be put under it). Drop the body's top padding for
the item tree so rows clip exactly where the header pins, and keep the
gap below the column header as a margin outside the scroll area.

Fixes #5958
2026-06-18 23:25:22 -04:00
Dan Stillman
08d875c7f7 Handle multiple-library item selections dropped on a collection or library
Route each item by its own library -- items already in the target
library are added directly (or skipped, for a library root), while
items from other libraries are copied in -- instead of attempting an
invalid cross-library insert. Disallow a move of such a selection
rather than silently copying.

Fixes #5961
2026-06-18 16:13:16 -04:00
Dan Stillman
6d1cd85211 Skip retraction banner during initial sync on a new computer 2026-06-18 14:51:44 -04:00
Dan Stillman
39954dc437 Remove dead collection assignment for window-opened notes (#5954)
The collections passed through Notes.open into the note window were never
read -- the note editor has no collections setter and EditorInstance.collection
is never assigned on this path -- so they had no effect. New notes are still
added to the selected collection(s) directly in newNote().
2026-06-18 14:10:25 -04:00
Dan Stillman
20fd5fe3e2 Move tag selector view settings popup handler out of XHTML (#5954) 2026-06-18 14:09:49 -04:00
Dan Stillman
618fcfa49d Use one combined tag query for a multiple-row selection (#5954) 2026-06-18 14:09:44 -04:00
Dan Stillman
1c76195a7c Show library-aware section headers in the item tree for multi-row selections (#5954)
When multiple collection-list rows are selected, group the combined
items by library under sticky headers (e.g., "My Library", "Group X (2
collections selected)"), or show a single summary header for a multi-row
selection within one library, with blank spacer rows separating
libraries.
2026-06-18 14:09:36 -04:00
Dan Stillman
94c78759ab Add support for sticky section headers to VirtualizedTable (#5954)
When stickySectionHeaders is enabled, the header of the section at the
top of the view is pinned in an overlay that the rows scroll under,
pushed up as the next section's header arrives. Consumers identify
header rows via isSectionHeader. Row striping restarts at each section
header so every section's first row is the same shade.
stickySectionHeaders defaults to false, so existing tables are
unaffected.
2026-06-18 14:09:31 -04:00
Dan Stillman
b80fa996f5 Group the items list by library (#5954)
When the items list contains items from more than one library, group
them by library -- in collections-list order, independent of the active
sort -- with a section heading above each library's items.

Grouping is triggered automatically by an items list spanning more than
one library, not the kind of selection behind it, so any future source
of multi-library items would be separated the same way. Today the
cross-library collection selection is the only such source.
2026-06-18 14:09:17 -04:00
Dan Stillman
15c2c95470 Support multiple-collection selection (#5954)
Allow selecting multiple collections, saved searches, or library roots in the
collection tree -- within a library or across libraries -- and show the union
of their items. The selection is threaded through the pane as an array
(getCollectionTreeRows(), changeCollectionTreeRows(), etc.); the item pane, tag
selector, reports, and export operate on all selected rows.

Adding items (new items and notes, drag-and-drop, the attachment dialog,
import, Add by Identifier) targets every selected collection. Only rows that can
share an items view may be combined: collections, saved searches, and library
roots mix freely, and multiple Recently Read rows can be combined across
libraries, but other special views (Trash, Duplicates, etc.) and rows from
different visibility groups can't be shown together, so a selection mixing them
keeps only the focused row. In-window advanced search runs across all selected
collections.

Advanced search value autocomplete is now scoped to the searched library, fixing
a long-standing TODO where suggestions were drawn from all libraries regardless
of the search scope; for a cross-library selection it spans the selected
libraries.

For a cross-library selection, the tag selector shows the union of tags
(colored tags only when a single library is in scope, since colors are
per-library), and deleting a tag spans all selected libraries while
rename/color/split are disabled. If advanced search is open, the
collection and saved-search conditions are omitted, since each is scoped
to a single library.
2026-06-18 14:05:55 -04:00
Dan Stillman
2ddb4e991b Show sort indicator on default-sorted column and fix first-click reverse
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
On a fresh profile, the default sort column had no explicit sortDirection,
so the first header click set the default direction instead of reversing
the sort, and no sort indicator was shown.
2026-06-17 15:33:37 -04:00
Abe Jellinek
e23a453e5c Recently Read: Show matching children as regular rows
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
In other words, don't show the children that make the parent "recently
read" as context rows.

Children that don't match the Recently Read condition (such as notes,
as well as other child attachments that weren't read since the cutoff)
are still shown as context rows.

And add tests for the new behavior, and clean up an unused local var.
2026-06-16 13:52:14 -04:00
Dan Stillman
4d38970ef0 Center the Advanced Search filter button's focus ring on the field edge
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-06-15 20:38:37 -04:00
Bogdan Abaev
e6f82dabfd fix keyboard nav through advanced search btns+deck (#5955)
- Include the Advanced Search button in the quick-search tab sequence
- Tab: quick-search textbox -> Advanced Search button -> item tree
- Shift-Tab: Advanced Search button -> quick-search textbox
- Shift-Tab: item tree -> Advanced Search button (when the deck is
  closed)
- Shift-Tab: Advanced Search collapse button -> New Item button
- Fix Shift-Tab from the item tree doing nothing when the Advanced
  Search deck is open; now moves focus to the deck's last focusable
  element
- add tooltiptext to expand/collapse and close btns
2026-06-15 20:38:27 -04:00
Dan Stillman
cf876033f6 Fix join-mode menulist clipping at top of Advanced Search 2026-06-15 15:22:16 -04:00
pi-dal
f03004bb9e
fix(attachments): add PMCID fallback for PubMed resolver lookup (#5906)
PubMed saves can include a PMCID even when DOI-based full-text lookup
fails to produce a PDF. In that case the connector asks the desktop
attachment resolver flow for fallback sources, but getFileResolvers()
only considered DOI and URL data, so Zotero never tried the matching
PMC article URL.

Treat PMCID as a valid signal for file lookup eligibility and add a
PubMed Central OA resolver before DOI-based OA lookup. Cover the new
fallback path in attachment resolver tests and the connector
hasAttachmentResolvers endpoint.
2026-06-15 14:57:49 -04:00
Abe Jellinek
80ca898a74 Preferences: Fix search not filtering and not highlighting results
1. 862573eab added references to fileRenaming.ftl strings but didn't
   add a <link> to it, so document.l10n.formatMessages() returned
   nothing. It fell back to Zotero.getString(), which threw an error
   due to a missing string in en-US. We didn't catch that, so the entire
   search process aborted every time.
2. message.attributes is an optional array of { name, value } objects,
   not an object itself, so we were never successfully adding FTL .title
   and .label attributes to the parsed strings.

This fixes the 862573eab regression, and makes search match FTL
attributes as it was always intended to.

Fixes #5947
2026-06-15 13:55:06 -04:00
Dan Stillman
7eef2fb3f0 Don't let a failed database backup block a schema upgrade or startup
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
During a schema upgrade, a failed backup aborted the upgrade and blocked
startup on every launch. Automatic backups are best-effort, so just log
the error and skip the backup instead.

https://forums.zotero.org/discussion/132201/errorunknownerror-could-not-stat-ns-error-generate-failure-44-4350
2026-06-15 11:53:01 -04:00
Dan Stillman
22055d92b7 Fix opening the DB on network filesystems (e.g., SMB) on macOS/Linux
(Confirmed on macOS, but probably Linux too)

Pass openNotExclusive to avoid acquiring an exclusive lock at the OS level
at open time, which fails with an I/O error on network shares. We still set
locking_mode=EXCLUSIVE, so the connection holds an exclusive SQLite lock for
its lifetime and keeps the WAL index in heap memory (no -shm file).

Regression in Zotero 7 (Fx115)

Fixes #4860
2026-06-15 11:16:54 -04:00
Dan Stillman
39d7835472 Don't show post-upgrade banner for source and dev builds 2026-06-15 09:57:45 -04:00
Dan Stillman
e41c788c4c Don't show standalone attachments open in tabs in the citation dialog 2026-06-14 23:24:22 -04:00
Dan Stillman
580e423d4c Fix failing saved-search test
The new Save Search name prompt blocked deck.pane.save().
2026-06-14 16:18:05 -04:00
Dan Stillman
27560d9476 Prompt for a name when saving a new advanced search
The temporary advanced search saved silently under an auto-generated
"Untitled" name. Prompt for a name instead (defaulting to that name),
and label its button "Save Search…" to signal the dialog. The saved-search
editor's button, which saves changes directly, is now just "Save".

https://github.com/zotero/zotero/pull/5658#issuecomment-4696398750
2026-06-14 15:17:25 -04:00
Dan Stillman
81b3c13b13 Close the saved-search editor when the edited search is deleted
Deleting the saved search being edited triggered onCollectionSelected's
save-changes prompt, which doesn't make sense for a search that's gone.
Detect the deleted search and close the editor without prompting.
2026-06-14 15:02:40 -04:00
Dan Stillman
a3180d87c5 Show focus ring on the advanced-search condition menu when opened
The menu was focused programmatically (in response to the filter-button
click), so :focus-visible wasn't set and no focus ring showed. Pass
focusVisible to force the ring.
2026-06-14 14:53:11 -04:00
Dan Stillman
8ed617ae53 Allow removing the last advanced-search condition to reset it
The remove button on the sole remaining condition is now enabled once a
value is entered, and clicking it replaces the condition with the default
empty one shown when the pane is first opened, instead of staying
disabled.
2026-06-13 19:33:31 -04:00
Dan Stillman
97aa4f93ea Restore saving advanced searches in editable group libraries
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Regression in #5658
2026-06-13 19:21:35 -04:00
Dan Stillman
3d334dc244 Align Advanced Search close button with the filter button's right edge
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-06-13 11:03:58 -04:00
Dan Stillman
18d332ec5e Patch out native control margins in Advanced Search
macOS-normalize-controls zeros margins on inputs and checkboxes but not
menulists or buttons, so their native platform margins threw off the
spacing. Zero them and restore spacing via the containers' gaps.

https://github.com/zotero/zotero/pull/5658#issuecomment-4696398750
2026-06-13 09:47:37 -04:00
Dan Stillman
702094f703 Shift Advanced Search filter button to center its icon
https://github.com/zotero/zotero/pull/5658#issuecomment-4696398750
2026-06-13 09:47:25 -04:00
Dan Stillman
40851e1f58 Add bottom border to Advanced Search area
https://github.com/zotero/zotero/pull/5658#issuecomment-4696398750
2026-06-13 09:47:20 -04:00
Dan Stillman
2689997c50 Fix Advanced Search area height calculation
The inner <deck> stacks both panes in one grid cell, so the area was
always sized to the taller (saved-search) pane and never shrank back.
The non-selected pane is now removed from layout entirely.

https://github.com/zotero/zotero/pull/5658#issuecomment-4696398750
2026-06-13 09:47:11 -04:00
Abe Jellinek
00527332c4 Move Advanced Search and saved search editing to the main window (#5658)
---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-06-12 15:21:59 -04:00
Bogdan Abaev
d2f1c56250 keep search conditionIDs in arithmetic sequence
When conditions are removed, shift conditionIDs so that
conditionIDs always go in increments of 1 (0, 1, 2 ...).
It prevents conditionIDs from conflicting with each other
when conditions are rearranged.

Fixes: #3434
2026-06-12 15:16:46 -04:00
Dan Stillman
cd29a818b0 Don't let hover background override selected item background 2026-06-12 15:07:17 -04:00
Bogdan Abaev
0f2d3e103d Citation dialog: show placeholder after a new bubble is added (#5932)
After the first bubble is added, the focused input gets a placeholder
indicating that typing a number will add it as a page to the just-added
bubble. The placeholder is truncated if it's too close to the edge in
multi-item citations.

Also add a tip to the item details popup explaining that locators can
be typed into the main input field, with a link to the documentation.
The tip stops appearing once a typed locator has been used.

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-06-12 15:07:17 -04:00
Bogdan Abaev
40f949ba94 Citation dialog: allow accepting while details popup is open
- allow to accept the dialog via cmd/ctrl+Enter from
inside of a panel
- enable click-through on item details panel, so
one can click on the "Accept" button without having
to close the popup first

These two measures allow one to add a bubble, modify
the citation via item details popup, and accept it
with one less step (without having to close the popup first)
2026-06-12 15:02:14 -04:00
Dan Stillman
c72d80f22b Update Word for Windows submodule 2026-06-12 12:58:00 -04:00
Dan Stillman
cd39445b94 Automatically repair unusable login manager
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Zotero never sets a primary password, so if one is set on the NSS key
database, it was either corrupted or copied in from a Firefox profile,
and stored logins can never be decrypted, since there's no
primary-password prompt. This previously made it impossible to save
credentials without manually deleting cert9.db, key4.db, and
logins.json from the profile directory.

If reading or saving credentials fails and a primary password is set,
clear stored logins and reset the key database so that credentials can
be saved again. Saving the API key or WebDAV password is retried
automatically, so logging in completes without a manual fix, and if
previously stored credentials are lost to a reset, show a one-time
alert prompting the user to log in again.
2026-06-12 11:17:00 -04:00
Dan Stillman
632f11db74 Fix corrupted-login-manager warning never appearing
The once-per-minute rate limit from e40fff6a7d (5.0.91) was inverted,
and the last-error time was never initialized, so the alert hasn't
appeared since 2020.
2026-06-12 11:17:00 -04:00
Dan Stillman
55434d14a1
Encrypt API key and WebDAV password using OS keychain (#5897)
Wraps the values stored in nsILoginManager with OSKeyStore, which derives
its master key from Keychain on macOS, DPAPI on Windows, and libsecret on
Linux. A copy of the profile alone is no longer enough to extract these
credentials.

Existing plaintext entries are mirrored once per session to a new
"(encrypted)" realm but preserved in the original realm so a user can
still downgrade to a release that doesn't know about encryption. Active
credential changes (sign in, sign out, password change) write to the
encrypted realm only and remove the legacy entry. A future version can
clear any remaining legacy entries on startup.

Patches MOZ_APP_BASENAME in the bundled runtime so the keychain master
key is labeled "Zotero Encrypted Storage" rather than "Firefox Encrypted
Storage", with a check_line guard so a future Mozilla change to the
OSKeyStore label format fails the build instead of silently rebranding
the entry. Also fixes check_line to take an explicit file argument.
2026-06-12 11:16:22 -04:00
Martynas Bagdonas
98d82d2909 Add SDT support 2026-06-12 13:47:08 +03:00
Abe Jellinek
982c00aaf6
Add by Identifier: Stay open with input, don't clear unless submitted (#5949) 2026-06-11 11:54:42 -04:00
Dan Stillman
06e16c297c Fix file-change detection in all libraries after the first one synced
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
The local-file-change watcher added in f21e1b2d32 accumulated changed
item keys globally but was drained separately by each library's storage
engine, with the drained keys filtered to that library. The first
library to file-sync (normally My Library) consumed all pending events,
and keys belonging to other libraries were silently discarded, so files
modified on disk in group libraries were never marked for upload. The
initial and periodic full-scan fallbacks on Windows and Linux were
likewise global, so only the first library ever received them, and
changes made in other libraries while Zotero was closed were never
detected at all.

The sync runner now drains the watcher once per sync session and
immediately runs the modification check on the changed items across all
libraries, recording any changes in the database, and the per-library
storage engines skip the check entirely unless the watcher reports that
the library needs a full scan:

- On all platforms, a library that has never been scanned gets one full
  scan, which also gives libraries one recovery scan for changes dropped
  by affected releases.
- On Windows/Linux, where the watchers only capture events while Zotero
  is running, each library gets a full scan on its first file sync of
  the session, on every manual sync, and daily during background syncs
  (instead of the previous 3-hour interval, which dated from when scans
  were the primary detection mechanism).
- On macOS, libraries scanned since the last FSEvents journal
  discontinuity are tracked in a pref, since the journal -- and
  therefore the validity of previous scans -- survives restarts.

Also:

- Check FSEvents event flags and fall back to full scans when events
  were dropped or coalesced (MustScanSubDirs/UserDropped/KernelDropped/
  EventIdsWrapped), and skip HistoryDone sentinel events
- Disable the watcher for the session and fall back to legacy scanning
  on backend errors, including when the inotify watch limit is reached,
  instead of continuing with silently incomplete coverage
- Prune scan records for deleted libraries, since SQLite can reuse a
  deleted library's libraryID

https://forums.zotero.org/discussion/132120/
2026-06-10 22:26:13 -04:00
Dan Stillman
de1bf1cec1 Update Mac Word plugin install flow for macOS 27 Golden Gate
On macOS 27 and later, the installer gets access to the Word startup
folder via a folder-selection dialog rather than an OS permission
prompt, so support an adjusted banner message and add strings for the
folder dialog.
2026-06-10 15:06:01 -04:00
Dan Stillman
4e3baf09a0 Add okButtonLabel support to FilePicker
Maps to nsIFilePicker.okButtonLabel, which customizes the label of the
button used to accept the dialog, where supported by the platform.
2026-06-10 15:06:01 -04:00
Dan Stillman
fde4086e08 Show file-access error when storage directory can't be cleared on download
createDirectoryForItem() wipes and recreates the item's storage
directory before moving in a downloaded file. If removeDir() failed
(e.g., a locked file on Windows), the error bubbled up to zfs.js and
became the generic sync error. Route it through checkFileAccessError()
instead, so the user gets the actionable locked-file message and a
Show Parent Directory button.

https://forums.zotero.org/discussion/132097/
2026-06-10 08:07:32 -04:00
Adomas Venčkauskas
3e7030a642 Update Word for Windows submodule
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-06-10 12:31:08 +03:00
abaevbog
fa3e0f683f
Citation dialog: display preview of the citation (#5916)
In Add/Edit Citation mode, display a preview of the citation
in the bottom section. The section can be hidden/displayed
via the toggle in the right corner.

Remove io.preview from editor instance, so that citation
dialog knows not to show the preview even if the preference
is set.

A minor refactor to have resizeWindow() resolve
when the animation is fully over, and clear minHeight
on window in list mode before resizing, restoring
it when resizing animation is done, same as in library mode.
It allows us to fully expand the window in list mode before
showing the preview.

Fixes: zotero#5910
2026-06-09 12:35:30 -04:00
Abe Jellinek
dcf5010415
Info box: Optimize rendering of many creator rows (#5939)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-06-08 15:43:32 -04:00
Dan Stillman
31d9e89165 Fix item tree focus checks broken by view-specific tree IDs
The item tree's DOM id carries a view-specific suffix (e.g.
"item-tree-main-default", "item-tree-main-recentlyRead"), but three
call sites compared against a single hardcoded "item-tree-main":

- Collection highlighting on Ctrl/Option (zoteroPane.js) -- match on
  the "item-tree-main" prefix to cover all views. This restores
  highlighting in Recently Read, where it silently failed.
- Focusing the items list after Add Item by Identifier (lookup.js) --
  use the current view's tree id instead of a literal that resolved to
  null and threw.
- Shift-Tab from the item tree to the toolbar (zoteroPane.js) -- key the
  actionsMap on the current view's tree id.

Add a test confirming focus lands on the items list after a lookup.

https://forums.zotero.org/discussion/130968/collection-of-selected-papers-is-not-highlighted-in-recently-read-panel
2026-06-08 13:21:15 -04:00
Dan Stillman
d0507e02c8
Restore -default suffix on item tree column-prefs keys (#5941)
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
The earlier fix (ef7896ab5f) migrated 9.0.x's "<id>-default" prefs
forward to the refactor's new "<id>" key, but that left 9.0.x and 10
beta keying differently in treePrefs.json, so switching between versions
always reset 9.0.x to defaults.

Put the `-default` suffix back so Z9 and Z10 read and write the same
key, and migrate any unsuffixed `<id>` data written by an earlier beta
back to `<id>-default` on first load. The migration runs once per
process and can be removed in a future release once beta users have all
updated.

https://forums.zotero.org/discussion/131653/zotero-10-beta-5-reinitializes-the-columns-in-main-pane
2026-06-05 13:10:01 -04:00
Christopher Holmes
31b3ead557
Abbreviate Atmospheric as Atmos. (#5938)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
example: 
"Atmospheric Chemistry and Physics" is currently incorrectly abbreviated as "Atmospheric Chem. Phys." should be abbreviated "Atmos. Chem. Phys."
2026-06-04 15:38:42 -04:00
Adomas Venčkauskas
615ba3c178
Improve Add/Edit Citation button behaviour when cursor is in a non-citation Zotero field (#5935)
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
When in bibliography, show an appropriate message. When in any other
non-citation Zotero field - just open an empty edit citation dialog.
2026-06-03 03:51:26 -04:00
Abe Jellinek
e029354a35
Fix US-formatted Last Read dates in en-* alias locales (#5934) 2026-06-03 02:35:15 -04:00
Dan Stillman
87901c1c21 Fix error when removing a tag stored in a non-normalized form
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
Zotero.Tags.init() keyed the id cache by the raw tag name from the
database, but getID() and Items._loadTags() both normalize names via
cleanData() (trim + NFC). A tag stored in a non-normalized form (e.g.,
non-NFC or with surrounding whitespace) could therefore never be matched
by getID(), which returned false. When such a tag was removed from an
item, that false was bound as the tagID parameter in the DELETE FROM
itemTags query, throwing "Invalid boolean parameter 1 'false'" and
aborting the save. Since this fired while applying changes during sync,
it persistently blocked sync.

To fix, normalize names in init() to match getID()/_loadTags().

https://forums.zotero.org/discussion/131901/error-report-seems-to-be-preventing-sync
2026-05-31 17:07:13 +02:00
Adomas Venčkauskas
8cf5c9b3d1 Fix ctrl-arrow navigation in item tree with no selection causing a select
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
Regression 4a003049
2026-05-28 15:17:45 +03:00
Adomas Venčkauskas
c838e9b29e Fix double-indent on collection tree (regression 5ca1fbb1)
Closes #5915
2026-05-28 15:17:45 +03:00
Adomas Venčkauskas
8277277948 Make Item Pane display the item count on Zotero startup 2026-05-28 15:17:45 +03:00
Adomas Venčkauskas
786960079b Fix item pane lagging 'items in this view' count by one view
Closes #5913
2026-05-28 15:17:45 +03:00
Dan Stillman
70c4cadab1 Fix full-text indexing failing silently after periodic vacuum or backup
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
vacuum() and the APFS-cloning offline backup path both close and
reopen the SQLite connection, which drops all ATTACHed databases --
including the in-memory "indexing" alias used for the fulltextWords
scratch table set up in Fulltext.init(). Once the connection is
reopened, indexing queries fail with "no such table:
indexing.fulltextWords", and indexItems()'s ignoreErrors path
routes the error to logError(), so indexing silently stops working
for the rest of the session.

Add an onConnect() hook on Zotero.DBConnection for per-connection
state that doesn't persist across reopens, and use it from
Fulltext.init() to re-attach the indexing DB on each reconnect.

Regression sources:

- 67288047f3 ("Use APFS cloning for file copies on macOS") flips
  online idle backups to offline-with-clone on APFS, so every idle
  backup interval (24h default) closes and reopens the connection.
  Affects Mac users on APFS.
- b27c4cb023 ("Enable SQLite WAL mode and add periodic VACUUM
  INTO") adds the vacuum path, which closes and reopens on the
  first idle period in a session that passes the freelist/time
  gates. Affects all users with sufficient DB churn, roughly once
  per 14 days.

https://forums.zotero.org/discussion/131576/debug-id-d848621212-indexing-of-pdfs-fail-zotero-9-0-3
https://forums.zotero.org/discussion/131718/possible-bug-regression-report-search-unusable-on-macos-zotero-9-0-3-with-large-library
2026-05-22 10:59:43 -04:00
Abe Jellinek
bf8c6f2027 Revert "Read Aloud: Fix 402 handling"
This reverts commit a692ca3493.

Not necessary on main.
2026-05-22 10:27:40 -04:00
Dan Stillman
cfd5596814 Disable locale selector when parent style specifies default-locale
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
For a dependent CSL style with no default-locale of its own, citeproc-js
parses the parent's XML and silently uses the parent's default-locale
over any user-selected locale, making the locale dropdown a no-op. Add
a Zotero.Style.effectiveLocale getter that falls back to the parent's
locale, and use it in updateLocaleList and the locale-selector custom
element to disable the dropdown in that case.

https://forums.zotero.org/discussion/comment/512891/#Comment_512891
2026-05-21 22:32:23 -04:00
Abe Jellinek
a692ca3493 Read Aloud: Fix 402 handling 2026-05-21 15:10:32 -04:00
Dan Stillman
9ca79a2cb1 Update Mac and Linux builds to Firefox 140.11.0esr 2026-05-21 10:43:53 -04:00
Dan Stillman
d2631cc614 Don't mark group attachment as unsynced when opened
For group items, attachmentLastRead is stored in a synced setting in My
Library rather than on the item itself, but since we didn't pass
skipSyncedUpdate, the item was being marked as needing sync, resulting
in a permission-denied error in read-only libraries.

https://forums.zotero.org/discussion/131717/opening-pdf-in-read-only-group-library-triggers-permission-denied-on-sync
2026-05-21 09:58:34 -04:00
Dan Stillman
ad4caa8688 Let sync API client handle its own 429/Retry-After throttling
The general HTTP layer's automatic 429/Retry-After retry only retries
the one failed request, but the sync layer wants to pause its entire
batch of concurrent requests via concurrentCaller.pause(). Add a
noRetryOnThrottle option to Zotero.HTTP.request() that throws on 429 or
503 with Retry-After so the caller can apply its own throttling, and
have syncAPIClient set it. Extend sync's catch block to also honor
Retry-After on 503 (previously only invoked via _check429).
2026-05-21 09:15:04 -04:00
Dan Stillman
37bf9d0965 Trigger full sync when server library version goes backward
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
When a user's account is deleted and then undeleted on the server, the
dataserver creates a fresh shardLibraries row at a low version, while the
client still has a much higher local library version. Subsequent syncs
then throw "_libraryVersion cannot decrease" and the user is stuck.

Tag the cannot-decrease errors from the library version setters with a
named error, catch it in Engine.start(), reset libraryVersion and
storageVersion to -1, and restart. The retry hits the existing
libraryVersion == -1 branch and runs _fullSync(), which re-uploads the
local library against the recreated server library.
2026-05-20 23:11:35 -04:00
Dan Stillman
f81e7cb5da Handle 429 and Retry-After in general HTTP layer
Previously only 503 + Retry-After was retried automatically; 429 was
handled only inside the sync API client. Extend _retryOnServerError()
to also retry on 429, honoring Retry-After on both 429 and 503 and
falling back to the existing exponential backoff otherwise.
2026-05-20 15:08:52 -04:00
abaevbog
8f44172342
citation dlg: sort libraries by cited count (#5925)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
In list mode, sort libraries by the count of their items
cited in the current document, falling back to alphabetic sorting
when counts are equal, with "My Library" always getting
priority over other groups.

Fixes: #5924
2026-05-19 15:40:55 -04:00
Abe Jellinek
b7437faf55 Convert ItemPane{SectionElement,Container}Base to ES modules
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-05-18 15:48:31 -04:00
Abe Jellinek
c2a9ea2687 Add Abstract section to merge pane with value chooser 2026-05-18 15:48:31 -04:00
abaevbog
5c232d65c0
Citation dialog: display first run guidance panel when the first item is added vs on initial open (#5917)
Display the first run guidance panel when the first
item is added to the citation vs on initial open.
2026-05-18 14:28:32 -04:00
Dan Stillman
596882980d Update reader submodule 2026-05-18 14:19:53 -04:00
Abe Jellinek
714d4416f8 Suppress Crash Reports and RemoteSettings console spam
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
2026-05-13 14:40:51 -04:00
Abe Jellinek
ba7e036582 Devtools: Fix profiler (Performance tab)
Fixes #5111
2026-05-13 14:01:55 -04:00
Adomas Venčkauskas
431e1dabde Fix first-column sizing after tree refactor. Closes #5908
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-05-12 10:35:05 +03:00
Martynas Bagdonas
789c83249c Avoid selecting tabs queued for close
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
When closing multiple tabs, close() could choose another tab from the same close set as the replacement selection. If that tab was an unloaded note, it could load during shutdown or bulk close and open separately. Choose only from tabs that will remain open.

Fixes https://forums.zotero.org/discussion/131203/closing-zotero-with-a-note-opened-as-a-tab-opens-the-note-in-a-separate-window
2026-05-11 19:54:11 +03:00
Dan Stillman
504447de41 Close advanced search window in collectionViewItemTree notify() test
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
The test opened an advanced search window but never closed it, which
likely caused the intermittent failures in the ZoteroPane focus() test
"should shift-tab across the zotero pane".
2026-05-07 14:25:58 -04:00
Dan Stillman
ddf2419e78 Update Windows builds with Word template compatibility fix from #5904
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-05-06 10:51:13 -04:00
Adomas Venčkauskas
d66682b04e
Undo Mozilla changes that allow non-UTF-16 command line args (#5904)
To allow old Word Zotero.dotm to continue to work
2026-05-06 10:27:13 -04:00
windingwind
fda72a3434
Fix beta build plugin max version compatibility check (#5903)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Ignore persisted compatibility flag from previous app version in non-stable releases to fix disabled for wrongly using old flag
Ignore max version compatibility for plugin update check on non-stable releases
Relevant: https://forums.zotero.org/discussion/131096/

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-05-05 14:26:50 -04:00
Wuy
575dc5351c Fix reader cleanup on tab close and event listener removal 2026-05-05 14:30:26 +03:00
Mi Ramon
4b2c0518f1
Add File menu options to note tabs (#5876)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Show in Library and Close

And standardize `showInLibrary()` as a ZoteroPane function
2026-05-04 15:37:32 -04:00
Dan Stillman
99228a6c76 Disallow changing item type to/from attachment, note, or annotation
The UI doesn't allow this, but plugins could do it, leading to sync
errors. (Can't do much for direct DB access.)

https://forums.zotero.org/discussion/131286/67734299-error-happens-in-my-zotero-plz-help-me
2026-05-04 15:30:27 -04:00
Mynacol
ede90ac04a
Make icons directory during build (#5889) 2026-05-04 15:27:03 -04:00
Abe Jellinek
fc37e524fe
Fix Find Full Text captcha loop on ScienceDirect (#5902) 2026-05-04 15:23:43 -04:00
Dan Stillman
8d59331d43 Fix quick search not expanding annotation rows after item tree refactor
https://forums.zotero.org/discussion/131294/quick-search-does-not-expand-annotations-10-0-beta4
2026-05-04 13:52:37 -04:00
abaevbog
3c53118f2c
Citation dialog: resizable width of collectionTree (#5892)
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
2026-04-30 14:43:54 -04:00
Dan Stillman
ef7896ab5f Fix lost item tree column choices after item tree refactor
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Before the refactor, main library column prefs were keyed under
"<id>-default", because the visibilityGroup getter returns 'default'
(truthy) for the main library. The refactor changed the suffix logic to
only append non-default groups, leaving existing prefs orphaned at
"<id>-default" while the new code reads/writes "<id>".

Fall back to the legacy key on load when the new key is missing or an
empty object (which can be written out by an unmodified post-refactor
build that flushed prefs on a visibility-group switch, like switching to
feeds), and drop the legacy key on the next write.

https://forums.zotero.org/discussion/131202/lost-columns-displayed-choice-in-the-items-tree-after-update-to-10-beta-4
2026-04-29 15:25:46 -04:00
Dan Stillman
178f162449 Add test for collection highlighting on Ctrl/Option
Covers the regression fixed by a7d001fc1d. The prior test for
_setHighlightedRowsCallback() called the callback directly, bypassing
the focus check and the keydown handler.
2026-04-29 15:21:29 -04:00
Dan Stillman
a7d001fc1d Fix stale references to old item tree DOM id
After the item tree refactor, the items tree id became "item-tree-main"
instead of "item-tree-main-default". Update the remaining call sites,
restoring collection highlighting on Ctrl/Option, focusing the item tree
after Add Item by Identifier, and Shift-Tab focus movement from the item
tree to the toolbar (which only still worked due to the native tab
order).
2026-04-29 14:57:02 -04:00
Dan Stillman
36e25d171a Update English strings for Transifex 2026-04-29 14:14:58 -04:00
Dan Stillman
a57cb6276f Prefs: Localize "Data Directory:" label in Advanced pane
Hard-coded as "Data directory:" in the original commit. Move to Fluent
and fix the dara-dir-label typo on the id (and the matching
aria-describedby) while we're here.

https://forums.zotero.org/discussion/130868/untranslated-string-data-directory
https://forums.zotero.org/discussion/131212/translation-not-reflected
2026-04-29 14:14:32 -04:00
Dan Stillman
373accce3b Update locales from Transifex 2026-04-29 12:19:13 -04:00
Dan Stillman
66dc97de33 Update English strings for Transifex 2026-04-29 09:44:57 -04:00
Abe Jellinek
03d94060b4 Replace chai-as-promised assertions in server_connector tests
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-04-28 13:33:58 -04:00
Abe Jellinek
13cb8d99b6 Server: Remove /connector/request endpoint
Never used.
2026-04-28 13:05:31 -04:00
Abe Jellinek
82b31574a8 Server: Test new browser detection behavior 2026-04-28 13:05:31 -04:00
Abe Jellinek
bc2ede0459 Server: Close request without response when browser is detected 2026-04-28 13:05:30 -04:00
Abe Jellinek
2e19017d0e Server: Improve browser detection 2026-04-28 13:05:30 -04:00
Abe Jellinek
2f38926da5 CasePreservingHeaders: Fix some Headers instances not being recognized
I guess the Headers class accessible from test code is different from
the Headers class in http.js (for the purposes of instanceof, at least).
2026-04-28 13:05:30 -04:00
Dan Stillman
5dc817db44 Validate Host header in connector server
Restores a check that was originally added in 10ad4c33 but lost in the
June 2024 server rewrite (#5148)
2026-04-28 13:00:40 -04:00
Dan Stillman
fd812070b6 Fix WebDAV download auth for usernames with special characters
HTTP.download() was rewritten in 0fe31b0f04 to use fetch() and build the
Basic auth header itself via btoa(username + ':' + password), but the
username and password come from nsIURI.username/password, which are
percent-encoded. As a result, a username like "user@example.com" was
sent as "user%40example.com", causing a 401 on every WebDAV download for
any user with @, :, space, etc. in their username. Other request types
were unaffected because they go through xmlhttp.open(method, url, true,
username, password), which decodes internally.

Decode username and password in _parseURI() so the values returned can
be used directly for Basic auth (and as a side effect, fix the other
display/use sites that were getting the percent-encoded form).

https://forums.zotero.org/discussion/131174/zotero-10-betas-1-2-3-cant-download-from-webdav-http-401
2026-04-28 13:00:40 -04:00
windingwind
e13e85b2e5
Fix plugin FTL registration (#5896)
Use one registry to avoid competing of language detect between plugins,
as resources declared as optional is identical to resource missing and thus fails the check and returns null for the string (https://searchfox.org/mozilla-esr140/source/intl/l10n/rust/l10nregistry-rs/src/registry/asynchronous.rs#140)
Register the plugin FTL for all languages Zotero supports with proper fallback logic so that even resources are declared as required, the check doesn't fail when plugin doesn't provide the resource.
Fix Zotero.File.getResourceAsync to use NetUtil channel to handle jar: url with `@`.
2026-04-28 12:00:04 -04:00
Dan Stillman
7ca8242a3e Update reader submodule
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-04-27 16:05:48 -04:00
Dan Stillman
a43d6a5d37 Fix erroneous data dir reuse in new profile on Windows
In a newly created profile, we check whether another profile is using
the default data directory, and if so, we create a new data directory
named after the profile (e.g., "Zotero Work"). But on Windows, paths in
prefs.js are stored with escaped backslaches (C:\\Users\\foo\\Zotero),
so searching for the JS string with literal single backslashes
(C:\Users\foo\Zotero) always failed, we would conclude that the default
dir was unused, and we would reuse the existing database.

To fix, escape backslashes in dataDir before the substring check.
Mac/Linux paths have no backslashes so this is a no-op there.
2026-04-27 16:04:52 -04:00
Dan Stillman
1ff2f640eb Remove Zotero for Firefox data directory migration code
The new-install branch in DataDirectory.init() read prefs.js from the
default Firefox profile to detect a pre-2017 dataDir setting, and the
read was unwrapped, making prefs.js access errors fatal at startup [1].
We could add a try/catch, but after nine years, it's probably safe to
just remove the migration. If anyone is returning from >9 years in the
wilderness and they still want old unsynced Zotero data, they can
manually move their data to the default location.

[1] https://forums.zotero.org/discussion/131176/installation-error-accessing-mozillas-pref-js-see-msg-pls
2026-04-27 16:04:52 -04:00
Mi Ramon
462357e49e
"Updating add-ons" → "Updating plugins" (#5893) 2026-04-27 14:50:51 -04:00
Adomas Venčkauskas
777d01b5c2 Item Tree: Column visibility logic improvements
Columns now have properties: `enabledIn`, `disabledIn` and `defaultIn`,
corresponding to column picker availability and default visibility. The
properties now filter based on attached collection view type instead of
visibilityGroup.

Visibility groups are for views where we want distinct column sets to
persist, like the feeds view.

Collection type properties are used to specify which columns are
available for a given type, regardless of whether it's in a different
visibility group or not.
2026-04-27 14:44:39 -04:00
Adomas Venčkauskas
5ca1fbb167 Item tree refactor megacommit
Split ItemTree megaclass into:
- ItemTree - concerned with drawing the virtualized table container and
  column interaction
- ItemTreeRowProvider - provides rows and issues notifications for
  render updates
- ItemTreeRow and subclasses - contains row-specific data and rendering
  logic
- CollectionViewItemTree and its accompanying classes - a version of
  ItemTree that renders items attached to a given Collection or
  CollectionView (CollectionTreeRow).

Various improvements in logic and rendering, separation of concerns.
2026-04-27 14:44:39 -04:00
Dan Stillman
6b42f9f9c0 Update translate submodule
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
2026-04-23 15:34:28 -04:00
Abe Jellinek
d7920e320b cookieContextId -> userContextId 2026-04-23 15:34:28 -04:00
Abe Jellinek
f0474fa250 Add support for clearing challenge in browser during translation 2026-04-23 15:34:28 -04:00
Dan Stillman
df6037ce0a Update Windows build to Firefox 140.10.0esr 2026-04-23 13:43:12 -04:00
Dan Stillman
24e16c0aad extract_xul_dll: Process whichever arch ZIPs are present 2026-04-23 13:38:26 -04:00
Dan Stillman
2d14f33de2 Windows build: Copy custom Firefox ZIP back to app/win/ 2026-04-23 13:38:26 -04:00
Dan Stillman
de69835419 Update Mac and Linux builds to Firefox 140.10.0esr 2026-04-23 11:40:55 -04:00
Dan Stillman
0b15b794e6 Offer to reset data directory on SQLite I/O error at startup
When a custom data directory is on a network share or in a cloud storage
folder, SQLite can fail to open with NS_ERROR_STORAGE_IOERR and the user
previously had to manually edit prefs.js to recover. Show a "Use Default
Location" button in the startup error dialog that resets the data
directory pref and restarts.

Addresses #4860
2026-04-23 11:38:29 -04:00
Adomas Venčkauskas
e7ed0b2881 Update Word for Windows submodule 2026-04-23 09:09:06 +03:00
Dan Stillman
a487dd9eef Rename pdf-worker submodule to document-worker
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
Repo moved to zotero/document-worker on GitHub

After pulling, run:

    git submodule sync
    git submodule update --init document-worker

If an old `pdf-worker/` directory is left behind, it can be removed manually.
2026-04-22 15:50:02 -04:00
Adomas Venčkauskas
9abd13fd22 Fix ZoteroPane tests failing intermittently 2026-04-22 10:16:05 +03:00
Dan Stillman
e1cd83214f CI: Deploy from version branches (9.0, 10.0, etc.)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
And drop reference to fx128 branch
2026-04-21 14:41:21 -04:00
windingwind
fa9a54b773
Fix plugin prefs.js change not taking effect after update (#5888)
Do not use cache for loading the prefs.js
2026-04-21 10:44:44 -04:00
Abe Jellinek
a835136d3b Update reader submodule
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-04-20 12:00:05 -04:00
Abe Jellinek
89ee4c21c0 Read Aloud: Fix network error string key 2026-04-20 11:08:19 -04:00
Adomas Venčkauskas
26816b03e2 Fix bad utilities submodule commit 2026-04-20 09:35:46 +03:00
Adomas Venčkauskas
07906931c1 Update utilities submodule 2026-04-20 09:31:23 +03:00
Dan Stillman
c52a6151dc Fix ZoteroPane.viewAttachment() tests after HTTP.download() rewrite
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
2026-04-17 15:36:21 -04:00
Dan Stillman
ce424c6b67 Fix attachment tests after HTTP.download() rewrite
Add a spy on Zotero.HTTP.download and update call-count assertions to
split between request() and download() calls. Previously download()
delegated to request(), so a single requestStub tracked everything.
2026-04-17 15:21:25 -04:00
Abe Jellinek
cc76207a23
Remove CookieSandbox, add new utility for cookie isolation (#5853) 2026-04-17 14:23:04 -04:00
Tom Najdek
32e43cb8f1
Fix tag paste to include existing field text at cursor position (#5873) 2026-04-17 14:20:52 -04:00
Dan Stillman
00ece3db68 Update reader submodule 2026-04-17 14:18:21 -04:00
Dan Stillman
0fe31b0f04 Rewrite HTTP.download() to stream via fetch() + ReadableStream
- Replace XHR-based download with fetch() + response.body streaming,
  writing chunks to disk via IOUtils instead of buffering the entire
  response in memory
- Separate out the retry and URL-parsing logic so it can be reused
  between request() and download()
- Split the ZFS download code into a request() with `followRedirects:
  false` to get the metadata headers and a separate download() to
  download the file

Fixes #5476, Downloading of large files is broken
2026-04-17 14:17:40 -04:00
Dan Stillman
45596e70e9 Work around Fluent issue leaving "{$version}" in post-upgrade banner
Some users see the literal "{$version}" placeholder in the banner,
likely due to some Fluent quirk triggered by plugin localizations.
(Missing localizations? Missing strings?) After translation, check the
version span and substitute manually if needed.

https://forums.zotero.org/discussion/129171/version-variable-is-displayed-in-zotero-8-upgrade-banner/p1
https://forums.zotero.org/discussion/130864/just-upgraded-to-zotero-9-on-debian-through-check-for-updates-and/p1
2026-04-17 11:32:22 -04:00
Dan Stillman
11c75ae6e5 Update reader submodule 2026-04-17 11:14:39 -04:00
Dan Stillman
c2c66795d2 Add some extra asserts to debug test flakiness in CI 2026-04-17 10:47:04 -04:00
windingwind
55672ba933
Fix removal logic for menu added by MenuManager (#5886)
Add the registered main key to menu class list so that they can be found when plugin is removed.
Add test for the fix.
2026-04-17 10:13:36 -04:00
Abe Jellinek
488fd29978 Read Aloud: Handle failure when trying to pause other tab
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
https://forums.zotero.org/discussion/130920/tts-breaks-after-automatic-theme-changes
2026-04-16 16:26:45 -04:00
Dan Stillman
d2d4451165 Fix WebDAV tests for Account pane rename
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-04-14 23:56:23 -04:00
Dan Stillman
a9fe8e3b62 Fix Account preferences tests
And update suite name
2026-04-14 22:46:37 -04:00
Dan Stillman
acfb7c7915 Rename zotero-prefpane-sync ID to zotero-prefpane-account
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-04-14 16:10:50 -04:00
Dan Stillman
7334080693 Rename sync preference files to account 2026-04-14 16:10:50 -04:00
Dan Stillman
c89abbc5be Rename Sync preferences pane to Account
- Restructure the pane layout: account info (username, email,
  login/logout) at the top, followed by a separate "Sync" section with
  an intro description and "Learn more" link, data sync options, and
  file syncing
- Migrate hardcoded "Zotero storage" strings to FTL and fix
  capitalization
- Rename the "Zotero" storage dropdown to "Zotero Storage".
2026-04-14 16:10:50 -04:00
Mi Ramon
676d609d0d
Add a icon for "Relate Items" (#5884) 2026-04-14 15:46:54 -04:00
Tom Najdek
ad4bb17db9
Fix CSS specificity causing tag swatches to render in reverse order 2026-04-14 11:38:15 +02:00
abaevbog
683ecf1620
fix related item sometimes not selected on click (#5885)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
https://forums.zotero.org/discussion/130887/clicking-related-fails-zotero-report-id-1418809492
2026-04-13 13:09:53 -04:00
Dan Stillman
56ef61e45b Store vacuum.lastTime as seconds, not milliseconds
Also drop the default pref, since this is just internal state
2026-04-13 12:39:51 -04:00
Dan Stillman
f20eb5b566 Fix crash when annotation item is missing itemAnnotations row
Don't throw when updateDisplayTitle() retry fails after loading
annotation data for a corrupt item. Also add an integrity check to
delete annotation items without itemAnnotations rows.

Fixes https://forums.zotero.org/discussion/130872
2026-04-13 12:29:57 -04:00
Dan Stillman
62815bdd00 Update version to 10.0
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
2026-04-10 13:41:18 -04:00
Dan Stillman
1ed1fab55b Switch to 9.0 branch for 9.0 releases 2026-04-10 13:40:13 -04:00
Dan Stillman
16b63a97dd Remove concurrent backup tests
These tested racing an offline backup against an in-progress online
backup, which wouldn't happen in practice (schema backups run at startup
before the idle observer, and someone is very unlikely to perform a DB
integrity check immediately after returning from an idle that triggered
a backup). The tests relied on fragile timing and a shared tmp file,
causing failures on Linux after the WAL checkpoint change. The tests
were already skipped on macOS after switching to APFS clones.
2026-04-10 13:35:57 -04:00
Dan Stillman
b27c4cb023 Enable SQLite WAL mode and add periodic VACUUM INTO
- Switch journal mode from DELETE to WAL for better write performance.
  With EXCLUSIVE locking mode, SQLite uses heap memory for the WAL
  index, avoiding an -shm file. Set synchronous=NORMAL (matching what
  Mozilla uses for Places). Checkpoint WAL on database close so the
  .sqlite file has all data (for copies or backups).
- Add periodic database compaction on idle (after DB backup) using
  VACUUM INTO and do an atomic file swap back to zotero.sqlite if no
  writes occurred during the operation. Check if vacuuming is needed
  based on time interval (default 14 days) and freelist ratio (default
  10% threshold).
- Disable auto_vacuum, which causes fragmentation and is unnecessary
  with periodic VACUUM
- Remove the VACUUM call from the integrity check, which was always just
  an awkward hack to let people trigger a VACUUM without having an
  explicit button

Closes #652
2026-04-10 13:19:32 -04:00
Dan Stillman
e22e2cd9dd Fix hardcoded version in post-upgrade banner 2026-04-10 11:21:20 -04:00
Abe Jellinek
3e04f5e3e7 Enable Read Aloud in stable builds
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-04-09 15:35:02 -04:00
Dan Stillman
a0198e2571 Support pinned incrementals from deploy server
Fetch pinned-incrementals-{platform} from the deploy server and merge
with the normal last-N incrementals list. This ensures incremental MARs
are always built from key versions (e.g., last release of each major
version) regardless of how many newer versions have been released.
2026-04-09 14:35:18 -04:00
Dan Stillman
e96d65f0ed Fix manage_incrementals on Cygwin
Remove Windows path conversion that was needed for aws s3 cp but
breaks scp (which interprets the drive letter colon as a hostname).
2026-04-09 12:32:03 -04:00
Dan Stillman
1a89239a13 Separate build and deploy for release scripts
Split build_and_deploy into build_for_deploy (builds, uploads to S3,
rsyncs manifests) and a deploy script in client-downloads (updates
updates JSON, updates incrementals, runs deploy command).

Release scripts support -b flag for build-only (deploy later manually).
Beta/dev/test scripts build and deploy automatically via SSH.

Move incrementals files from S3 to deploy server. Update DEPLOY_PATH to
root of client-downloads so manifests and deploy script paths are
derived from it.
2026-04-09 11:37:05 -04:00
Dan Stillman
a1baa68006 Update reader submodule 2026-04-09 11:30:51 -04:00
Dan Stillman
f82efc766d Fix Added/Modified By visibility when switching between library types
The `_getColumns()` column cache key didn't account for library type, so
switching between personal and group libraries reused cached columns
from the previous library type. This caused `groupLibrariesOnly` columns
(Added By, Modified By) to be missing in group libraries or incorrectly
shown in personal libraries.

Additionally, `VirtualizedTable.componentDidUpdate()` only recreated its
internal `Columns` object when the id prop changed, not when the columns
prop changed, so even with correct column rebuilding in `ItemTree`, the
table wouldn't pick up the new column list.

https://forums.zotero.org/discussion/130521/added-by-column-missing
2026-04-09 11:29:02 -04:00
Dan Stillman
ea230faa26 Add deployment script for 9.0
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-04-08 14:58:25 -04:00
Dan Stillman
c3d8058794 Update locales from Transifex 2026-04-08 14:49:52 -04:00
Dan Stillman
117fa1dddb Update citeproc.js to include Juris-M/citeproc-js#275 2026-04-08 11:19:01 -04:00
Abe Jellinek
4b14ca9af4
Set Recently Read threshold relative to most recent item (#5878)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
And persist cutoff within session
2026-04-07 14:10:18 -04:00
Dan Stillman
91e82566ff Update locales from Transifex 2026-04-07 11:00:22 -04:00
Dan Stillman
70047b6fd6 Update English strings for Transifex 2026-04-07 11:00:22 -04:00
Mi Ramon
5671a724e8
Fix broken Find option under Edit menu in reader (#5877) 2026-04-07 10:38:50 -04:00
Dan Stillman
a3aa2bb5c7 Add general-more-information FTL string 2026-04-07 10:33:11 -04:00
Dan Stillman
3f0de027a2 Auto-resolve lastRead sync conflicts by picking the most recent value 2026-04-07 10:29:25 -04:00
Dan Stillman
4398a2bcee Update reader submodule 2026-04-03 15:49:23 -04:00
Dan Stillman
67288047f3 Use APFS cloning for file copies on macOS
Add Zotero.File.copyFile(), which uses clonefile() on APFS with a
fallback to IOUtils.copy(), and use it for all significant file copies.
APFS is detected and cached for each parent folder via
Zotero.File.isAPFS(), which uses statfs().

On APFS, all database backups now use the offline (close/clone/reopen)
path instead of the SQLite online backup API. Cloning is nearly
instant, and backup files share disk blocks via copy-on-write, saving
potentially gigabytes of space.

Closes #5330
2026-04-03 14:33:21 -04:00
Dan Stillman
b11d776b36 Update locales from Transifex 2026-04-03 13:19:02 -04:00
Dan Stillman
92c876e47d Fix switching-accounts error on loginCancelled from stream server
Only resolve for known events, matching the polling behavior.
2026-04-03 12:17:03 -04:00
Dan Stillman
d5ee350081 Disable snapshot saving in feed item translation itest
To try to fix intermittent CI errors
2026-04-03 09:58:47 -04:00
Dan Stillman
5a347f4be5 Update style test for NLM/Vancouver style changes 2026-04-02 16:11:47 -04:00
Dan Stillman
a602d21258 Remove erroneous license header 2026-04-02 15:57:19 -04:00
Dan Stillman
7f9fdc0786 Update translators, styles, CSL locales, and renamed-styles.json 2026-04-02 15:51:43 -04:00
Dan Stillman
2d88a3f181 Update English strings for Transifex 2026-04-02 15:48:14 -04:00
Dan Stillman
0ff3ec6a1b Move file renaming strings to fileRenaming.ftl
Move file-renaming-* and rename-files-preview-* strings from zotero.ftl
to a dedicated fileRenaming.ftl. Rename rename-files-preview-* keys to
file-renaming-preview-window-* for consistency.
2026-04-02 15:48:14 -04:00
Dan Stillman
c2ce0af87a Update Windows build to Firefox 140.9.0esr 2026-04-02 15:20:52 -04:00
Dan Stillman
92db62df0a Update reader submodule 2026-04-02 15:16:23 -04:00
Tom Najdek
862573eabc
Per-group file renaming settings (#5862)
Also:

- Add `isAdmin` property to libraries
 
---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-04-02 15:15:06 -04:00
Abe Jellinek
41b5442952 Add string for Read Aloud from Here 2026-04-02 14:42:42 -04:00
abaevbog
c6a95fd5b7
citation dlg: fix CI test breakage (#5870)
- prevent the focus handler from resetting the cached
items in search handler
- wait for search to finish after changing dialog type
in "should not display empty note child rows" test
2026-04-02 11:27:43 -04:00
Dan Stillman
842115ff7e Update Mac and Linux builds to Firefox 140.9.0esr 2026-04-02 11:20:52 -04:00
Dan Stillman
8effdacf65 Update English strings for Transifex 2026-04-01 14:57:52 -04:00
Dan Stillman
d2a01d02f8 Move zotero-text-link margin reset to base _textLink.scss
Not sure why this was only in preferences.scss
2026-04-01 14:53:46 -04:00
abaevbog
6f5f221db0
citation dlg: no irrelevant child rows in itemTree (#5863)
Pass filterChildItems to itemTree from citationDialog
to filter out unwanted child rows before adding them
in toggleOpenState.

In annotations mode, do not add child notes and
attachments without annotations
In add-note mode, only keep child notes that have content
2026-04-01 14:05:40 -04:00
Bogdan Abaev
df18ac4e1f citation dlg: updated icons
- updated annotations dialog type icons for dark and light mode
- use checkmark instead of right arrow for "accept" button
- fix incorrect sizing of "accept" and "cancel" icons
2026-03-31 14:53:11 -04:00
Bogdan Abaev
0e7ed13a43 citation dlg: variable min-width for list/library
- Allow different min-width for list vs library layouts.
In library mode, we need at least 1000px to have a functional
itemTree, especially when sidepane is present. But for list
mode, 1000px is very wide, so min-width should be 800px.
Increased min-height of itemTree from 200px to 400px
- When the dialog closes, store the width/height of
the current dialog's layout. Then, when the dialog opens
next time in that layout, set window's width/height based on last saved
params. That way, one can open a citation dialog in list
mode at 800px, then open annotations dialog (always library mode)
at 1000px, and then have the citation dialog in list mode open
again at its intended 800px.
- If one switches from library to list mode, add a smooth
window resizing animation to shrink diagonally from current width
to 800px. If one switches from list to library mode,
window smoothly resizes to 1000px min-width. This is
not applied to linux where win resizing behavior is a bit jumpy.
2026-03-31 14:53:11 -04:00
Tom Najdek
f3ecf285b3
Fix flakiness in "should shift-tab across the zotero pane" test 2026-03-31 01:38:28 +02:00
Mi Ramon
293cd25fb6
fix bg color for highlighted and selected rows in collection tree (#5855)
regression from a365465
2026-03-30 16:50:43 -04:00
Mi Ramon
5f942684b6
fix: indentation for some settings items is not taking effect on Windows (#5867) 2026-03-30 16:49:18 -04:00
Tom Najdek
2ad4618efb
Exclude ©, ®, and ™ from emoji detection regex 2026-03-29 17:51:27 +02:00
Abe Jellinek
fb8389d654
Read Aloud: Persist last-read position in synced setting (#5860) 2026-03-27 15:22:02 -04:00
Dan Stillman
391e8497a6 Handle per-object 403 on settings upload and reset to remote version
If the server returns a write report with 403 for admin-only settings,
mark successful settings as synced and reset rejected settings to
their remote values by re-downloading from the server.

Needed for #5862
2026-03-26 15:54:28 -04:00
Dan Stillman
1267440187 Update reader submodule 2026-03-26 14:23:26 -04:00
Dan Stillman
16380e4a19 Pass includeEmails=1 in /keys request when opening Sync settings 2026-03-26 13:11:26 -04:00
Dan Stillman
6140088b0c Swap order of annotation and note buttons in citation dialog 2026-03-25 13:14:12 -04:00
abaevbog
1d437d88f0
citation dialog: insert annotations followup (#5858)
- fix breakage when initially setting annotation dialog
   mode to library
- on click of a non-annotation item in suggested items,
   select the top-level library if the item could not be selected
   in the initial state of the itemTree
- increase min-width of the dialog to 1000px to ensure
   there's always space for the sidebar.
2026-03-24 21:07:19 -04:00
Dan Stillman
8a0a798672 Update word processor submodules for Add Annotation 2026-03-24 15:38:33 -04:00
Dan Stillman
0e8b195c5a Add tests for image annotation placeholder in notes 2026-03-24 12:09:15 -04:00
Dan Stillman
8167c903f3 Fix WebSocket 4409 error on sync logout
Properly remove the sync streaming subscription before clearing the
API key on logout.
2026-03-24 12:09:15 -04:00
Dan Stillman
322b764091 Show email addresses in sync settings
Fetch emails from /keys response and login session result, persist them
in the local database, and display them in the sync settings for both
logged-in and logged-out-but-linked states.

Also unify the separate logged-out-linked and logged-in containers into
a single layout that toggles elements based on login state.

Requires dataserver and stream-server changes
2026-03-24 12:09:08 -04:00
Dan Stillman
5ac56ae717 Fix removing from Recently Read in read-only group libraries 2026-03-24 11:51:37 -04:00
Dan Stillman
2522be0c17 Add test for removing group item from Recently Read on settings sync 2026-03-24 11:36:43 -04:00
Dan Stillman
a3909af5ab Clear lastRead in Item#fromJSON() when absent from API response
When the server returns an attachment without lastRead (because it was
cleared), fromJSON was not clearing the local value since it only
processes fields present in the JSON. Add explicit check after field
processing to clear lastRead when absent.
2026-03-24 11:36:43 -04:00
Martynas Bagdonas
6998235a31 Allow note creation when image annotation rendering fails
Fixes #5857
2026-03-24 11:56:53 +00:00
abaevbog
81591eb890
ItemTree: + expands all rows one level at a time (#5797)
On + keypress, expand the rows down one level, instead of
expanding all rows at once. If some rows are expanded
and some are collapsed, expand to the deepest level
currently visible.
E.g. if some regular items are already expanded,
expand only remaining collapsed regular items. If there
is a row with expanded attachments, expand all rows.

On - keypress, collapse the rows up one level to be consistent.

https://forums.zotero.org/discussion/129596/optional-annotations-in-item-list
https://forums.zotero.org/discussion/130365/expand-all-shift-in-zoteros-behavior-changed
2026-03-23 15:25:30 -04:00
Bogdan Abaev
6bec3c817e Citation dialog: allow to insert annotations (#5356) 2026-03-23 15:00:22 -04:00
Dan Stillman
587d5cda7e Show placeholder for image annotations without cache image in notes 2026-03-23 14:31:41 -04:00
Dan Stillman
351860273f Fix error creating note from image annotations when PDF file is missing 2026-03-23 14:31:41 -04:00
abaevbog
5823247df9
itembox: fix lost focus on tab from invalid DOI (#5856)
Fix lost focus on tab from DOI field after it is updated
from a valid to an invalid value.

https://github.com/zotero/zotero/pull/5850#discussion_r2976238955
2026-03-23 13:43:23 -04:00
Dan Stillman
d21a5d9cad Use Fluent strings for annotation type names
This also fixes title casing for "Image Annotation"/"Ink Annotation" in
the items list.

https://github.com/zotero/zotero/pull/5356#issuecomment-4112317776
2026-03-23 13:28:45 -04:00
Abe Jellinek
763330d1f4 Prevent attachment preview from bumping lastRead
And also use new _isTransient() to control lastPageIndex update, instead
of overriding _setState() as a no-op in ReaderPreview.
2026-03-23 12:54:00 -04:00
Mi Ramon
6fa5c4b3e3
Add "View Online" for PMID/PMCID (#5850)
resolves: #5845
2026-03-23 12:41:57 -04:00
Dan Stillman
fd7cc84f6b Fix quicksearch in Recently Read to match parent items
Add includeParents to the Recently Read search so parent items are
included in the search scope alongside their child attachments.
2026-03-23 11:22:01 -04:00
Dan Stillman
5bceea7b7b Fix Added By backfill skipping items when batch count doesn't change
Use itemID offset to advance through batches instead of comparing
result counts, which would bail out when the number of remaining items
equaled the previous batch size.
2026-03-23 10:25:34 -04:00
Dan Stillman
46ba21fe75 Add More Information link to Switch Accounts confirmation dialog 2026-03-23 10:25:33 -04:00
Abe Jellinek
8af91b0147
Bump lastRead when reader is closed (#5852) 2026-03-21 13:41:54 -04:00
Dan Stillman
e629a3c456 Update global schema to version 42 to enable lastRead fetching 2026-03-21 13:31:11 -04:00
Dan Stillman
6e5738de0f Try to fix missing Added By for some items
Backfill groupItems rows that have lastModifiedByUserID but null
createdByUserID (not totally sure how), and track completion with a
per-library flag in the settings table so the backfill only runs once
(since createdByUserID could potentially be permanently unavailable).
2026-03-21 12:27:27 -04:00
Dan Stillman
518056f9e7 Notify item tree after backfilling group item users
Fire a modify notifier event after _updateGroupItemUsers() so the
item tree refreshes to show the newly backfilled Added By / Modified By
values. Also change error handling from return to break so partial
progress still triggers the refresh.
2026-03-21 12:21:17 -04:00
Dan Stillman
ba3c3a506f Add test for preserving synced on lastRead setting download 2026-03-20 17:03:23 -04:00
Dan Stillman
e28c97dc56 Fix synced group item marked as unsynced when lastRead setting is applied
When a lastRead synced setting for a group item was downloaded and
applied via AttachmentReadObserver.notify(), the group attachment item
was saved without skipSyncedUpdate, causing it to be marked as synced=0.
On the next sync, this could trigger an upload attempt that failed with
403 for read-only group libraries.
2026-03-20 16:55:02 -04:00
Dan Stillman
7b17187a1a Update reader submodule 2026-03-20 15:46:42 -04:00
Dan Stillman
eb3a136ccd Use new batch setting deletion API endpoint
Use DELETE /settings?settingKey=key1,key2 instead of individual DELETE
per key, with batching matching uploadDeletionBatchSize.
2026-03-20 15:43:03 -04:00
Abe Jellinek
0ade1b9ed5 Show Attachments column by default in Recently Read 2026-03-20 15:19:03 -04:00
Dan Stillman
98d911f6b1 Add "Switch Accounts" flow for logged-out-but-linked state
When a user logs out without removing local data, the sync pane now
shows a third UI state with the linked username, a "Log In" button
(constrained to the same account), and a "Switch Accounts…" button
that shows a hard confirmation dialog requiring the user to type
"remove local data" before proceeding. On confirmation, local data
is reset and the app restarts, reopening the account preferences.
2026-03-20 13:11:52 -04:00
Dan Stillman
883747e372 Improve hard confirmation dialog textbox
- Show confirmation text as placeholder
- Auto-focus the textbox
- Fix border styling
2026-03-20 13:11:38 -04:00
Dan Stillman
35713fefd0 Upload setting deletions during sync
Deleted settings were written to syncDeleteLog but never uploaded. Add
dedicated setting deletion upload in _startUpload() using individual
DELETE requests per setting, since the API doesn't support batch setting
deletion.
2026-03-20 11:25:27 -04:00
Dan Stillman
3ebd26acc0 Fix saving lastRead in read-only library from synced setting
The same skipEditCheck fix from 5dc9705294 but for the synced setting
handler, which updates lastRead when a lastRead setting arrives via
sync for a group attachment.
2026-03-20 11:25:27 -04:00
Dan Stillman
5dc9705294 Fix saving lastRead in read-only library 2026-03-20 08:48:03 -04:00
Dan Stillman
cf7fcd751f Move lastRead column string from .properties to .ftl
Follow-up to 34039991f8
2026-03-19 16:19:52 -04:00
Dan Stillman
1d31ed2508 Fix sync runner test for updated login error button text 2026-03-19 15:48:16 -04:00
Dan Stillman
1502214b5d Web-based login flow
Replaces the login form with a "Log In" button that creates a dataserver
login session and opens the website for logging in. The client polls for
session completion every few seconds and also watches for a notification
from the streaming server.
2026-03-19 15:07:53 -04:00
Abe Jellinek
1f702fc5dc Read Aloud: Add sentence-granularity skip strings 2026-03-19 13:46:44 -04:00
Dan Stillman
c9f893a5a2 Update reader submodule 2026-03-19 12:46:37 -04:00
Martynas Bagdonas
376fba55b6 Update note-editor submodule 2026-03-19 15:57:30 +00:00
Dan Stillman
8401b83cb6 Update dateModified and lastModifiedByUserID when trashing 2026-03-19 11:35:15 -04:00
Dan Stillman
1fad46f983 Disable OA PDF lookups in feed item translation test
Avoid external network requests during test that may have been a source
of intermittent CI failures.
2026-03-19 11:04:22 -04:00
Dan Stillman
5b5b70b499 Show file size in MB instead of KB in ZFS quota warning 2026-03-19 10:38:57 -04:00
Dan Stillman
489a46564f
Add "Remove from Recently Read" (#5847)
- Non-force delete clears `lastRead` on all child attachments (with
  prompt), force delete moves to trash (matching collection behavior)
- Re-run search on item modify in Recently Read view so items disappear
  when lastRead is cleared (also handles sync changes)
2026-03-19 10:30:18 -04:00
Dan Stillman
f0af0bec9d Fix lastModifiedByUserID update overwriting createdByUserID
Use ON CONFLICT to update only lastModifiedByUserID when
createdByUserID isn't being set, rather than REPLACE INTO, which
replaces the entire row.
2026-03-19 00:10:02 -04:00
Dan Stillman
07d99d891f Fix breakage from aaed7ddfc0 in non-standard collectionTreeRow objects
Guard against collectionTreeRow missing isWithinGroup() (e.g., in
Advanced Search)
2026-03-18 23:28:29 -04:00
Dan Stillman
aaed7ddfc0 Add Added By and Modified By columns for group libraries
- Add columns as options in item tree, visible only in group libraries
- Fall back to createdByUserID for Modified By when lastModifiedByUserID
  is not set
- Update lastModifiedByUserID on local saves when dateModified changes
- Fix backfill in _updateGroupItemUsers() to process all batches
- Update formatColumnName() to support Fluent string keys

Closes #233
2026-03-18 23:19:11 -04:00
abaevbog
288fa8e401
hide recently-read pseudo-collection during filter (#5849)
Same way as unfiled, duplicates and trash pseudo-collections
are hidden
2026-03-18 12:05:16 -04:00
Tom Najdek
085a6fa5e0
Move search condition localization strings to Fluent (#5848) 2026-03-18 11:25:58 -04:00
Dan Stillman
d20cac39c9 Fix unhandled promise rejections in ConcurrentCaller when clearing queue
When stop() or stopOnError rejected queued task promises, the rejection
handlers (via Promise.allSettled) weren't attached yet, causing Mozilla
to report each one as "uncaught exception: Object". Add no-op catch
handlers before rejecting so the runtime knows they'll be handled
downstream. Also fix stopOnError path to reject with CanceledException
instead of undefined, and remove legacy Bluebird handledRejection flag.
2026-03-17 13:59:52 -04:00
Abe Jellinek
34039991f8
Track attachment last-read time, add Recently Read virtual collection (#2854)
Track when attachments are last opened or read, storing a `lastRead` Unix timestamp on the attachment. For user library items, `lastRead` syncs as an attachment property in item JSON. For group library items, it syncs via a per-user synced setting (like `lastPageIndex`).

- Add `lastRead` column to `itemAttachments`
- Add `AttachmentReadObserver` to update `lastRead` on file open and page change (throttled to 5 min for page changes)
- Add "Recently Read" virtual collection (items read in last 14 days, sorted by `lastRead` descending)
- Add `lastRead` search condition with date operators
- Add `lastRead` item tree column with new `dependsOnChildren` property for parent item aggregation
- Add `getItemLastRead()` to return max `lastRead` across child attachments

Also:

- Generalize collection tree SCSS to support universal (context-fill) icons alongside themed icons

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-03-17 13:52:00 -04:00
Dan Stillman
0ce5cd5bac Clear Read Aloud voices pref when logging out 2026-03-17 11:44:09 -04:00
Dan Stillman
08c75006f3 Update English strings for Transifex 2026-03-16 15:26:28 -04:00
Dan Stillman
290d44480e Move new "Log In"/"Log Out…" strings to Fluent 2026-03-16 15:25:34 -04:00
Dan Stillman
43f422a989 Update English strings for Transifex 2026-03-16 15:16:10 -04:00
Dan Stillman
a9342cc242 "Log in with your zotero.org account" → "[…] Zotero account" 2026-03-16 15:15:07 -04:00
Dan Stillman
426d681b65 Remove Citation Explorer string
Final string should be committed with #3468 (and in Fluent)
2026-03-16 15:12:42 -04:00
abaevbog
fb4ac78291 citation dlg: fix details popup buttons overflow (#5838)
For locales with long button labels.
https://forums.zotero.org/discussion/130208/spacing-is-off-in-citation-detail-pop-up
2026-03-12 14:46:45 -04:00
Tom Najdek
fa476245fe
Fix "Rename from Parent" button sometimes not appearing (#5835)
After editing the parent item, switching back to the attachment item before the parent item's save completes creates a race condition between the save and the attachment render.

Moved item pane tests related to file renaming to a separate describe() block.
2026-03-11 14:39:37 -04:00
Tom Najdek
518e7d22a0 Fix a flaky test on CI 2026-03-11 14:35:39 -04:00
Tom Najdek
3328557d00 Revert "Temporarily disable attachment-pane tests due to test failures"
This reverts commit 810626e458.
2026-03-11 14:35:39 -04:00
Tom Najdek
259abb15f5 Revert "Temporarily disable attachments-pane tests due to test failures"
This reverts commit 3d09df1419.
2026-03-11 14:35:39 -04:00
Tom Najdek
d3509ae259 Add support for test retries and enable three retries on CI 2026-03-11 14:35:39 -04:00
Dan Stillman
be1373dd3a Update reader submodule 2026-03-10 11:35:46 -04:00
Tom Najdek
fcce3bb21d
Fix autocomplete popup always showing scrollbar
Previous styling caused the autocomplete popup to render a scrollbar even when all items were visible.
2026-03-09 23:32:41 +01:00
windingwind
f130e3b3e5
Fix menu API icon inheritance (#5832)
Also:

- Change menu API l10nArgs from object to string to be consistent with other APIs and function calls
2026-03-09 15:42:42 -04:00
abaevbog
25a96c35ca
citation dlg: fix itemTree dblclick stealing focus (#5833)
Make sure bubble-input is refocused after double-click
on itemTree, same as as after adding an item to citation
via Enter or + click.

Fixes: #5830
2026-03-09 14:56:47 -04:00
Dan Stillman
d2d66d322c Fix UNC paths test for updated Zotero RDF translator
zotero/translators@9906b24d changed the file path predicate from
rdf:resource to z:path.
2026-03-09 14:55:25 -04:00
Dan Stillman
db70d92b4c CLAUDE.md: Clarify that Fluent should be used for all new strings 2026-03-09 14:45:43 -04:00
Dan Stillman
2c234c4c0a Update reader submodule 2026-03-09 10:28:32 -04:00
Dan Stillman
2f6825027a Add Director fallback to firstCreator for Video Recording items
The firstCreator/sortCreator SQL now falls back through primary →
editor → director → contributor. This ensures Video Recording items
with only a Director creator show that creator in the items list.

Also refactors the repetitive SQL-building in _getFirstCreatorSQL()
and _getSortCreatorSQL() into helper functions.

Closes #5720
2026-03-09 10:28:06 -04:00
Dan Stillman
f9a10e1874 Fix Title column not recoverable when hidden by a plugin
If a plugin (or corrupt treePrefs.json) sets the Title column to
hidden and no other primary column is visible, force-show it.

Closes #5747
2026-03-09 10:28:06 -04:00
Dan Stillman
f6811bd1a8 Add Citation Key column
https://forums.zotero.org/discussion/130194/feature-request-citation-key-column-in-library-window
2026-03-08 14:46:39 -04:00
Dan Stillman
e60bf91e31 Fix PDF magic number sniffing matching anywhere in first 200 bytes
The %PDF- sniffer entry had no offset constraint, so it matched anywhere
in the file sample. This could cause ZIP files containing PDFs to be
misidentified as application/pdf when opened, since %PDF- could appear
within the first 200 bytes of the archive. Pin the match to offset 0,
where it must appear in a valid PDF.

Fixes https://forums.zotero.org/discussion/130161/zip-files-and-indexing
2026-03-08 14:46:39 -04:00
Abe Jellinek
81f80a62e3 Update RDF tests 2026-03-06 16:51:25 -05:00
Abe Jellinek
12942ec717 Update translators 2026-03-06 16:51:25 -05:00
Adomas Venčkauskas
ce11d5295c Update LibreOffice submodule 2026-03-06 13:57:53 +02:00
abaevbog
b80bcea184
add citationKey to quicksearch-titleCreatorYear (#5814)
So quicksearch and citation dialog in list mode search
by the citation key, in addition to title,creator,etc.

https://forums.zotero.org/discussion/130090/zotero-picker-i-cant-search-item-by-citation-key
2026-03-05 20:08:52 -05:00
Abe Jellinek
0abf2b455f
Add Read Aloud first-run guidance panel (#5818)
Plus guidance-panel changes:

- Fix description not updating when multiple panels exist
  in the document
- Fix nonfunctional noautohide attribute
- Show "Got It" button for noautohide with no navigation

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-03-05 20:07:06 -05:00
Dan Stillman
20735c425f
Add resetData() as lightweight alternative to resetDB() for sync tests (#5822)
resetData() clears user data and sync state using application APIs
instead of doing a full Zotero shutdown/reinit cycle, making it much
faster for tests that just need clean state between runs.

Also make Tags.init(), Creators.init(), Users.init(), and
SyncedSettings.loadAll() properly clear their caches before reloading,
so they are safe to call more than once.
2026-03-05 15:54:10 -05:00
windingwind
76c7a613a9 Fix attachment preview 2026-03-05 12:24:26 -05:00
Mi Ramon
c0c9437da8
use different notes icons in itempane and tab sidepane (#5799) 2026-03-04 23:46:17 -05:00
Abe Jellinek
3a11ac146d Item merging: Don't merge trashed attachments of any type 2026-03-04 23:14:53 -05:00
Abe Jellinek
c9d108ba5e Extract merge logic to new module
Without changes. Most of this code was never called outside items.js,
so there was no reason to expose it.
2026-03-04 23:14:53 -05:00
Dan Stillman
810626e458 Temporarily disable attachment-pane tests due to test failures
https://github.com/zotero/zotero/issues/5810
2026-03-04 23:08:25 -05:00
windingwind
c4df6b2151
Fix should register other main window menus test (#5812) 2026-03-04 22:56:18 -05:00
Dan Stillman
3d09df1419 Temporarily disable attachments-pane tests due to test failures
https://github.com/zotero/zotero/issues/5810
2026-03-04 22:52:41 -05:00
Dan Stillman
9d5f46587e Disable Better BibTeX <9.0
https://forums.zotero.org/discussion/comment/508650/#Comment_508650
2026-03-04 22:43:24 -05:00
Dan Stillman
7c61d282ee Use our own blocked-plugin message that doesn't mention Mozilla 2026-03-04 22:43:11 -05:00
Abe Jellinek
a6a919234a Update reader submodule 2026-03-03 17:37:06 -05:00
Abe Jellinek
f07d7077b5 Read Aloud: Move caching to RemoteInterface 2026-03-03 17:36:51 -05:00
Abe Jellinek
4e60a9fbca Read Aloud: Don't log FTL fetching errors
appLocalesAsBCP47 contains locales that we don't have FTL files for, so
ignore those errors.
2026-03-03 16:07:47 -05:00
Abe Jellinek
db124860ed Read Aloud: Use POST for /speak 2026-03-03 15:40:35 -05:00
Dan Stillman
f5dd72dfb5 Run CI tests against zip-round-tripped build output
Instead of testing against the build/ directory directly, zip it up first
and then unzip it back into build/ before running tests. This ensures
tests run against the same artifact that gets uploaded to S3 and used by
the deployment scripts, catching issues that only manifest after a zip
round-trip (e.g., resolved symlinks, missing files).

Also makes Ruby setup conditional on deployment branches
2026-03-03 09:53:07 -05:00
Adomas Venčkauskas
1cd12791f6 Update LibreOffice submodule 2026-03-03 11:45:32 +02:00
Abe Jellinek
520a12ebe0 Update reader submodule 2026-03-02 17:51:17 -05:00
Abe Jellinek
b6ffa16893 Add failsafe to ensure pdf.js build worked 2026-03-02 17:46:05 -05:00
Abe Jellinek
a7c76e3202 CI: Trigger new build 2026-03-02 17:33:38 -05:00
Abe Jellinek
041fa48664 Read Aloud: Annotate Last Sentence → Annotate Sentence 2026-03-02 15:32:35 -05:00
Abe Jellinek
13f1606dc7 Read Aloud: Implement onPurchaseReadAloudCredits() 2026-03-02 14:47:14 -05:00
Abe Jellinek
3f90e60cd0 Remove AudioPlayback actor
Not necessary, and it caused some error spam.
2026-03-02 14:13:39 -05:00
Abe Jellinek
e63ed25b3f Read Aloud: Don't localize keys in Annotate Last Sentence 2026-03-02 13:32:28 -05:00
Abe Jellinek
8adee749e0 Read Aloud: Add key hint to Annotate Last Sentence string 2026-03-02 13:19:56 -05:00
Abe Jellinek
b0b2378866
Add support code for Read Aloud (#5355) 2026-03-02 13:00:23 -05:00
abaevbog
5905638907
Clear tag selector when itemTree selection changes, if needed (#5602)
Similar to how quickSearch is cleared already.

To avoid rerunning itemTree refresh twice (once for
clearing quickSearch and once for clearing tag filter),
clear tags and search text directly on collectionTreeRow.
And then call itemTree.refreshAndMaintainSelection to
refresh everything. Without it, tag selector sometimes
would find itself out of sync with current search
results and display tags as if quickSearch was not
cleared.

Fixes #5601
2026-02-28 15:41:32 -05:00
abaevbog
578361913a
Citation dialog: scroll to 1st cited row in library mode (#5782)
Scroll to the first cited item in this citation in current collection

Fixes: #5780
2026-02-28 15:33:36 -05:00
abaevbog
da4978354b
avoid reloading linked item each time it's fetched (#5565)
item.loadAllData() completely reloads all data and
may clear unsaved changes. Instead, Zotero.Items.loadDataTypes
will only load data once if it hasn't been loaded yet.

Followup to fefad8a9e3
per discussion in https://github.com/zotero/zotero/pull/5547#issuecomment-3373597427
2026-02-28 15:24:08 -05:00
Adomas Venčkauskas
003bdab3ff Auto-recover ALL-CAPS macOS corrupted word field codes.
Closes zotero/zotero-word-for-mac-integration#38
2026-02-26 16:22:28 +02:00
Tom Najdek
f0d3347b26
Fix tag splitting for strings containing Unicode characters. Fix #5807 2026-02-25 11:30:55 +01:00
Dan Stillman
f21e1b2d32 Add platform-native file change watcher for storage sync
Use platform-native file change APIs to track which stored-file
attachments have been modified, avoiding expensive full scans of all
attachment files during sync.

Backends:
- macOS: FSEvents (persistent event journal, survives restarts)
- Windows: ReadDirectoryChangesW (live recursive directory watch
  via overlapped I/O polling)
- Linux: inotify (live per-directory watches)

On unsupported platforms or on error, falls back to existing scan logic.
2026-02-24 14:15:15 -05:00
Dan Stillman
2739b29709 Avoid excessive /file requests during file sync
Don't mark attachments for download when server has no file (mtime is
null), and clear TO_DOWNLOAD state on 404 responses in both ZFS and
WebDAV so items aren't re-checked on every subsequent sync.
2026-02-22 23:45:55 -05:00
Adomas Venčkauskas
3386490a03 Fix browser toolbox switching windows breaking script debugging 2026-02-20 12:11:25 +02:00
Dan Stillman
2aaf0c213f DataObject: Set type-derived properties on prototype instead of per-instance
Move _ObjectType, _objectTypePlural, _ObjectTypePlural, and
_ObjectsClass from per-instance properties to prototype properties,
computed once per subclass on first instantiation. This avoids a huge
number of duplicate string allocations and reduce memory usage a bit
(e.g., ~35 MB in a 19K-item test library).
2026-02-17 12:09:59 -05:00
Dan Stillman
0d16d81a3c Share a single cached CSL.Engine instance across output formats
setOutputFormat() just sets this.opt.mode and this.fun.decorate, so
there shouldn't be a need to cache separate engines per format. The
format is excluded from the cache key, and setOutputFormat() is called
on cache hit instead.

Also simplify _preloadFormat() in quickCopy.js to only create one
engine instead of two (one per format).

Saves ~7 MB of resident memory (~140 MB before the citeproc-js
sort-macro caching optimization).
2026-02-17 12:09:59 -05:00
Dan Stillman
fe74fce120 citeproc-js: Cache sort-mode macro expansions to reduce memory usage
Previously, macros referenced by sort keys were expanded inline into
the sort token array every time they were encountered. Non-sort macros
were already cached in state.macros[name] and referenced via closures,
but sort-mode macros were duplicated across sort keys.

With a complex style like chicago-shortened-notes-bibliography (155
macros, 6 macro-based sort keys), this produced 179,605 tokens and
355,652 closures in bibliography_sort alone -- 99.9% of all tokens.

This commit caches sort-mode macro expansions in state.sort_macros[name]
using the same closure-reference approach as non-sort macros.

In addition to the memory savings, avoiding the redundant macro
expansion makes engine initialization dramatically faster with complex
styles.

Results with chicago-shortened-notes-bibliography:
- Engine initialization: 464 ms -> 57 ms (8x faster)
- Per-engine heap (Node.js): 123 MB -> 6.7 MB (94.6% reduction)
- Resident per engine (Firefox): ~140 MB -> ~7 MB
- Total tokens: 187,893 -> 11,669 (93.8% reduction)
- Total closures: 370,982 -> 21,823 (94.1% reduction)
- All 1,502 citeproc-js tests pass (at f88a47e6)
- Same 1501/1505 pass on master (same 4 pre-existing failures)
2026-02-17 12:09:59 -05:00
Dan Stillman
7fe4e50c4c HTTP.request(): Don't try to output responseText if not text response 2026-02-14 16:10:30 -05:00
Dan Stillman
c9ab1ec62c WebDAV: Compute fresh Digest auth headers for each request
The previous approach of capturing and replaying the Authorization header
from an initial request worked for Basic auth but broke with Digest auth,
where the header includes the HTTP method and URI in the hash. This caused
each replayed request to be rejected with a 401, which Firefox wouldn't
retry because the request already included Authorization.

Instead, split _channelAuthorization into _basicAuthHeader and
_digestParams. For Basic auth, the header is still replayed as-is. For
Digest, the challenge parameters (realm, nonce, qop, etc.) are cached
and a fresh Authorization header is computed per request.

_getAuthorizationHeaders() now takes method and URI parameters so it can
compute the correct Digest response hash for each request.
2026-02-14 16:10:30 -05:00
Abe Jellinek
ae397ca37c Fix item type becoming 'undefined' when menu is dismissed with Escape
By adding a missing getter override. If a setter is overridden, the
corresponding getter also needs to be overridden, or it will implicitly
return undefined.

Fixes #5793
2026-02-10 14:34:00 -05:00
Dan Stillman
c377c4c7ec CLAUDE.md: Additional test guidance 2026-02-09 22:38:33 -05:00
Dan Stillman
427fb1d4d9 Update version 2026-02-09 22:38:33 -05:00
windingwind
94dbdd5981
Skip plugin strict_max_version check on non-stable releases (#5781)
Unless `extensions.strictCompatibility` is set to true

resolve: #5775
2026-02-09 22:30:09 -05:00
Dan Stillman
fcd887a89d Fix cross-suite ZoteroPane test failures
Failed when running CollectionTree and ZoteroPane tests together

- Make `deleteSelectedItems()` async and await `deleteSelection()` so
  the full Notifier commit chain (including items list refresh)
  completes before the function resolves. Update tests to call
  `deleteSelectedItems()` directly instead of calling fire-and-forget
  keyboard events, and add a stubbed test for the Delete key binding.

- Fix "Delete Item…" menu test to explicitly re-select after `saveTx()`
  to guarantee selection state
2026-02-09 22:18:50 -05:00
abaevbog
9640875fcf
Space on an option of menulist dropdown will select it (#5783)
Fixes: #5779
2026-02-09 16:43:23 -05:00
Dan Stillman
c35d7f21e9 Upload build-{os}.json manifests to deployment server
Needed by zotero/client-downloads@4b2060361, which reads build
metadata from these files instead of hardcoding it.
2026-02-09 15:24:07 -05:00
Dan Stillman
8a1bdacf7d Fix WebDAV verification failure on OPTIONS/PROPFIND auth type mismatch
`checkServer()` was capturing the Authorization header from OPTIONS and
explicitly setting it on PROPFIND via `setRequestHeader()`. If the auth
type didn't match what the server required for PROPFIND (e.g., Basic vs.
Digest, though maybe other things too), the explicit header could
prevent Firefox from negotiating the correct auth scheme on the 401
challenge.

To fix, move `onAuthorizationHeader()` from OPTIONS to PROPFIND and
don't pass captured auth to PROPFIND, letting Firefox handle the auth
transparently.

https://forums.zotero.org/discussion/129665/webdav-error-for-zotero-8-0-3
2026-02-09 14:21:58 -05:00
Dan Stillman
5cb83c69c6 Fix incorrect bold text in file-renaming banner 2026-02-09 14:21:58 -05:00
Yago Iglesias
fe3021701e
Use grep -E instead of egrep (#5789) 2026-02-09 09:54:19 -05:00
Dan Stillman
06794ce278 Update note-editor submodule 2026-02-06 15:57:43 -05:00
Dan Stillman
fa30baf523 Add CLAUDE.md with project guidance for Claude Code
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 15:54:09 -05:00
Dan Stillman
c7014b97c7 Update locales from Transifex 2026-02-06 15:47:31 -05:00
Dan Stillman
752b0f7008 Convert preferences_sync.xhtml from spaces to tabs 2026-02-06 15:15:30 -05:00
Dan Stillman
d966eee6a7 Update English strings for Transifex 2026-02-06 00:55:29 -05:00
Dan Stillman
2f7055e15d Update CSL locales 2026-02-06 00:51:33 -05:00
abaevbog
bd8d56e384
Preference to hide context annotation rows (#5315)
hideContextAnnotationRows pref, accessible via View > Hide Non-Matching Annotations,
will hide non-matching context annotation rows.
Enabled by default.

Fixes zotero#5264
2026-02-06 00:51:01 -05:00
Tom Najdek
bbb39719f0
Tweak hover color for banner buttons (#5776) 2026-02-04 12:10:24 +01:00
Dan Stillman
eecdd66098 Use PROPFIND instead of OPTIONS to cache WebDAV credentials
Some WebDAV servers allow unauthenticated OPTIONS requests, so the
Authorization header capturing added in 089701eca8 wouldn't work.

PROPFIND with Depth: 0 reliably requires authentication while only
returning properties of the directory itself.

https://forums.zotero.org/discussion/comment/506993/#Comment_506993
2026-02-03 23:42:45 -05:00
Abe Jellinek
5e82c888b6 Scaffold: Fix repeated reload prompts 2026-02-03 16:14:25 -05:00
Tom Najdek
0f565ecfef
Replace × close links with buttons in banners (#5735) 2026-02-03 15:51:24 -05:00
abaevbog
7b0f5d8f32
update menulist keyboard nav and appearance (#5773)
- on all platforms, Space will open the menulist popup
- on Windows, ArrowUp/ArrowDown will change selection without triggering command event.
This is needed to avoid alerts that are meant to fire after a confirmed
selection when the user is just trying to navigate the menu (e.g. item type menu)
- on Windows, fix odd appearance of checked menulist options in advanced search
condition dropdowns when "More" option is selected
- on Linux, fix menulist focus ring not appearing in Advanced Search
or Preferences (https://forums.zotero.org/discussion/129498/advanced-search-drop-down-menus-are-not-highlighted-during-keyboard-navigation)

Fixes: #5772
2026-02-03 15:22:30 -05:00
Dan Stillman
2f064a5604 Rename deployment scripts 2026-02-03 14:34:37 -05:00
Tom Najdek
818ce564bb
Improve RTF scan. Add test coverage. (#5672) 2026-02-02 15:03:57 -05:00
Dan Stillman
331a83d2e8 Update reader submodule 2026-02-02 11:13:03 -05:00
Dan Stillman
56cd4713f1 Clear cached WebDAV credentials if we get a 401 2026-02-01 16:42:55 -05:00
Dan Stillman
089701eca8 Fix WebDAV authentication handling in fx140
Firefox no longer seems to send a previously used Authorization header
with subsequent requests. This results in extra requests, since every
WebDAV request triggers a 401, and also results in errors, because a PUT
is sent without Authorization, causing some WebDAV servers to
immediately send a 401 and close the connection, which the HTTP layer
interprets as a connection failure (status 0). (It's also not good to
try to send a large file just to get a 401.)

There might be some way to share context between requests, but instead,
just get the used Authorization header and include that explicitly in
future requests.

To test this properly, we have to switch to using httpd.js for all
WebDAV requests, since the mocked XHR doesn't trigger the 401 retry.

https://forums.zotero.org/discussion/129194/webdav-uploads-fail-on-zotero-8-put-sent-without-authorization-server-closes-connection
2026-02-01 16:42:55 -05:00
Dan Stillman
e7d1772470 Don't show Authorization header value in HTTP.request() debug mode 2026-02-01 16:42:55 -05:00
windingwind
1347023b39
Fix note context tabNotesDeck.selectedPanel null error (#5771)
fix: #5770
2026-02-01 11:06:10 -05:00
Dan Stillman
62894d56e5 Update version 2026-01-29 15:35:21 -05:00
Dan Stillman
a0758e016a Update locales from Transifex 2026-01-29 15:35:21 -05:00
Dan Stillman
0c97b6f74c Include collections in trash when generating item JSON
Any modification to an item belonging to collections in the trash would
cause those collections to be removed from the item when the item was
uploaded.

Fixes #5766
2026-01-29 15:14:02 -05:00
Dan Stillman
f3c0e4fdc2 Fix error resetting group library with unsynced embedded images
https://forums.zotero.org/discussion/129373/zotero-7-8-warning-when-syncing-group-library
2026-01-29 13:22:14 -05:00
Dan Stillman
2c2b6fe171 Update package-lock.json 2026-01-29 13:22:13 -05:00
abaevbog
22f62138a3
Fix quicksearch not finding annotations of standalone attachments (#5756)
Fix search not finding annotations of standalone attachments
when searching within a scope.

Fixes: #5751
2026-01-28 13:30:36 -05:00
windingwind
1969bde82c
Fix attachment preview discard logic (#5757)
Use keepAlive() to prevent deferred discard when the preview moves out of view but later enters the view again before the discard timeout.
2026-01-28 11:28:06 -05:00
Abe Jellinek
db9598f01e Update reader submodule 2026-01-28 10:28:23 -05:00
Abe Jellinek
c31386dc3e Update reader submodule 2026-01-28 10:01:15 -05:00
windingwind
aef4beee89 Fix note editor iframe docShell undefined error
Regression after 37ce3c0
2026-01-28 10:49:55 +01:00
Abe Jellinek
4880674668 Remove DOI when creating bookSection from book
And book from bookSection.

Closes #5732
2026-01-27 16:20:14 -05:00
Dan Stillman
85bff00a3c Update translators 2026-01-27 13:46:49 -05:00
Dan Stillman
0e78eb6709 Update locales from Transifex 2026-01-27 13:45:15 -05:00
Dan Stillman
2b262c5442 CI: Fix disabling of certain tests
Wrong property name
2026-01-27 13:34:25 -05:00
Tom Najdek
aabac2576c
Ensure automatic file renaming is enabled for group libraries (#5750) 2026-01-27 13:25:12 -05:00
abaevbog
56de1abb79
Citation dialog: localized CSL page locator in guidance panel text (#5746)
* citation dlg: local. CSL locator in guidance panel

Use localized short CSL page locator in guidance panel
text example ("p10")

Fixes: #5745

Also, fix dialog mode switch buttons not properly sizing
in locales where list/library string is longer.
2026-01-27 12:26:32 -05:00
Dan Stillman
7d79ec01a5 CI: Disable "should add an item to My Publications" test due to errors
https://github.com/zotero/zotero/issues/5749
2026-01-27 12:14:01 -05:00
Abe Jellinek
8b446b7fc5
Set auto attachment title when not renaming (#5748) 2026-01-27 11:44:50 -05:00
Tom Najdek
cc53bc1699
Fix clipped inputs in RTF Scan and related UI issues
* Remove `overflow: visible` in RTF Scan to prevent richlistbox from expanding the width and causing clipping
* Introduce small margins as an alternative to prevent focus rings from being clipped in the `wizard`
* Fix "Display as" alignment on Windows
2026-01-27 13:06:04 +01:00
Dan Stillman
98b0a3a741 Update utilities submodule
Fixes #5744
2026-01-27 00:39:40 -05:00
abaevbog
1f9d9d2967
citation dlg: updates to locator shortcuts (#5529)
- after a new bubble is added to the citation, it is recorded
as a just-added bubble. The next locator typed without a search query
will go to that item instead of going to the item before where the locator was typed.
Same logic applies when multiple bubbles are added at once.
- the record of just-added bubbles is cleared on focusout
or keypress of an arrow key. That way, it's discarded if the user
is almost certainly not intending to immediately type a locator.
- added a special case to recognize a numeric value as a page locator
if it is typed when just-added bubble is recorded. That special locator
will be added to the just-added bubble as one is typing without
pressing Enter after debounce. Enter will immediately add the locator
without waiting for debounce.
- if a just-added bubble is recorded, cmd-z will clear
whatever numeric locator may have been typed and place
it back into the input, in case one meant to type an
actual search query

- added a special case to recognize ":<number>" as a page locator
in the same circumstances that "page <number>" is currently recognized
- do not use year extraction (SearchHandler._cleanYear)
when parsing input. It strips the first number from
a range of numbers and conflicts with the new locator
logic.
- ensure a bubble with a very long locator does not overflow
2026-01-26 20:12:44 -05:00
abaevbog
83e1a6030a
fix windowIcon logged error in titlebar.js on win (#5743)
Instead of adding listeners to the window icon unless
no-titlebar-icon is set on the window, add listeners
to the icon whenever it exists. That way, one doesn't have
to remember to add the no-titlebar-icon attribute to
every window that doesn't have an icon.

Fixes: #5733
2026-01-26 20:11:18 -05:00
Dan Stillman
c9f34754a9 CI: Skip attachment pane preview test for now
Too many spurious failures

See #5624
2026-01-26 16:50:50 -05:00
abaevbog
ea1ef4492d
Citation dialog: restore first run guidance panel (#5740)
- restore guidance panel with instructions appearing on the first run
- clear firstRunGuidanceShown.quickFormat pref
- set slightly higher arrow padding on win/linux for the guidance
  panel. If the arrow is too close to the edge, it appears
  partly disconnected from the panel.

Fixes: #5738
2026-01-26 16:34:53 -05:00
Abe Jellinek
3c6ad491b5
Fix citations accumulating due to CSL.Engine caching (#5742)
* makeFormattedBibliographyOrCitationList(): Don't modify CSL.Engine state

Use previewCitationCluster(), which leaves the processor state alone,
instead of calling appendCitationCluster(), which has side effects and
isn't used anywhere else in Zotero.

* Make CSL.Engine caching opt-in

* Remove unnecessary CSL.Engine reinitialization

* Code style

* Add/update tests
2026-01-26 16:12:36 -05:00
Dan Stillman
c42f3b8174 Fix citing in Serbian locale
Fixes #5741
2026-01-26 15:14:19 -05:00
Dan Stillman
e0ff103afd Update reader submodule 2026-01-26 12:29:05 -05:00
Tom Najdek
f58ca4b399
Fix missing ellipsis for styles in the style selector (#5736) 2026-01-26 11:29:11 -05:00
Adomas Ven
6697db1dba
Delete duplicate renamed styles on init (#5734)
After citation-style-language/styles#7928 renamed Vancouver styles to
NLM terminology, Zotero installations end up with both vancouver.csl
and nlm-citation-sequence.csl. To fix, on init, delete any installed style
whose ID appears in the renamed-styles mapping if the target style
also exists.

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-01-26 10:35:43 -05:00
Martynas Bagdonas
69002c122d Add string for "Black" reader theme 2026-01-26 17:06:48 +02:00
Martynas Bagdonas
6c4fde54be Add string for image color inversion option in reader themes 2026-01-26 16:44:41 +02:00
Dan Stillman
a34b845154 Update style test to use NLM citation-sequence instead of Vancouver 2026-01-26 00:43:06 -05:00
Dan Stillman
e3e122b69d Add script for pulling Fluent translations 2026-01-25 22:15:29 -05:00
Dan Stillman
67c10a9ff7 Update bundled styles and renamed styles 2026-01-25 22:12:52 -05:00
Dan Stillman
9891b6dc51 Update version 2026-01-25 14:48:55 -05:00
Dan Stillman
2ffd6a893b Don't load annotations or tags for items individually at startup
Load tags and annotations before itemData, since `_loadItemData()`
calls `updateDisplayTitle()`, which needs creators, tags, and
annotations to be loaded for some item types.

This should fix slow startup times in Zotero 8 in libraries with many
(e.g., tens of thousands) of annotations.

The slowdown here was introduced by #3416 loading annotations in the
`catch`, but it was already incorrect for tags to be loaded that way at
startup. Creators were loaded before itemData, but tags weren't.

The `catch` might not be necessary at all now that the loading order for
`loadAllData()` is fixed, but we'll need to test further to confirm
that.

Fixes #5724
2026-01-25 11:15:30 -05:00
Mark
b1b0d45353
Update Russian translation for reader.ftl (#5728) 2026-01-24 09:34:37 -05:00
Mark
3424ab511b
Update Russian translation for note-editor.ftl (#5727) 2026-01-24 09:34:33 -05:00
Mark
3c6c90a2a1
Update Russian translation for integration.ftl (#5726) 2026-01-24 09:34:27 -05:00
Mark
c21d8983de
Update Russian translation for zotero.ftl (#5725) 2026-01-24 09:34:21 -05:00
Dan Stillman
fef2178450 Don't load unnecessary item types for updateDisplayTitle() fallback
We don't need to try to load annotations for regular items or creators
or tags for annotations.

Every annotation item's annotation is still loaded independently, but we
can try to fix that separately. For now, just don't try to load data
that will never exist.

Addresses #5724
2026-01-23 13:07:57 -05:00
Dan Stillman
d53d760cb6 Remove obsolete call to updatePostUpgradeBanner() 2026-01-23 12:53:02 -05:00
Dan Stillman
aab4a08267 Revert disabled="disabled" to disabled="true" after #5719 2026-01-23 11:25:28 -05:00
Northword
dfca2f5862
Fix color of OK button in MS Word DocPrefs (#5719)
https://forums.zotero.org/discussion/129173/zotero-8-accent-color-of-the-ok-button-in-the-document-preferences-pane-of-ms-word-addins
2026-01-23 11:19:33 -05:00
Gemini
404667f6a9 Fix double-encoding of special characters in DOIs in word processor integrations
Disable wrap_url_and_doi for citeproc instances used in word processor
integrations to prevent brackets and other special characters in DOIs
from being double-encoded.

Fixes #5557
2026-01-23 12:58:17 +02:00
Dan Stillman
dcad02c1d4 Update Windows build to Firefox 140.7.0esr 2026-01-22 23:22:35 +00:00
Abe Jellinek
bd89c00d37
About window: Always pass centerscreen, and pass dialog=yes on macOS (#5718) 2026-01-22 15:52:39 -05:00
Dan Stillman
5dcb1a4bba Update Mac and Linux builds to Firefox 140.7.0esr 2026-01-22 15:25:13 -05:00
Abe Jellinek
3e248c703e
showAttachmentFilenames: Fall back on invalid attachment path (#5717) 2026-01-22 14:55:23 -05:00
windingwind
14a26038d5
Fix v-table stylesheet keys (#5714)
Fix custom column keys parsing issue in v-table
Use index of css suffix instead of dash for key parsing
Ensure style map key is escaped
2026-01-22 14:42:33 -05:00
Abe Jellinek
0d864ae83e
Fix contextPaneOpen race condition causing duplicate button (#5716) 2026-01-22 14:42:13 -05:00
Dan Stillman
620d1b96b9 Don't try to create incremental updates from Z7 for ARM Linux 2026-01-21 22:42:18 +00:00
Dan Stillman
4706601213 Update note-editor submodule 2026-01-21 11:45:16 -05:00
abaevbog
2c0bebdaf0
citation dlg: List mode tab always before Library (#5712)
In the segmented control switch, List mode tab always
appears before the Library. Tabs are no longer
reordered based on the default mode preference.
2026-01-20 16:29:25 -05:00
windingwind
da82e8aa28
Fix v-table shift-dblclick not trigger activateNode (#5711) 2026-01-20 16:10:04 -05:00
Dan Stillman
d681caba1c Update note-editor submodule for #5710 2026-01-20 16:04:59 -05:00
windingwind
6a4f36ad82
Add note editor content view mode (#5710) 2026-01-20 16:03:37 -05:00
Abe Jellinek
686ebb5a5c Update reader submodule 2026-01-20 14:51:05 -05:00
Abe Jellinek
4399329b83 renderItemTitle(): Only split on known tags
Fixes #5708
2026-01-20 12:58:44 -05:00
Dan Stillman
cc95b93741 Update translators 2026-01-20 12:06:55 -05:00
Dan Stillman
e9bcf6f10a Update global schema
Locale updates
2026-01-20 12:06:54 -05:00
Dan Stillman
42a4807d59 Update locales from Transifex 2026-01-20 12:04:18 -05:00
windingwind
86c4bc23c7
Fix Libraries and Collections box editable field is undefined in note editor (#5702)
fix: #5698
2026-01-20 11:56:04 -05:00
Tom Najdek
d6fc06cd7c
File renaming: Allow local time conversion for accessDate (#5707) 2026-01-20 11:00:52 -05:00
windingwind
7a61614450
Fix tag editor focus ring cut off in note editor (#5703)
fix: #5699
2026-01-20 10:58:49 -05:00
windingwind
97d0bdbaea
Fix note tab reopen logic (#5706)
fix: #5704
Distinguish note editor CE and instance in var name
Add note editor CE _initPromise
Await CE init in various places
Add tests for note tab
2026-01-20 10:56:04 -05:00
Tom Najdek
eb62aad999
Extend emoji matching to include symbols
These were previously matched, before d1d4065d
2026-01-16 13:31:02 +01:00
Dan Stillman
1b0442e773 Restore "Manage Styles…" link in doc prefs
https://forums.zotero.org/discussion/128985/manage-styles-option-missing-when-clicking-add-edit-citation-in-word
2026-01-14 11:16:31 -05:00
windingwind
37ce3c0ed7 Fix note editor toolbar window dragging 2026-01-14 23:53:50 +08:00
Dan Stillman
145fbfa194 Update note-editor submodule 2026-01-13 13:46:37 -05:00
Dan Stillman
0af7c56b7e Update sample data for tests, again
There's some bug where this has to be generated multiple times to be
correct.
2026-01-13 13:14:00 -05:00
Dan Stillman
564d3f90c7 Update utilities submodule 2026-01-13 13:05:23 -05:00
Dan Stillman
395aadff4e Update sample data for tests 2026-01-13 13:05:23 -05:00
Dan Stillman
2bb8ba60ad Fix test after adding eventPlace to conferencePaper 2026-01-13 12:50:00 -05:00
Dan Stillman
72321ead34 Update bundled styles and renamed-styles.json 2026-01-13 12:05:38 -05:00
Dan Stillman
42b559dda2 Update global schema 2026-01-13 12:05:38 -05:00
Dan Stillman
913a60fa0f Update locales from Transifex 2026-01-13 12:05:38 -05:00
Tom Najdek
d1d4065dae
Add support for displaying country flag emojis in the Items List (#5700) 2026-01-13 11:50:47 -05:00
Dan Stillman
bed1d1ff35 Update bundled styles and CSL locales 2026-01-13 11:37:02 -05:00
Dan Stillman
ddb3488680 Update reader submodule 2026-01-13 11:35:51 -05:00
Dan Stillman
e478c89ca0 Fix base-mapped fields not being migrated from Extra
https://forums.zotero.org/discussion/comment/505322/#Comment_505322
2026-01-13 11:35:51 -05:00
Tom Najdek
c37a79e066
Fix library tab fields not refreshing (#5697)
Previously, fields and the abstract in the library tab did not refresh after updates were made in the Reader’s context pane.
2026-01-13 11:35:32 -05:00
abaevbog
e899012e5e
fix wrong focus on shift-tab from note-editor (#5695)
Fixes: #5690
2026-01-12 16:07:32 -05:00
Dan Stillman
faf8f2510e Batch Extra field migrations in transactions 2026-01-07 11:07:16 -05:00
Dan Stillman
29bf6a7809 Add timing for Extra field migration 2026-01-07 11:07:16 -05:00
Dan Stillman
a67ad90b9a Remove unnecessary comment about testing Extra field migration
Just need to disable auto-sync to trigger migration
2026-01-06 11:20:27 -05:00
Dan Stillman
8c8da79116 Update note-editor submodule 2026-01-06 10:56:41 -05:00
Abe Jellinek
d04843e41d Update reader submodule 2026-01-05 10:46:29 -08:00
Abe Jellinek
21f0ba5a03 Reader: Support blob argument to onSaveImageAs() 2026-01-05 10:43:06 -08:00
Abe Jellinek
59f4dacc55 Add missing string for encrypted EPUB 2026-01-05 09:55:52 -08:00
windingwind
bb17ac2c74
Fix tab focus control (#5689)
fix: #5683
fix: #5684
fix: #5688

Rename tab hook focus -> focusFirst
Replace tab-focus custom event with tab hook refocus
Move context pane _handleTabReady to Zotero_Tabs
Focus note editor after opening tab
Use setTimeout to ensure the focus does not stay in tab element
2026-01-05 10:15:21 -05:00
windingwind
47e6a0f7ab Fix open Note in New Window doesn't focus existing window
fix: #5687
2026-01-03 11:37:27 +08:00
windingwind
46385b06fa Fix Libraries and Collections render not triggered in note windows
fix: #5685
2026-01-03 09:55:12 +08:00
Dan Stillman
58baa44ad4 Always use Zotero.CreatorTypes.getLocalizedString()
Since some strings are now stored in schema.ftl

https://forums.zotero.org/discussion/128757/z8-beta-films-dont-have-any-creator-types
2025-12-30 14:30:24 -05:00
Dan Stillman
c6ef23a650 Update locales from Transifex 2025-12-30 10:30:47 -05:00
Dan Stillman
6c48cd54ce Fix migrateExtraFields() when onProgress isn't passed 2025-12-29 17:59:25 -05:00
Dan Stillman
05e1d39217 Clarify comment for Extra field migration 2025-12-29 16:12:19 -05:00
Dan Stillman
7316aeb92c Fix Zotero.Feeds.updateFeeds() resolving too soon
Regression from 4d7a099c32
2025-12-29 16:04:21 -05:00
Dan Stillman
fb20db9a58 Delay Extra field migration until after auto-sync and show progress
This avoids redundant field migration on other devices if it has already
run on one. Conflict resolution should automatically ignore identical
changes, so it's not the end of the world if it runs in multiple places,
but we might as well avoid it if we can.
2025-12-29 15:56:20 -05:00
Dan Stillman
a5843d8e2d Add Zotero.startupSyncPromise
Resolves after initial auto-sync completes or after the initial
auto-sync would run if disabled
2025-12-29 15:56:06 -05:00
Dan Stillman
4d7a099c32 Add pause mechanism for feed updating
```
var handler = await Zotero.Feeds.pause();
[...]
handler.resume();
```
2025-12-29 15:56:00 -05:00
Dan Stillman
ef2f7049c7 Allow wider text for items in progress popup 2025-12-29 15:55:50 -05:00
Dan Stillman
b30c9bea11 Don't try to rename files for feed items 2025-12-29 15:55:50 -05:00
Dan Stillman
87bb7d17b2 Remove unnecessary test in file-renaming code
Regular items are by definition top-level items
2025-12-29 15:55:50 -05:00
Dan Stillman
689e59f161 Update global schema
Remove "Creator" from "Audio Recording"
2025-12-26 23:45:24 -05:00
Dan Stillman
0320a45d46 Show more granular error for generateItemJSONData() test 2025-12-26 23:36:09 -05:00
Dan Stillman
3256273015 Update global schema
"Uploader" → "Creator" on Video Recording
2025-12-26 23:35:43 -05:00
Dan Stillman
22d4bdcef8 Revert treating "arXiv ID" as a field in Mendeley import 2025-12-26 15:55:45 -05:00
Dan Stillman
f0ff173ad2 Update global schema to remove arXivID field 2025-12-26 15:36:13 -05:00
Dan Stillman
7ac22dbef2 Fix creator extraction from Extra
Creators shouldn't be extracted if creators of the same type already
exist on the item, to follow citeproc-js behavior, but the code to do
that was broken.
2025-12-26 11:08:19 -05:00
Dan Stillman
d1fd7c998b Fix Mendeley import test after new identifier fields 2025-12-25 22:37:14 -05:00
Dan Stillman
f7764ca9a4 Recognize "arXiv" for arXiv ID in Extra 2025-12-25 22:37:14 -05:00
Dan Stillman
7487595e6a Fix test error after adding type to document 2025-12-25 22:13:34 -05:00
Dan Stillman
7bf3084e65 Update utilities submodule
Fixes the CSL-JSON import problem mentioned in #5679
2025-12-25 22:04:41 -05:00
windingwind
b3ef63859d Destroy editor instance in CE properly 2025-12-25 23:15:33 +08:00
Dan Stillman
b94dac5586 Update sample data for new item fields 2025-12-25 00:20:34 -05:00
Dan Stillman
f0bbb9b370 Update global schema 2025-12-25 00:20:34 -05:00
Dan Stillman
611acd0703 Update global schema 2025-12-24 22:00:52 -05:00
Dan Stillman
0692985c80 Don't upload tags on item conflict if only tag order has changed 2025-12-24 22:00:07 -05:00
Dan Stillman
8bd3bf976a Update locales from Transifex 2025-12-24 13:24:38 -05:00
Dan Stillman
5fa92f87fe Update package-lock.json 2025-12-24 13:24:38 -05:00
Dan Stillman
e4ffcfc822 Remove "arXiv ID", "PMID", and "PMCID" from schema.ftl
Now hard-coded in update-schema in global schema repo

See zotero/zotero-schema@5d87c21fec
2025-12-24 13:24:38 -05:00
Tom Najdek
891a9809d0
Improve bibliography modal initialization (#5675) 2025-12-24 09:47:03 -05:00
windingwind
7d57c0c103
Fix note tab font reset menuitem (#5678) 2025-12-24 09:43:19 -05:00
windingwind
f149b8985b
Fix tab sidebar layout (#5677) 2025-12-24 09:43:03 -05:00
Dan Stillman
1564af89f2 Update reader submodule 2025-12-20 19:02:09 -05:00
Dan Stillman
7acb28099d Rename "Rights" field to "License"
Closes zotero/zotero-bits#63
2025-12-19 22:21:59 -05:00
Dan Stillman
d6fc071139 Load attachment data when handling file renaming on item metadata change
File renaming has a Notifier handler for item modifications that needs
best-attachment titles, but attachments and their item data might not be
loaded even when parent items are. (This came up when migrating fields
from Extra after a global schema update before the main window had
loaded.)
2025-12-19 22:03:19 -05:00
Dan Stillman
bf9e5d3a83 Don't try to hide/show Retracted Items if ZoteroPane is still loading 2025-12-19 22:02:36 -05:00
Dan Stillman
7422538fb3 Update English strings for Transifex 2025-12-19 22:02:16 -05:00
Dan Stillman
9e23214c77 Add English strings for new item fields and creator types 2025-12-19 21:57:44 -05:00
Tom Najdek
6bf4c371fc
Upgrade ftl-tx. Fix #5671. 2025-12-20 02:22:23 +01:00
windingwind
ca6dd437a5 Update JSDoc for menu manager API 2025-12-19 00:03:06 -05:00
windingwind
834d3b3bb3 Fix JSDoc for reader.js 2025-12-19 00:03:06 -05:00
windingwind
cf8dd78a4a Fix JSDoc for preferencePanes.js 2025-12-19 00:03:06 -05:00
windingwind
8a76aac83f Update JSDoc for itemPaneManager and itemTreeManager 2025-12-19 00:03:06 -05:00
Tom Najdek
51dae17314
Fix Bibliography modal race condition (#5638)
- Replace polling with a `ready` promise for initialization
- Use fixed height for the rich list and re-order initialization to avoid layout shifting
- Ensure the "accept" button is disabled until initialization completes
2025-12-18 23:59:28 -05:00
windingwind
ccfa109fcf
Fix note editor hard refresh after saving note (#5640)
Fix note editor instances' editing state lost after saving
2025-12-18 23:57:12 -05:00
windingwind
c60134e8f1
Add macOS Tahoe menu icons (#5603)
resolve: #5549
2025-12-18 23:51:36 -05:00
windingwind
e522f6185e
Add note as tab (#5528) 2025-12-18 23:49:42 -05:00
abaevbog
f1c7b7939c
Citation dialog: allow to switch between "Add Note" and "Add/Edit Citation" (#5586)
Allow one to switch between "Add/Edit Citation" and "Add Note" modes
in the citation dialog via segmented control in the bottom
left corner.

One cannot switch modes when editing an existing citation or
when inserting a citation in the note editor.

Use the same segmented control UI to switch between
list and library modes for clarity. Replace icons with
"List" and "Library" strings.

Collect some of the state variables into DIALOG_STATE object
for better organization.

Fixes: #5582

Also, remove earlier logic of not resizing window on refocus
on Linux if focus was lost <100ms ago. That workaround
no longer works, and now that we retain the window sizing
after search reruns, it is less of an issue.
Addresses: #5590
2025-12-18 23:18:35 -05:00
Dan Stillman
0cb8116bed Add default pref for showAttachmentFilenames
Missing from #4601
2025-12-18 23:06:33 -05:00
Abe Jellinek
06b2475b7a Fix ebook hyphenation pref not applying when reader opens
https://forums.zotero.org/discussion/128612/enable-automatic-hyphenation-not-working-after-closing-and-reopening-epubs
2025-12-18 15:01:32 -08:00
Adomas Venčkauskas
1233fd5a75 Fix an error occuring when attempting to insert an empty note
Addresses #5665
2025-12-18 09:32:43 +02:00
Bogdan Abaev
be8c64b2bf citation dlg: fix hang when main window is closed
When fetching open tabs for the citation dialog, fall back
to the last saved session state if the main window is closed.
Session state was already being updated when zotero pane
is closed.

Fixes: #5661
2025-12-18 09:21:03 +02:00
Dan Stillman
ead0924a79 Fix deletion of .dll in extract_xul_dll 2025-12-18 05:36:07 +00:00
Dan Stillman
d31fd8aac0 Update custom Firefox component hashes for Windows build 2025-12-18 05:35:41 +00:00
Dan Stillman
86823e45ef Update to Firefox 140.6.0esr 2025-12-17 15:37:41 -05:00
Abe Jellinek
aec284b0b8 Add "Normalize Attachment Titles..." menu item (#4601)
---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2025-12-17 12:56:04 -05:00
Abe Jellinek
2d79f1f959 Add option to show filenames in the item tree (#4601)
And move item tree pref observer into the item tree itself.
2025-12-17 12:55:56 -05:00
Dan Stillman
c6a6832444
Remove 1px solid transparent border on links (#5663)
And remove redundant CSS rules for `.zotero-text-link` in zotero.css,
now specified in _textLink.scss
2025-12-16 23:06:33 -05:00
Northword
b20084be43
Fix(Plugins): Prevent user preferences from being lost on plugin disable (#5646)
When a Zotero plugin is disabled, user-modified preferences can be inadvertently reset to their default values. This occurs under specific conditions where a parent preference has not been user-modified, but a child preference within that branch *has* been modified.

The root cause lies in the `Zotero.Plugins.clearDefaultPrefs` function. For preferences that do not have a user-set value (`!branch.prefHasUserValue(pref)`), it incorrectly calls `Services.prefs.getDefaultBranch('').deleteBranch(pref)`. While intended to clear unmodified defaults, `deleteBranch(pref)` operates on the *entire preference branch* starting with `pref`, inadvertently removing any user-modified sub-preferences as well.

This commit changes the problematic line from `branch.deleteBranch(pref)` to `branch.clearUserPref(pref)`. `clearUserPref(pref)` correctly removes only the user-set value for the *specific* preference `pref`, leaving default values and any user-modified sub-preferences intact. This ensures that only truly unmodified default preferences are cleared, preserving user data for related sub-preferences.

This fix prevents unintended loss of user settings when plugins are disabled.
2025-12-16 23:06:18 -05:00
Dan Stillman
60ece63df4 Bold only "Zotero 8" in the post-upgrade banner 2025-12-16 14:16:45 -05:00
Dan Stillman
4ca9bbdae5 Automatically show post-upgrade banner for each new major version
And remove the density switcher
2025-12-16 13:50:27 -05:00
Dan Stillman
7859016ec1 Update locales from Transifex 2025-12-16 12:17:54 -05:00
Dan Stillman
67fe951572 Remove obsolete "Focus Mode" string 2025-12-16 12:17:53 -05:00
Dan Stillman
34508e145c Update translators, styles, and CSL locales 2025-12-16 10:42:48 -05:00
Dan Stillman
6e44fc1c62 Update note-editor and reader submodules 2025-12-16 10:42:48 -05:00
Adomas Venčkauskas
3dec4217aa Fix remaped styles not working in Document Preferences dialog
If you're writing a document and a citation style is renamed
Zotero-side, then the citation dialog won't load with the style
preselected without this
2025-12-16 16:33:45 +02:00
abaevbog
ae9330b513
Fix no onActivate handling on double click of collectionTree rows (#5656)
After 015769a removed pointer-events: none from table cells,
clicking on the collectionTree would always trigger
a focusout event, ZoteroPane.handleBlur would call
collectionTree.setHighlightedRows, which would always
redraw the collectionTree. This complete tree redraw on
every click made it impossible to register double-clicks.

With this change, setHighlightedRows won't have
any effect if called with the same rows to highlight
as before (including no rows).
Without constant tree redraws, double-clicks fire as expected.

Fixes: #5655
2025-12-15 23:11:53 -05:00
abaevbog
e6068833ae
Properly display annotations as rows of relatedBox (#5585)
Fixes: zotero#5583
2025-12-12 14:55:27 -05:00
Abe Jellinek
8b9ca9dbce Update reader submodule 2025-12-12 11:27:11 -05:00
Abe Jellinek
a2c3e80f0f Add strings for Reading Mode 2025-12-12 11:27:06 -05:00
Martynas Bagdonas
6e723d3262 Update pdf-worker submodule 2025-12-11 13:07:04 +00:00
abaevbog
11223451d2
set libraryID on annotations in tests (#5644)
Fix tests breakage post 84764570f4
2025-12-04 08:27:57 -05:00
Adomas Venčkauskas
cc1b72ebf2 Update Word for Mac submodule 2025-12-04 10:25:58 +02:00
Abe Jellinek
84764570f4
Enforce annotationSortIndex format by type (#5641) 2025-11-25 12:59:09 -05:00
Tom Najdek
49325e27d9
Fix attachment matching filename isn't correctly retitled (#5637) 2025-11-17 10:40:38 -05:00
windingwind
2f2dfc9038
Fix should discard attachment pane preview after becoming invisible (#5630)
fix: #5624
2025-11-17 10:39:32 -05:00
Tom Najdek
b9ef88d4fc Fix alignment issues and missing icons 2025-11-14 19:45:58 +01:00
Tom Najdek
8a57f6c45b
Fix the "Edit → Select All" menu option not selecting items (#5626) 2025-11-13 16:11:48 -05:00
Tom Najdek
3f8a0b5b86
Fix misaligned text in the attachment box (#5632) 2025-11-13 10:33:08 -05:00
Tom Najdek
aec7b6a1ea
Persist the state of the Reader sidebar #5489 (#5593) 2025-11-13 10:32:34 -05:00
Abe Jellinek
6c70ccc66c Fix Edit menu items not working in some field context menus
Regression in c45ed42af.

Fixes #5629, should fix #5376 (though I couldn't reproduce that)
2025-11-12 13:18:12 -05:00
Dan Stillman
4bd829ebdb Fix potential sync error if unloaded editable library becomes read-only
https://forums.zotero.org/discussion/128001/app-not-syncing-to-newly-created-group
(error was in an existing group, not the new one)

Fixes #5625
2025-11-11 13:43:01 -05:00
windingwind
721306879a
Unify info section onContextMenu handling (#5622)
Fix menu API with date and custom fields
2025-11-11 11:26:22 -05:00
Dan Stillman
0748b09753 Update reader submodule 2025-11-11 10:28:17 -05:00
windingwind
01d764ef2f
Fix attachments pane test being unstable (#5610) 2025-11-10 14:18:09 -05:00
abaevbog
c45ed42af7
Fix broken new collection dialog opened from context menu of a group (#5592)
Fix new collection dialog appearing broken when
opened via "New Collection" option of context menu
on "My Library" or a group in collection tree.

On macOS, the popup of collections would never leave
and on windows, subcollection would never appear.

This is a followup to zotero#5409
that fixes this issue for all collections. The reason
why it didn't work for groups is that the command event
would fire not on a menuitem but on the <command> node itself,
which is not what the workaround expects.

Now, if we get such an event, we'll try to use the
original 'command' event dispatched on the <menuitem>
from event.sourceEvent to locate the <menupopup>
and as a blueprint for redispatching the event.
2025-11-10 14:14:47 -05:00
abaevbog
544e9d11a3
Fix itemTree quicksearch cleared when image pasted into a note (#5613)
Fixes: #5612
2025-11-10 14:06:30 -05:00
abaevbog
a7cc94c04c
fix createParent dialog stuck during quicksearch (#5596)
Fix createParentDialog hanging when opened during
quicksearch or in saved search. After a parent item
is added, itemTree is being refreshed. If _refreshPromise
is resolved after a timeout, it will not complete until the
modal dialog is closed. Instead, resolve _refreshPromise
after Zotero.Promise.delay, which uses the XPCOM global
timer unaffected by modals.

Fixes: #3026
2025-11-10 13:59:24 -05:00
Abe Jellinek
7877c63600
fx140: Fix Ctrl-Enter check (#5608) 2025-11-10 13:50:34 -05:00
Tom Najdek
e09e993081
Align buttons with the top line of the field (#5604) 2025-11-10 13:46:58 -05:00
abaevbog
260ae891f5
new fix to failing 'should refresh on item update' (#5605)
Another potential fix to the test failure. Earlier fix
from 30784dd241 seems
to not have worked.

A new explanation is that the test before it does not properly
wait for the trash to refresh before trying to select the library, in
which case collectionTree select event will be suppressed
and library selection will not happen.

Fixes: #5584
2025-11-10 13:45:08 -05:00
Tom Najdek
85d1f723fb
Restore the arrow in the guidance panel (#5611) 2025-11-10 13:44:05 -05:00
Tom Najdek
ef1fc4fc66
Fix missing labels for options under “Display citations as” (#5618) 2025-11-10 13:43:47 -05:00
Tom Najdek
b1941fbff4
Add logic to limit auto-rename banner to 7 days (#5621) 2025-11-10 13:42:43 -05:00
abaevbog
a2a6df529a
Scaffold UX tweaks (#5615) 2025-11-07 13:21:53 -05:00
Martynas Bagdonas
06afaf3316 Update pdf-worker submodule 2025-11-07 11:20:22 +00:00
Adomas Venčkauskas
49130c71d8 Fix connector save timing out with Advanced Search
Report: https://forums.zotero.org/discussion/127760/connector-conflict-with-advanced-search

Also restore Advanced Search tests that depend on the item tree. They
were disabled due to React timing issues. Hopefully with these changes
the initialization of the tree is more robust.
2025-11-03 09:24:35 +02:00
Abe Jellinek
2d6deda04a
Support zooming in basicViewer (#5599) 2025-10-28 12:28:15 -04:00
Tom Najdek
7aefa6d9ee
Use current collection when adding items (#5598) 2025-10-27 11:54:03 +01:00
abaevbog
59a789c750
Fix misaligned sync reset options radio button labels (#5587)
Fixes: #5580
2025-10-24 14:09:14 -04:00
abaevbog
30784dd241
fix 'should refresh on item update' failing (#5595)
This test would sometimes fail, most likely due to
the library sometimes not getting re-selected in the previous test
'should update custom header for items in the trash'.

A likely explanation is that the selection event in
collectionTree would still be suppressed when selectLibrary
is called, so make sure to wait for item deletion to
go through before trying to re-select the library.

Fixes: #5584
2025-10-24 14:08:15 -04:00
Abe Jellinek
5b82a38383 Don't cache CSL.Engine for integration 2025-10-22 09:13:15 +03:00
Adomas Venčkauskas
128f2229e6 Update Word for Mac submodule 2025-10-21 16:37:07 +03:00
Dan Stillman
d1f478fc4e Update translators, styles, and CSL locales 2025-10-14 12:03:25 -04:00
Dan Stillman
82f08cc4b8 Update note-editor and reader submodules 2025-10-14 12:01:23 -04:00
Abe Jellinek
892a4c48ce Style configurator: Log error and discard invalid locale values 2025-10-14 11:52:47 -04:00
Abe Jellinek
f621de41c7 Style configurator: Don't use string interpolation to build XUL 2025-10-14 11:52:47 -04:00
windingwind
9d91ff8df9
Improve attachments section test (#5576)
Cancel pending discard to avoid race condition
Cancel pending render/discard after tests
2025-10-13 13:18:51 -04:00
Abe Jellinek
9509c62918 Fix search test descriptions, remove outdated tests
Some descriptions weren't changed to match test behavior changes in
48fd23c, and the doesn't-match tests are no longer relevant after those
changes.
2025-10-10 12:39:26 -04:00
Abe Jellinek
e921a4bc7f Local API: Improve search debugging
Use our own method in order to debug scopes, with a new getter for
that property.
2025-10-10 12:39:26 -04:00
Abe Jellinek
7da9c0669d Local API: Match annotations (#4337)
Except in collection items responses.

And use scope searches for itemType/tag search syntax instead of
filtering in JS.
2025-10-10 12:39:26 -04:00
abaevbog
90972577af
ensure tag selector is initialized before using (#5574)
If the tag selector is not initialized in setScope,
initialize it before proceeding. This fixes
the tag selector being stuck in loading state
after expanding.

Fixes: #5573
2025-10-10 10:25:59 -04:00
Tom Najdek
18a34b938f
Remember last import settings (#5465)
Closes #5303

Also:

* Ensure the file chooser dialog opens only once
2025-10-10 10:22:57 -04:00
Dan Stillman
9d22c5406f Add special handling for general-sentence-separator string 2025-10-09 15:32:04 -04:00
Dan Stillman
6359d69ef4 Update locales from Transifex 2025-10-09 15:32:04 -04:00
Abe Jellinek
52f5ab035f Document Preferences: Add missing FTL to fix variable in title
Fixes #5570
2025-10-09 10:37:12 -04:00
Dym
05e4982245
Local API: Resolve 500 error on single item export (#5560) 2025-10-08 19:48:17 -04:00
abaevbog
2e3deb0a21
tagsbox: fix deleted tags reappearing (#5533)
https://forums.zotero.org/discussion/110655/z7-beta-tags-reappear-after-quickly-deleting-them

If a library has many tags and one quickly clicks on "-" button
to deleted multiple tags from an item, the database updates
may not keep up with UI. To address this, save item only
once after a debounce.

Fixes: #5410
2025-10-08 15:37:17 -04:00
windingwind
cc4c8cd191
Keep tabs menu focus when using up/down (#5346) 2025-10-08 15:33:45 -04:00
Abe Jellinek
46f879dcdb
Scaffold: UI tweaks and testing overhaul improvements (#5441)
- Remember diffs from test runs, show in sidebar when test is selected
- Add button to immediately update test, without a prompt
- Indicate when test has a custom defer delay set (although no tests currently do)
- Use a persistent test store as source of truth, instead of data attributes on the listbox rows
- A bit of code cleanup

Closes #5420, closes #5419
2025-10-08 15:16:49 -04:00
Abe Jellinek
e2fc3d35b8
Style editor: Simplify exposed methods, add shortcuts for refresh (#5545) 2025-10-08 14:51:42 -04:00
Abe Jellinek
da0578fc39 Remove special handling for URLs dragged from Firefox (#4649)
And the temporaryPDFHack that we used for them.
2025-10-08 14:30:21 -04:00
Abe Jellinek
dbce2b33b3 Use extension-less filenames when adding multiple attachments at once (#4649)
And use a new notifier queue in the ZP routine (like we already did in
the item tree) to prevent notifier events from firing in the middle.
2025-10-08 14:30:21 -04:00
Dan Stillman
ee9ea5d5a1 Update locales from Transifex 2025-10-08 13:48:47 -04:00
Tom Najdek
b75ebd6f41
Fix auto-rename not triggering when creators change (#5567) 2025-10-08 18:19:21 +02:00
Abe Jellinek
77420760b0 Quick Copy: Don't leak pref observers when uninitialized 2025-10-08 12:04:21 -04:00
Abe Jellinek
6131da92c4 Quick Copy: Fix init race condition
QuickCopy.init() calls Style#getCiteProc(), and a side effect of
citeproc-js locale initialization could cause a recursive call back to
QuickCopy.init(), which would again call Style#getCiteProc() (after it
had checked its cache but before it had added the new engine to it),
leading to duplicate CSL.Engine initialization. Now we correctly check
whether we've already been initialized, eliminating the race condition.

Separately, remove async keyword from init(). It never actually was
async - even before Bluebird removal, it didn't await anything or return
a promise. And we can't make it await its pre-caching work because
schemaUpdatePromise won't resolve until init() resolves/returns.
2025-10-08 12:04:21 -04:00
Abe Jellinek
e9dd050229 Item pane header: Only pre-cache CSL.Engine if set to bibEntry mode 2025-10-08 12:04:21 -04:00
Tom Najdek
5cb537274e
Fix a couple of issues with file renaming (#5562) (#5566)
* Fixed incorrect new name generation for attachments without a file extension and not present on disk
* Fixed invalid preview in certain edge cases
* Added tests covering file renaming in general and the above issues
2025-10-08 00:39:54 -04:00
abaevbog
1f04c55765
Relate converted embedded note to its attachment (#5559)
When an embedded attachment note is converted to
a standalone note, relate the standalone note to
the attachment and place it in the same collections
as the attachment.
2025-10-07 13:54:09 -04:00
abaevbog
e3926c657a
fix "Next" button not appearing in merge dialog (#5563)
On windows and linux.
Fixes: #5561
2025-10-07 12:48:22 -04:00
abaevbog
59742ccc8f
no find-as-you-type on 0 keypress in itemTree (#5564) 2025-10-06 22:32:13 -04:00
abaevbog
fefad8a9e3
Fix item sometimes not added to collection on cross-library drag-drop (#5547)
When drag-dropping items into a collection in another library,
perform the addition to collection in the same transaction
as creating a new item in the target library.

When the librariesCollectionsBox refreshes on the `modify` event
when a newly created group item is linked to the selected item,
it re-loads the data of the linked item via item.loadAllData().
This could happen after the item is added to the collection
but before this change is saved. In that case, item._changed.collections
would be cleared, and when the item is saved, there would be
no changes to collections to save.

Fixes: #5539

Also, cleanup leftover unused logic of restoring linked item
from trash on drop that was removed in 2dd16b44d6
2025-10-06 15:30:01 -04:00
Martynas Bagdonas
5a96e7c90f Fix test for Citavi annotation import 2025-10-02 17:17:37 +01:00
Dan Stillman
3089a4a534 Update locales from Transifex 2025-10-02 10:42:58 -04:00
Martynas Bagdonas
b48aed2fed Update reader, note-editor, and pdf-worker submodules 2025-10-01 17:37:48 +01:00
abaevbog
ac36b6d361
Display libraries and collections box for standalone notes and attachments (#5554)
Display Libraries and Collections box in the itemPane
for standalone notes and attachments.

Fixes: #5553
2025-09-29 14:44:18 -04:00
Dan Stillman
dd19cf58cc Hide file renaming banner if "Learn More" is clicked 2025-09-29 14:43:25 -04:00
abaevbog
b21e442c4f
maintain the size of tabs as they are being closed (#5548)
When a tab is closed via clicks on "X" button, record
and lock all tabs' widths. That way, the "X" button
of the tab that follows the one that was just deleted
will land under the mouse cursor, allowing one to
delete many tabs. In addition, preserve the scroll position
of the tab bar. If it's impossible because too many tabs
were deleted, add a spacer after the last tab.

Fixes: #5523
2025-09-29 14:28:30 -04:00
Tom Najdek
42b47c5453
Add missing Fluent strings for the reader 2025-09-29 19:59:37 +02:00
Dan Stillman
e27b58176d Update locales from Transifex and merge new English strings 2025-09-18 11:28:16 +02:00
Tom Najdek
516d230647
Fix "Rename from Parent" not visible after the parent item changes Close #5542 2025-09-15 22:56:52 +02:00
Northword
91a74ed063
Fix JSDoc return types of PluginAPIBase._unregisterByPluginID 2025-09-15 14:02:46 +02:00
windingwind
913d15632b Fix menu API async unregister and event listener 2025-09-15 10:07:46 +02:00
Dan Stillman
9ab9ccf79d Update English strings for Transifex 2025-09-13 18:27:45 -04:00
Dan Stillman
0d072f2945 Add "[one]" to localized string to make Transifex happy
Even though we would never use it, Transifex still wants both 'one' and
'other' for English
2025-09-13 18:27:45 -04:00
Dan Stillman
0125de3d06 Don't include "Settings…" link in file-renaming announcement banner 2025-09-13 02:31:41 -04:00
Dan Stillman
e3ab296a72 Updated Liquid Glass icon that fixes glitch in dark/tinted/clear modes 2025-09-13 02:29:17 -04:00
Dan Stillman
ceb32b3d8a Fix max-width on hardConfirmationDialog and reduce input font size 2025-09-13 01:31:12 -04:00
Tom Najdek
e3fc1e62a0 Display the number of items that would be deleted when replacing the online library (#5359)
And require checkbox or text challenge depending on the severity of the
action

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2025-09-13 01:31:10 -04:00
abaevbog
562fed6e7e
fx140: a11y fix voiceover not reading out menulist labels (#5540)
Post-fx140, menulist labels in chrome windows are not
announced by VoiceOver. Setting the menulist's role to 'combobox'
addresses this and gets VoiceOver to announce the labels again.
This is interesting because 'combobox' is supposedly
menulist's implicit role, so it's not clear why this helps.

It does slightly change the way VoiceOver announces
menulists: it announces "combobox" instead of "popup button",
but semantically combobox is still appropriate per
https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-select-only

Fixes: #5424
2025-09-13 00:57:51 -04:00
Tom Najdek
e896fd0137
Add continuous-renaming functionality for attachment files (#3860)
Resolves #1685
2025-09-11 04:54:03 -04:00
Abe Jellinek
17bcb1e84c
Move New Group and New Feed directly under File menu (#5531) 2025-09-11 04:46:40 -04:00
Dan Stillman
c67e35c5ae Add Liquid Glass icon for macOS Tahoe
And preserve icon for previous macOS versions using
https://github.com/vslavik/TahoeIconsTests
2025-09-11 04:42:01 -04:00
Dan Stillman
eaf3f0c5df Use temporary download URL for Firefox 140.3.0esr candidate build
So we can address #5424 before the ESR is released on 9/16
2025-09-10 23:32:31 -04:00
Dan Stillman
cd8ae9308d Update Mac build to Firefox 140.3.0esr
Fixes #5424
2025-09-10 23:32:12 -04:00
abaevbog
8f5471d96b
fix zoteroSearch missing attachment conditions (#5538)
Fix regression after 4d803fe2cd
which caused the operator for condition to never get set.

Fixes: #5537
2025-09-09 22:19:28 -04:00
Bogdan Abaev
b3223dd94b Prefs: Small redesign of Cite → Style Manager table (#5518)
- Remove the delete button below the style table
- Make selected rows stand out less. They will only have an outline,
  like focused rows. This should remove the impression that this is the
  table where one selects the style for citations.
- Add minus icon buttons to each row to delete the style without having
  to select the row. The icon of the selected row is focusable, so it
  can be tabbed onto.
- improve labels and appearance of buttons to add a new style
- move "Reset Styles…" to "Cite" section and rename to "Restore Default
  Styles…"
2025-09-05 02:04:52 -04:00
Bogdan Abaev
5a7444f424 virt table: don't propagate pageUp/Down on macOS (#5518)
Same as on all other platforms. That way, if the parent
container is scrollable, it will not scroll.
2025-09-05 02:04:40 -04:00
Bogdan Abaev
015769a9f8 fx140: allow pointer events on cells in virt table (#5518)
Revert change from 8e2790e2d2.
Post fx140, dragstart fires fine on rows that are not
yet selected. This allows us to remove the workaround that
limited pointer events to the rows of virtualized table (vs its cells).
With it, we no longer need most of the manual handling
of the tooltip in virtualized table - just adding title attribute is enough.
We also don't need to add extra mouse events handling on
clickable button columns as in citationDialog - we can use
proper :hover and :activate effects, as well as attach
click handler directly to the button.
2025-09-05 02:04:15 -04:00
Abe Jellinek
41055ce0a1 Scaffold: Rename file when label changes 2025-09-04 10:09:50 -07:00
abaevbog
4ae1ea1daf
citation dlg: Don't remove bubbles on Backspace on Windows/Linux (#5526)
On non-macOS platforms, Delete (not Backspace) on a table row
will remove all of this item's bubbles from the citation.
This is to be consistent with similar delete operation
handling in other tables.

On macOS, this is still done via Backspace as before.

Per https://github.com/zotero/zotero/pull/5518#discussion_r2310293170
2025-09-04 03:50:50 -04:00
abaevbog
25a881255e
citation dlg: fix non-english locators wrong order (#5527)
Sort the locators alphabetically by their label
after constructing the popup.

https://forums.zotero.org/discussion/comment/497495/#Comment_497495
2025-09-04 03:48:47 -04:00
Abe Jellinek
afc02141ce
Replace CSL validator with reproducible WASM build (#5525) 2025-08-29 00:40:41 -04:00
Tom Najdek
cd82ab7c59
Enable support for Unicode features in file renaming by default (#5521) 2025-08-28 11:21:47 -04:00
Dan Stillman
86b9d28451 File sync: Use filtered filename when renaming from multi-file ZIPs
Follow-up to bab0237727
2025-08-28 03:50:08 -04:00
Dan Stillman
b4dc00eca1 Remove debug line in Zotero.File.rename() 2025-08-28 03:10:49 -04:00
Dan Stillman
b857283ed6 Fix skipItemUpdate logic in Item#relinkAttachmentFile()
We were skipping updating of `clientDateModified` in order to prevent an
attachment item upload, but that hasn't been used since Zotero 4. This
might mean that, in some rare situations (e.g., a filename that needed to
be shortened due to filesystem path length?), people in read-only or
non-files-editable groups may have ended up triggering access errors and
needing to reset local data after a file download.

Now, we properly skip marking the attachment item as unsynced.
2025-08-28 03:10:48 -04:00
Dan Stillman
f5010ce764 Don't update file mod time to force sync upload when renaming
We've always done this, but it's no longer necessary:

- If a file exists locally when a remote filename change comes in, we
  now rename the local file.
- If a file doesn't exist locally and it's a single file, we save the
  file with the new filename on the next file download.
- If a file doesn't exist locally and it's an old multi-file snapshot,
  we now try to find the primary HTML file and rename it.
2025-08-28 03:10:46 -04:00
Dan Stillman
bab0237727 File sync: Rename single HTML file within multi-file ZIP to known name
If a file was renamed remotely and a new copy wasn't uploaded for some
reason, the ZIP wouldn't contain the new filename. We already renamed a
single file within the ZIP to match the new filename, but now we also
rename a single HTML file in old multi-file snapshot ZIPs. If there are
multiple HTML files for some reason (old-style ZIP with iframes?), we
let the user fix it.

And then we can stop reuploading files after renames.
2025-08-28 03:06:52 -04:00
Dan Stillman
33bd1327a0 Remove unnecessary file stat in Item#attachmentModificationTime 2025-08-28 03:06:52 -04:00
Dan Stillman
11d17c5803 Rename file on remote filename change during sync
Previously, the local file wasn't renamed, so it would become unlinked.
Since we currently force reuploading/reregistering of files when they're
renamed, opening the attachment would then redownload the modified
remote file, but there's no need for the file to become unlinked in the
first place.
2025-08-28 03:06:52 -04:00
Abe Jellinek
7abc35bc02
Notes context pane: Create context menus locally (#5508) 2025-08-27 00:41:21 -04:00
Abe Jellinek
e4e6b4189c
Keep Zotero in the User-Agent, add Firefox (#5500) 2025-08-27 00:40:08 -04:00
abaevbog
31e2e95452
itembox: restore unsaved input value after refresh (#5517)
If itemBox refresh happens when an input is focused and
has some unsaved changes, restore the value of the input
after the refresh.

Potential solution for:
https://forums.zotero.org/discussion/126273/bug-data-that-is-input-is-not-saved-and-needs-to-be-entered-again
2025-08-26 23:43:02 -04:00
Abe Jellinek
23567b0395
ESMify feed processing code (#5520) 2025-08-26 23:42:00 -04:00
Abe Jellinek
5c95c35743 Style installation: Don't prompt on validation error in silent mode 2025-08-26 00:44:14 -04:00
Abe Jellinek
08e4d6b06b Stop using restoreProcessorState() (#5516)
restoreProcessorState() breaks locale-specific punctuation (and is
deprecated).

rebuildProcessorState() is enough if we're passing an empty citation
list; if we're reinitializing with a new non-empty list, call
updateItems() first.

Also:

- Add tests for this issue and for potential regressions in disambiguation handling
2025-08-26 00:44:14 -04:00
Abe Jellinek
1a3ea508fe Preferences: Add getScope() function 2025-08-25 14:22:29 -04:00
Adomas Venčkauskas
b1dbe35102 Fix note type picker appearing for Google Docs
Report https://forums.zotero.org/discussion/126026/endnotes-option-showing-in-google-docs
2025-08-25 12:12:07 +03:00
windingwind
4d803fe2cd customElements: Lint 2025-08-23 12:15:40 +02:00
windingwind
7f1c59fde8 Fix attachmentBox reindexButton undefined 2025-08-23 11:54:35 +02:00
Dan Stillman
5c6400e21b Skip unnecessary SQL query if no attachments in Item#getBestAttachments()
This probably shouldn't be SQL at all, but while it is, skip it if not
necessary.
2025-08-22 03:38:02 -04:00
Dan Stillman
2216729721 Clarify variable name in Item#_updateAttachmentStates() 2025-08-22 03:38:02 -04:00
Abe Jellinek
ea3f14f195 HiddenBrowser: Lint 2025-08-21 12:22:25 -04:00
Abe Jellinek
ee42f44254 HiddenBrowser: Fix proxy setting all properties on browser
Missing return.
2025-08-21 12:19:46 -04:00
Abe Jellinek
74c8226323 HiddenBrowser: Remove leak timer
Always logged a warning, even though it doesn't seem like memory is
actually being leaked here.
2025-08-21 12:19:29 -04:00
Abe Jellinek
ba4949e822 Fix nukeSandbox error when closing settings
Fixes #5509
2025-08-21 11:35:41 -04:00
Bogdan Abaev
098be27375 citation dlg: fix row cutoff on linux after resize
When resizing the window in list mode to match the height
of the content, account for the difference between
outerHeight and innerHeight of the window on Linux.
outerHeight > innerHeight (perhaps Linux includes chrome,
borders, etc. in its outerHeight), so we have to add their difference
to the desired height for resizing. Otherwise, the visible
dialog ends up receiving only some of the desired height and
the last row is cut off.

Also, ensure that in tests, we wait for searching triggered by
switching dialog mode to finish before running the next search.

Fixes: zotero#5502
2025-08-21 11:50:10 +03:00
abaevbog
2f262c943c
Additional fixes to form element appearance on Linux (#5503)
Followup to 06ef9ab

Fix <html> based form elements, in citation dialog item popover.
Set slightly smaller default border width of buttons.
2025-08-21 11:48:53 +03:00
Abe Jellinek
4f1589132c
Add Relate Items to context menu (#5499) 2025-08-20 02:15:06 -04:00
windingwind
7f9418fe98
Implement custom menu API (#5028) 2025-08-20 02:10:35 -04:00
Abe Jellinek
8eb803292e Clear pane.persist in tests (#5495) 2025-08-20 02:00:31 -04:00
Abe Jellinek
d854058be6 Don't reopen collection/item pane on restart (#5495) 2025-08-20 02:00:31 -04:00
Abe Jellinek
d35bdd333b
Fix errors when multi-selection contains collections in trash (#5497)
By using getSelectedItems() instead of getSelectedObjects(). The code
below all assumes that `items` contains items, and we handle general
(item or collection) options above, so this seems more correct.

And fix duplicate var.
2025-08-20 01:23:47 -04:00
Dan Stillman
bdf49b9b00 Fix slow purging of creators
Same as e532e435f but for creators
2025-08-19 03:29:05 -04:00
Adomas Venčkauskas
72cc386207 Update LibreOffice submodule 2025-08-19 10:07:53 +03:00
Abe Jellinek
3a61e782ad Scaffold: Fix modern JS APIs missing from code completion 2025-08-18 13:17:03 -04:00
Dan Stillman
dfc869bd2d Update LibreOffice submodule 2025-08-16 11:08:31 -04:00
Dan Stillman
8df8182f01 Update LibreOffice submodule 2025-08-15 02:59:05 -04:00
Dan Stillman
bf59a1e2f8 Revert "Fix relations to erased items reappearing after sync (#5486)"
I think this might cause problems and needs to be tested further.

This reverts commit 07066fd8c1.
2025-08-15 02:09:18 -04:00
abaevbog
07066fd8c1
Fix relations to erased items reappearing after sync (#5486)
Fix ghost relations to erased items reappearing after
sync. The dataserver ensures that related relations are
bidirectional. If a related item is erased, syncing
would first upload the update to the remaining related item
(where the relation is removed), followed by the deletions.
While handling update upload, the dataserver would return
the old, should-be-removed, "dc:relation" entry for that item
because it does not know that the other item is erased.

To handle this, swap the order of operations during sync:
upload deletion first and then upload updates after.
Then, when the dataserver handles the update of the non-erased item,
there is no related item to enforce bidirectional relations to.

Fixes: #5481
2025-08-15 02:00:43 -04:00
abaevbog
8b0f8d7c20
avoid relation to self after merging related items (#5488)
When copying over relations during merge of items
that are related to one another, avoid relating the
chosen main item to itself.

Fixes: #5487
2025-08-15 01:40:01 -04:00
windingwind
20f738ba0d
Remove timeline related code (#5484) 2025-08-15 01:30:42 -04:00
Abe Jellinek
86f9dd7400
Handle invalid path when launching/revealing on macOS (#5485) 2025-08-15 01:29:05 -04:00
Abe Jellinek
d69a1a65ee Fix intermittent context pane toggle test failure
Hopefully.
2025-08-14 17:52:28 -04:00
Abe Jellinek
a993ac74f1
Ensure read-only fields don't save on blur (#5468)
Fixes tabbing out of Scaffold's abstract box causing the test item to be
added to the user's library.

And use same format as itemPaneHeader.js in abstractBox.js.
2025-08-13 23:59:26 -04:00
abaevbog
f3227275b1
filter out trashed items in relatedBox (#5482)
If the item itself is trashed, all related items are displayed
(trashed or not).

Fixes: #1780
2025-08-13 23:56:40 -04:00
Martynas Bagdonas
71c2ffb3ee Update reader submodule 2025-08-12 14:17:25 +03:00
Matthias Kurz
9330db9ff8
Update Copyright year to 2025 (#5473) 2025-08-12 00:47:26 -04:00
Matthias Kurz
9f14f8424f
Set Gecko MinVersion to 140 (#5474) 2025-08-12 00:47:16 -04:00
Abe Jellinek
3e17928547 Fix hiddenDOMWindow comment 2025-08-08 09:54:07 -06:00
Dan Stillman
96dd7b16ac Better method of unsetting and restoring Mozilla environment variables
Hopefully a better fix for #4981, which wasn't working properly on at
least some Linux systems because the variables were getting restored
before the subprocess launched. This delays a (debounced) second, to
give the subprocess time to start, and then automatically restores the
variables.

An explicit restart via app code also immediately restores the
variables, since restarts on Linux inherent the environment and don't
use our startup script. (An upgrade restart could still happen when the
variables were cleared, but you'd have to be extremely unlucky --
launching URLs or files while also performing a manual restart the same
second.)
2025-08-08 02:57:47 -04:00
Adomas Ven
06ef9ab657
Fix linux form element styling (#5467)
Closes #5435
2025-08-07 02:16:16 -04:00
Dan Stillman
24a249353c "Caching" → "Cached" in CSL.Engine cache debug line to clarify timing 2025-08-07 01:11:01 -04:00
Dan Stillman
970675a2ac Update citeproc.js to include Juris-M/citeproc-js#256 2025-08-07 01:10:10 -04:00
Dan Stillman
c72a8a1424 Update citeproc.js to latest build
Includes Juris-M/citeproc-js#253 and Juris-M/citeproc-js#254
2025-08-07 00:59:48 -04:00
Abe Jellinek
d514786239 Clear _blockingObserver field when it was never initialized
Follow-up to cc3fc42b0a
2025-08-05 11:18:19 -04:00
Abe Jellinek
cc3fc42b0a Catch BlockingObserver error when reader is closed immediately
https://forums.zotero.org/discussion/125841/cannot-open-a-pdf-file-in-a-new-tab
2025-08-05 11:17:03 -04:00
Adomas Venčkauskas
2c7475a5e6 Fix Google Docs integration breaking when cancelling edit bibliograpy
I've run into this randomly. It only occurs if the first operation on a
Google Doc since Zotero restart is the edit bibliography dialog which
you cancel. Due to how the HTTP integration client is implemented, the
missing await causes it to try to send another response to the Connector
(which is no longer waiting on the /response endpoint), failing and
causing a forever pending promise, which makes subsequent attempts to
interact with the Google Docs plugin no-op.

We get occassional reports from users about Google Docs getting stuck
that is fixed by Zotero restart, so hopefully this will reduce those.
2025-08-05 09:55:09 +03:00
Martynas Bagdonas
e644df74fe Remove tab characters from FTL files to avoid parsing issues
Fixes #5447
2025-08-04 15:02:51 +03:00
Tom Najdek
8355a95407
Warn users running non-ARM version on ARM CPU on Linux (#5461) 2025-08-02 09:59:48 -04:00
Abe Jellinek
f8a1a2c6ed
Don't merge into a missing snapshot attachment (#5459) 2025-08-02 01:53:47 -04:00
abaevbog
487677958e
fix subcollection not being copied to library root (#5464)
Fixes: #5463
2025-08-02 01:50:54 -04:00
Abe Jellinek
68ffe9583c Clean up JSDoc comments and unused field (#5443) 2025-08-02 01:49:39 -04:00
Abe Jellinek
fd6c52ede4 Find Full Text: Simulate ProQuest redirect back to original page (#5443)
We don't follow JS redirects, so this is necessary in order for
us to get to a translatable page after authentication.
2025-08-02 01:49:39 -04:00
Abe Jellinek
91732419b6 Attach CookieSandbox to Find Full Text requests and translation (#5443)
With a 24-hour validity per site (eTLD+1).
2025-08-02 01:49:39 -04:00
abaevbog
2a60011414
fx140: fix cutoff progressWindow on linux (#5462)
Resize the window to fit content on load after the
header is rendered. If the window is resized on
DOMContentLoaded, nothing is rendered yet and the
window will look cutoff on Linux.

Addresses #5453
2025-08-02 01:41:39 -04:00
abaevbog
873beebc0f
close more leftover windows in tests (#5460)
- close hyphenationTest window.
- properly close zoteroPane window in preferences_syncTest.
after() hook inside of the test would not close the window until the
very end of the entire test run. Without this, during
subsequent tests that open their own zoteroPane window, there
are two instances of zoteroPane open at the same time.
- close open tabs in readerTest cleanup, since subsequent
tests expect library tab to be selected.

Followup to https://github.com/zotero/zotero/pull/5444#issuecomment-3141879892
2025-08-02 01:40:21 -04:00
Abe Jellinek
74926fcc2e Fix menubar menu not opening after submenu item is selected
On Windows and (I'm assuming) Linux. Regression in c3f8ba8.

Fixes #5456
2025-08-01 12:12:36 -04:00
windingwind
37ff8c9143
Improve linux popup appearance (#5452)
* Fix tabs menu panel padding

* Fix tabs menu panel background

* Fix panel style selector

resolve: #5434
2025-08-01 11:02:14 -04:00
windingwind
1dbfb1a998
Improve linux window appearance (#5451)
resolve: #5449
2025-08-01 10:59:38 -04:00
Dan Stillman
2bff6541f2 Update note-editor and reader submodules 2025-07-31 22:50:21 -04:00
abaevbog
b1e163b7f5
fx140: Use architecture-specific build folder for tests on Linux (#5445) 2025-07-31 22:48:21 -04:00
Dan Stillman
87d27f9c51
Close ProgressQueueDialog after connector server tests (#5446)
Since some connector operations trigger recognition

This will hopefully fix the tags box test failures.
2025-07-31 21:54:15 -04:00
windingwind
773ca6f724
Improve item pane test stability (#5436) 2025-07-31 21:51:40 -04:00
abaevbog
69fdf0b145
fx140: fix collection tree toolbar color on Linux (#5440)
Override default toolbar color set in https://searchfox.org/mozilla-esr140/source/toolkit/themes/linux/global/toolbar.css#12

Fixes #5439
2025-07-31 13:35:14 -04:00
Dan Stillman
19a848484a Don't split tags at em dashes on paste in item tags box
https://github.com/zotero/zotero/pull/5366#discussion_r2245628458
2025-07-31 11:25:57 -04:00
Dan Stillman
5063a8b396 isAbove → isAtLeast in sync engine tests for testing delays
Maybe related to Bluebird?
2025-07-31 10:45:19 -04:00
Tom Najdek
efadc21cdc
Update a call to a deprecated function in Mendeley import 2025-07-31 16:04:06 +02:00
Tom Najdek
a5cdd8d5aa
Fix context menu closes on every third right-click. Resolve #5427 2025-07-31 13:03:01 +02:00
Dan Stillman
682722bc29 Update LibreOffice and Word for Mac submodules 2025-07-30 22:31:12 -04:00
abaevbog
95e4a34476 fx140: fix separators on linux (#5432)
- fix transparent gap between tag selector and separator
- remove double border below separator of context pane in
stacked mode

Fixes: #5430
2025-07-30 22:31:12 -04:00
Dan Stillman
7f684ce130 Remove unused argument (previously to Zotero.Promise.map()) 2025-07-30 22:31:12 -04:00
Dan Stillman
87971248c5 Replace Bluebird's .spread() in integration code 2025-07-30 22:31:11 -04:00
Dan Stillman
18ff5c30f0 Update LibreOffice and Word for Mac submodules for fx140 2025-07-30 22:31:11 -04:00
Dan Stillman
922af23c63 fx140: Fix Mendeley Importer import 2025-07-30 22:31:11 -04:00
Dan Stillman
57fd2162d1 fx140: Fix NetUtil import 2025-07-30 22:31:11 -04:00
windingwind
08e2be9875 fx140: fix item pane test further
Should call updateLayout after changing layout
Should wait for notify after saving object
2025-07-30 22:31:11 -04:00
windingwind
0ce54e2b14 Fix item pane test failure
fix: #5421
2025-07-30 22:31:11 -04:00
abaevbog
747a3f7a9f fx140: remove sliding animation from panels (#5423) 2025-07-30 22:31:10 -04:00
Abe Jellinek
5af15f6496 fx140: Bring tabbox tabs back to the middle
And nudge them down a bit further.
2025-07-30 22:31:10 -04:00
Dan Stillman
4a5689e9b6 Restore rejection of last feed item when FeedReader terminates
Without this, the "should reject if the provided url is not a valid
feed" test fails

Follow-up to #5412
2025-07-30 22:31:10 -04:00
Abe Jellinek
c1270e635e Overhaul testing in Scaffold (#5301) 2025-07-30 22:31:10 -04:00
abaevbog
2e135d035f Fx140: do not use bluebird methods in citation dialog (#5416)
Instead, decide if the search should be skipped after
the delay based on the timestamps.

Fixes: #5414
2025-07-30 22:31:10 -04:00
Dan Stillman
0a33eeb0c0 Update translate submodule 2025-07-30 22:31:10 -04:00
Dan Stillman
4c51883b97 Restore Zotero.Promise.method() on ItemGetter#setAll()
Required for noWait translation
2025-07-30 22:31:09 -04:00
Dan Stillman
d797c7a4d8 BluebirdShimPromise: Add value() and fix isResolved() semantics
- value() is used in noWait export translation

- isResolved() technically means fulfilled or rejected -- unclear if we
  ever depended on that, but it might as well be correct
2025-07-30 22:31:09 -04:00
abaevbog
dd5667c09b fx140: update X icon for search cancel button (#5417)
searchfield-cancel.svg no longer exists, use close-12.svg
that is the same one used by search-textbox
2025-07-30 22:31:09 -04:00
windingwind
d1c6ee33be Fix plugin API test failure
Fix: #5411
2025-07-30 22:31:09 -04:00
Abe Jellinek
a53e474f9c Make filterStack() a no-op 2025-07-30 22:31:09 -04:00
Dan Stillman
e7805914f4 ConcurrentCaller: Increment numRunning in the correct place 2025-07-30 22:31:09 -04:00
Dan Stillman
0f560f4e4c ConcurrentCaller: Fix return value in comment after Bluebird removal 2025-07-30 22:31:09 -04:00
Dan Stillman
5c172e3be9 ConcurrentCaller: Reject queued promises when stopping queue
Previously, we simply cleared the queue, leaving any pending promises
unresolved, and we checked for isResolved()/isPending() in
storageEngine.js (and maybe other places). storageEngine.js was changed
to simply await those promises, but that results in a hang if the queue
is stopped, since the promises were never resolved. Instead, when
stopping the queue, reject queued promises with a CanceledException and
ignore those promises in storageEngine.js.
2025-07-30 22:31:08 -04:00
Abe Jellinek
0a62553746 Remove remaining chai-as-promised method calls 2025-07-30 22:31:08 -04:00
Abe Jellinek
9442b7ee6c Fix Zotero.Feed tests after chai-as-promised removal 2025-07-30 22:31:08 -04:00
Abe Jellinek
7e706354f9 Don't try to reject last feed item when FeedReader terminates
As the comment says, this hasn't been useful (and isn't used anywhere),
and I honestly don't understand how the test ever passed - process()
would've resolved all the feed item promises already.

Fixes #5412
2025-07-30 22:31:08 -04:00
Abe Jellinek
c8aff336b3 Migrate Bluebird methods in Zotero.Utilities.Internal.saveDocument()
Fixes #5415
2025-07-30 22:31:08 -04:00
Dan Stillman
26ffaf0ad3 Update translate module
Fixes test failure in fx140
2025-07-30 22:31:08 -04:00
Dan Stillman
f81763b173 Remove Chai as Promised
A test using `assert.eventually` was failing after the Bluebird removal
but worked with just `await`, and since there hasn't really been much
point to Chai as Promised since the introduction of `async`/`await` ages
ago, just remove the library instead of figuring out why.
2025-07-30 22:31:08 -04:00
Dan Stillman
26b6c70b96 Fix Libraries test after Bluebird removal 2025-07-30 22:31:07 -04:00
Dan Stillman
6809aa50ad Fix item tree tests after Bluebird removal
Remove uses of PromiseInspection.value()
2025-07-30 22:31:07 -04:00
Dan Stillman
dc80fb2d50 fx140: nsIStringInputStream#setData() → setByteStringData() 2025-07-30 22:31:07 -04:00
Dan Stillman
1500fb9fa3 ConcurrentCaller: Revert to Promise.delay()
We're shimming it, and we override it with a stub in a syncAPIClient
test.
2025-07-30 22:31:07 -04:00
Dan Stillman
0bf4fc54c4 Remove uses of Promise.isFulfilled() in connector server tests 2025-07-30 22:31:07 -04:00
Dan Stillman
c2b6a9cc12 fx140: Fix NetUtil import in server tests 2025-07-30 22:31:03 -04:00
Dan Stillman
c4cfee1807 fx140: Fix additional mendeleyImport.mjs imports 2025-07-30 22:30:58 -04:00
Dan Stillman
b7c2002b63 Fix another Bluebird removal bug
Use of `Promise.map()`
2025-07-30 22:30:58 -04:00
Dan Stillman
e07ac6243c Fix bug from Bluebird removal
Bluebird had a `Promise.filter` method

Fixes failing data directory tests
2025-07-30 22:30:58 -04:00
Abe Jellinek
9f038891ef Set name for Zotero.DBConnection.TimeoutError
Fixes failing timeout test in dbTest.js.
2025-07-30 22:30:57 -04:00
Abe Jellinek
97dbcc6870 Restore timeout in dataObjectTest.js, fix test
OK, the timeout removed in 05e8da wasn't actually useless, but this test
was.

41706a changed erase() so it no longer forwards skipNotifier when
deleting child items. That means that we *would* get a notify() call for
the deleted child, so the test should have been failing.

However! Because of a bug in Bluebird's filtered catch() implementation,
Promise.TimeoutError wasn't recognized as an Error subclass, and it was
instead used as a predicate function, which would always pass.

So all errors were caught as "timeouts" and suppressed, making this test
always pass. Now it no longer always passes (but does pass with the
current behavior).
2025-07-30 22:30:57 -04:00
Abe Jellinek
6203b9712d Fully asyncify feedTest.js 2025-07-30 22:30:57 -04:00
Abe Jellinek
b87bdeea41 Update asyncify script to handle more Mocha hooks 2025-07-30 22:30:57 -04:00
Abe Jellinek
20e75c3251 Remove Bluebird methods in concurrentCallerTest.js
This is really messy and not ideal, but these tests were written for
Bluebird Promise state inspection, and it's difficult to make them look
nice without that being available.
2025-07-30 22:30:57 -04:00
Abe Jellinek
2bc0afa830 Remove useless timeout() in dataObjectTest.js 2025-07-30 22:30:57 -04:00
Abe Jellinek
d9341bbf1a Use alternate method to test feed check delay 2025-07-30 22:30:56 -04:00
Abe Jellinek
2b7535cd83 Fix test runner
By restoring ZOTERO_TEST=1 in runtests.sh after 711b336.
2025-07-30 22:30:56 -04:00
Tom Najdek
7e1f4b8dbf fx140: ESMify errorReport.xhtml 2025-07-30 22:30:56 -04:00
Abe Jellinek
52b4fc0b9d Preferences: Fix sandbox destructor 2025-07-30 22:30:56 -04:00
windingwind
519c4cb518 fx140: Fix scaffold missing menubar 2025-07-30 22:30:56 -04:00
windingwind
db29ed6501 fx140: Fix Linux window control button position 2025-07-30 22:30:56 -04:00
windingwind
331ed31b1c fx140: Fix Linux titlebar appearance 2025-07-30 22:30:56 -04:00
windingwind
2562871424 fx140: Fix menu icon overlap
Fix after #5343
2025-07-30 22:30:55 -04:00
Tom Najdek
4eae5bc658 Fix incorrect MendeleyImporter import path after ESMify 2025-07-30 22:30:55 -04:00
Abe Jellinek
f4a5ee0c7e fx140: ESMify about.xhtml 2025-07-30 22:30:55 -04:00
Abe Jellinek
e4878052aa fx140: Add draft macOS native-like textarea style
Firefox doesn't use any native textareas anymore, so I guess they just
removed/broke native textarea rendering.
2025-07-30 22:30:55 -04:00
Dan Stillman
072b2e3285 Force Firefox refetch when switching to older branch 2025-07-30 22:30:55 -04:00
Dan Stillman
ac32c0fd8b Add Firefox build script for Linux 2025-07-30 22:30:55 -04:00
Dan Stillman
233cfb80ea Update Word for Windows submodule for fx140 2025-07-30 22:30:55 -04:00
Abe Jellinek
964b5a0e88 fx140: Fix remaining bare ChromeUtils.import() calls 2025-07-30 22:30:54 -04:00
Abe Jellinek
1dd60c948b Fix export translation
Restore Zotero.Promise.method() wrapper on getCodeForTranslator()
because the translation framework needs it to return a synchronously
resolved promise, unfortunately.
2025-07-30 22:30:54 -04:00
Dan Stillman
04e03478a9 Update version to 8.0 2025-07-30 22:30:54 -04:00
Dan Stillman
b50d87a6f4 Fix stderr output in build script 2025-07-30 22:30:54 -04:00
Dan Stillman
12354bd23b Include Linux ARM64 in build_and_deploy 2025-07-30 22:30:54 -04:00
Dan Stillman
69963dce2c Re-enable packaging of the updater on Linux 2025-07-30 22:30:54 -04:00
Dan Stillman
38cfc233cf Fix various bugs in the build scripts on Linux
After the arch-specific-builds overhaul
2025-07-30 22:30:54 -04:00
Dan Stillman
f31dde4a1b Take path to Firefox source on command line for Windows Firefox builds 2025-07-30 22:30:53 -04:00
Dan Stillman
93edf4e099 Use SHA256 for custom Firefox components on macOS
(Not currently necessary)
2025-07-30 22:30:53 -04:00
Dan Stillman
44bba85ce8 Use custom xul.dll on Windows
Necessary for non-Mozilla C:\ProgramData folder now that we can no
longer do a string replace on the official DLL

The custom component ZIPs are currently stored in S3 and referenced by
SHA-256 hashes, which get committed. This is basically the same as Git
LFS, but since we now support per-arch fetch_xulrunner and building,
this avoids the need to download large xul.dll files for other
architectures. (Git LFS files also can't ever be removed, so
particularly while we're testing this, we don't necessarily want to
permanently store every copy.)
2025-07-30 22:30:53 -04:00
Dan Stillman
3e0d2c06f1 Support arch-specific builds on Windows and Linux
`fetch_xulrunner`, `dir_build`, and `build.sh` now take an optional `-a`
argument on Windows and Linux to specify the architecture to
fetch/build. If `-a` is omitted for `dir_build` (as in `build_and_run`),
it defaults to the current architecture.

xulrunner hashes are now computed for each architecture. This changes
some filenames in xulrunner/, so you may want to clean out some old
folders/files.

This removes the custom handling for CI, since it will now default to
the architecture of the test runner.
2025-07-30 22:30:53 -04:00
Abe Jellinek
67d2e1cead fx140: Asyncify/ESMify tests
They seem to be succeeding when run individually, but failing when
run as a whole. Not sure why yet.
2025-07-30 22:30:53 -04:00
Abe Jellinek
d3419ed124 fx140: Update asyncify script to handle it() calls 2025-07-30 22:30:53 -04:00
Abe Jellinek
6fc1726da7 fx140: Fix folderImport import in fileInterface.js 2025-07-30 22:30:53 -04:00
Dan Stillman
ae83e01923 Update Mozilla patch for Firefox 140 for Windows
With ROOT_UPDATE_DIR_NAME change
2025-07-30 22:30:52 -04:00
Zotero
581157ca75 Set RUST_TARGET for Windows build 2025-07-30 22:30:52 -04:00
Dan Stillman
363383363d Disable some services for the Windows build
Unclear if these affect the launcher or xul.dll, but no need to build
them either way
2025-07-30 22:30:52 -04:00
Adomas Venčkauskas
19903271ce Use ESMified word processor plugin installers 2025-07-30 22:30:52 -04:00
Adomas Venčkauskas
601a1f2292 fx140: ESMify word-processor-plugin-installer 2025-07-30 22:30:52 -04:00
Adomas Venčkauskas
35919f640c fx140: Remove isFulfilled and isResolved uses in integration 2025-07-30 22:30:52 -04:00
Dan Stillman
94aa126107 Fix signing of Mac builds with fx140
There's now an UpdateSettings.framework in the updater that needs to be
signed before the updater itself can be signed.
2025-07-30 22:30:52 -04:00
Dan Stillman
4657156c91 Always sign macOS test builds
Since they don't start after fx140, for reasons I didn't investigate
2025-07-30 22:30:51 -04:00
Dan Stillman
e1a595d78d Update macOS SDK for fx140 build in mozconfig 2025-07-30 22:30:51 -04:00
Dan Stillman
21aaa1c33c Update Linux updater to Firefox 140.0esr
Including ARM64 version
2025-07-30 22:30:51 -04:00
Dan Stillman
63741ca9bc Add script to extract Linux updaters from custom Firefox builds 2025-07-30 22:30:51 -04:00
Dan Stillman
48e9bda610 Update Linux mozconfig for fx140 2025-07-30 22:30:51 -04:00
Abe Jellinek
6b2331b647 Remove special handling for Promise.coroutine() in server.js 2025-07-30 22:30:51 -04:00
Abe Jellinek
ae0413ce80 Asyncify standalone.js 2025-07-30 22:30:50 -04:00
Abe Jellinek
499ce2709c Asyncify errorReport.xhtml 2025-07-30 22:30:50 -04:00
Abe Jellinek
0937d47721 Asyncify feedSettings.js 2025-07-30 22:30:50 -04:00
Abe Jellinek
f9541b3281 Asyncify advancedSearch.js 2025-07-30 22:30:50 -04:00
Abe Jellinek
0970415c3a fx140: De-uglify tabbox on macOS
This is definitely not pixel-perfect to how it was before, but it's a
lot closer.
2025-07-30 22:30:50 -04:00
Abe Jellinek
d71a0db4a2 fx140: Preferences: Fix "Update now" label being appended, not replaced 2025-07-30 22:30:50 -04:00
Abe Jellinek
303b3a9a89 Preferences: Fix sandbox creation for subpanes 2025-07-30 22:30:50 -04:00
Abe Jellinek
e2bcf90856 Migrate Zotero.Promise#timeout() in db.js 2025-07-30 22:30:49 -04:00
Abe Jellinek
8fb3e6d1a9 Migrate Zotero.Promise methods in storageEngine.js 2025-07-30 22:30:49 -04:00
windingwind
8ff5d9e3e1 fx140: Fix tabs menu panel style 2025-07-30 22:30:49 -04:00
Abe Jellinek
6231b6dd5a migrate-fx140: Fix error message 2025-07-30 22:30:39 -04:00
windingwind
cb449989b8 fx140: Fix menupopup style 2025-07-30 22:30:38 -04:00
Abe Jellinek
1c4d2b84e0 Migrate Zotero.Promise#return() in libraries.js 2025-07-30 22:30:38 -04:00
Abe Jellinek
64a2237fb3 fx140: Don't rely on hiddenDOMWindow in plugins.js 2025-07-30 22:30:38 -04:00
Abe Jellinek
b9e560d33e fx140: Remove EventUtils
Unused, relied on hiddenDOMWindow.
2025-07-30 22:30:38 -04:00
Abe Jellinek
0f2690eb75 fx140: Migrate hiddenDOMWindow in style.js
XSLTProcessor is available in the global scope now.
2025-07-30 22:30:38 -04:00
Abe Jellinek
0c1e341f50 fx140: Remove unused method that used hiddenDOMWindow 2025-07-30 22:30:38 -04:00
Abe Jellinek
3e2f6a8783 fx140: Update feedReader.js hiddenDOMWindow comment 2025-07-30 22:30:37 -04:00
Abe Jellinek
e52b1993f4 fx140: Work around grid layout bug in item box
And don't use hiddenDOMWindow, since it's no longer available on all
platforms.
2025-07-30 22:30:37 -04:00
Abe Jellinek
4ecac12cc6 fx140: Update type definitions 2025-07-30 22:30:37 -04:00
Abe Jellinek
31edc728d4 fx140: Update type definition update script
Use ZIP export to more easily get all subdirectories.
2025-07-30 22:30:37 -04:00
Abe Jellinek
6cbb0bc103 Migrate Zotero.Promise#isPending() in feedReader.js 2025-07-30 22:30:37 -04:00
Abe Jellinek
ed20f8b4d1 Migrate Zotero.Promise#isPending() in syncRunner.js 2025-07-30 22:30:37 -04:00
Abe Jellinek
ed00016caa Migrate Zotero.Promise#isPending() in dataObjects.js 2025-07-30 22:30:37 -04:00
Abe Jellinek
c4a0a760b1 Migrate Zotero.Promise#isResolved() in citationDialog.js 2025-07-30 22:30:36 -04:00
Abe Jellinek
e81f5d96f1 fx140: Fix Mendeley import
'else' branch is untested.
2025-07-30 22:30:36 -04:00
Abe Jellinek
e6aba9b879 fx140: Fix folder import 2025-07-30 22:30:36 -04:00
Abe Jellinek
fbf0177215 fx140: Fix Dictionary Manager 2025-07-30 22:30:36 -04:00
Abe Jellinek
ee859e374a fx140: Fix -debugger flag 2025-07-30 22:30:36 -04:00
Abe Jellinek
be0cc2c602 fx140: Fix ChromeUtils.defineESModuleGetters(this, ...) in MJS files
`this` is undefined - use globalThis.
2025-07-30 22:30:36 -04:00
Abe Jellinek
7b7c153711 Migrate Zotero.Promise#cancel() in zoteroPane.js 2025-07-30 22:30:36 -04:00
Abe Jellinek
90e92e995f Migrate Zotero.Promise.each() in syncLocal.js 2025-07-30 22:30:35 -04:00
Abe Jellinek
9a44834289 Migrate Zotero.Promise.filter() in profile.js 2025-07-30 22:30:35 -04:00
Abe Jellinek
68255d075e Migrate Zotero.Promise.map() in syncEngine.js 2025-07-30 22:30:35 -04:00
Abe Jellinek
70f75fd3b0 Migrate Zotero.Promise#cancel() in feeds.js 2025-07-30 22:30:35 -04:00
Abe Jellinek
122b160639 Migrate Zotero.Promise.map() in quickCopy.js 2025-07-30 22:30:35 -04:00
Abe Jellinek
18500b19d0 Migrate Zotero.Promise.each() in quickCopy.js 2025-07-30 22:30:35 -04:00
Abe Jellinek
676be3fc00 Update JSDoc for forEachChunkAsync() 2025-07-30 22:30:35 -04:00
Abe Jellinek
da6efecaef Migrate Zotero.Promise.map() in syncFullTextEngine.js
Fixes syncing, I think.
2025-07-30 22:30:34 -04:00
Abe Jellinek
14afba4b62 Import ConcurrentCaller in storageEngine.js 2025-07-30 22:30:34 -04:00
Abe Jellinek
ffb68f2f6c Make Library#_initSave() async to match superclass
Fixes .catch() error
2025-07-30 22:30:34 -04:00
Abe Jellinek
ce0ee4b693 Migrate Promise#return() in file.js 2025-07-30 22:30:34 -04:00
Abe Jellinek
9cad92b817 fx140: Fix ZoteroProtocolHandler URI parsing
nsIURI#pathQueryRef no longer includes the authority component. A URI
that would've had pathQueryRef '//authority/path' before will now have
pathQueryRef '/path'.

Reader seems to be functional after this change.
2025-07-30 22:30:34 -04:00
Abe Jellinek
2a077ab131 Remove Zotero.spawn()
This method relied on Bluebird and can be replaced by just awaiting an
async function.
2025-07-30 22:30:34 -04:00
Abe Jellinek
76232fda21 Replace use of Zotero.spawn() in ZoteroProtocolHandler 2025-07-30 22:30:34 -04:00
Abe Jellinek
2b0255435e Replace use of Zotero.spawn() in http.js 2025-07-30 22:30:33 -04:00
windingwind
6222737d1a fx140: Fix titlebar and window control icons 2025-07-30 22:30:33 -04:00
Abe Jellinek
488bcc484f Replace uses of Zotero.Promise.defer() as a constructor 2025-07-30 22:30:33 -04:00
Abe Jellinek
bb8a8a4362 fx140: Use import statements in MJS files 2025-07-30 22:30:33 -04:00
Abe Jellinek
c434ec40dd fx140: Remove unused bare imports 2025-07-30 22:30:33 -04:00
Abe Jellinek
c8dd6095c8 fx140: Fix remaining bare importESModule() calls 2025-07-30 22:30:33 -04:00
Dan Stillman
08879d81d6 Update Windows updater to 140.0esr
This allows updates from Firefox builds past 115.23esr/128.10esr/138.0,
which change the command line arguments passed to the updater.

https://bugzilla.mozilla.org/show_bug.cgi?id=1923376
2025-07-30 22:30:33 -04:00
Dan Stillman
587e4227d7 Update Windows build to Firefox 140.0esr 2025-07-30 22:30:32 -04:00
Dan Stillman
f6f920350d Update Mac updater to 140.0esr
This allows updates from Firefox builds past 115.23esr/128.10esr/138.0,
which change the command line arguments passed to the updater.

https://bugzilla.mozilla.org/show_bug.cgi?id=1923376
2025-07-30 22:30:32 -04:00
Dan Stillman
cbefe513c2 Update Mac build to 140.0esr 2025-07-30 22:30:32 -04:00
Dan Stillman
001a6cc259 Update Rust version for fx140 builds 2025-07-30 22:30:32 -04:00
Dan Stillman
c634273fe1 Update build scripts with new default Firefox source folder
After the git transition
2025-07-30 22:30:32 -04:00
Dan Stillman
0a80484919 Fix win32 argument to Windows build script 2025-07-30 22:30:32 -04:00
Abe Jellinek
9d6669eb1e fx140: Add ChromeUtils.import() shim for plugins
We can decide if we want to keep this, but it's an easy change that
seems useful for dev builds.
2025-07-30 22:30:32 -04:00
Abe Jellinek
f0ac59f3dc Add functional shim for Zotero.Promise.method()
For translation.
2025-07-30 22:30:31 -04:00
Abe Jellinek
60983dadd5 fx140: Fix other bare imports in file.js 2025-07-30 22:30:31 -04:00
Abe Jellinek
1197683ab3 fx140: Fix other bare imports in utilities_internal.js 2025-07-30 22:30:31 -04:00
Abe Jellinek
4f8a1bc968 fx140: Fix ctypes imports in utilities_internal.js 2025-07-30 22:30:31 -04:00
Abe Jellinek
a9df0424e5 fx140: Fix InlineSpellChecker import in editorInstance.js 2025-07-30 22:30:31 -04:00
Abe Jellinek
6053091563 fx140: ESMify EPUB and uses 2025-07-30 22:30:31 -04:00
Abe Jellinek
95038a7da5 fx140: ESMify RemoteTranslate and uses 2025-07-30 22:30:30 -04:00
Abe Jellinek
ff72087da1 migrate-fx140: Use .mjs for Zotero modules everywhere 2025-07-30 22:30:30 -04:00
Abe Jellinek
4b7ac315b5 migrate-fx140: Assume Zotero ESMS are/will be renamed to .mjs 2025-07-30 22:30:30 -04:00
Abe Jellinek
33d97f585e Remove duplicate require.js from windows that import include.js 2025-07-30 22:30:30 -04:00
Abe Jellinek
27bd0708b6 fx140: Use ZOTERO_CONFIG as module in standalone.js and debugViewer.js 2025-07-30 22:30:30 -04:00
Abe Jellinek
c1f018eae8 fx140: ESMify actors 2025-07-30 22:30:30 -04:00
Abe Jellinek
c607b8f455 delayGenerator(): Use native Promise#then() 2025-07-30 22:30:29 -04:00
Abe Jellinek
496e067d11 fx140: Streamer: Don't use hiddenDOMWindow
WebSocket is available globally.
2025-07-30 22:30:29 -04:00
Abe Jellinek
c16b74ec5b fx140: ESMify/asyncify preference panes 2025-07-30 22:30:29 -04:00
Abe Jellinek
32f812d515 Load each preference pane in its own scope
To eliminate conflicts between top-level const/let declarations.
2025-07-30 22:30:29 -04:00
Abe Jellinek
ab5758c0b6 fx140: Restore menubar background on Linux
Not sure if these are the right colors or if this is the right place to
make this change.
2025-07-30 22:30:29 -04:00
Abe Jellinek
9be57b3110 Update ConcurrentCaller to use native promises 2025-07-30 22:30:29 -04:00
Abe Jellinek
06dc00af24 Migrate Promise#filter() in collectionTree.js 2025-07-30 22:30:29 -04:00
Abe Jellinek
4a1ca8ea96 Migrate Promise#isPending() in zotero.js 2025-07-30 22:30:28 -04:00
Abe Jellinek
37a6e0a61f Migrate Promise#delay() in schema.js 2025-07-30 22:30:28 -04:00
Abe Jellinek
c9a5a66020 fx140: Don't use hiddenDOMWindow for editable-text sizing
Causes an error on Linux.
2025-07-30 22:30:28 -04:00
Abe Jellinek
a61f7035ad fx140: Use ZOTERO_CONFIG as module in itemTree.jsx 2025-07-30 22:30:28 -04:00
Abe Jellinek
75a2c325ec Fix error on shutdown 2025-07-30 22:29:58 -04:00
Abe Jellinek
eeb94aea48 fx140: Fix more broken code 2025-07-30 22:18:36 -04:00
Abe Jellinek
a080b7c9c6 fx140: Give require()'d modules a window context 2025-07-30 22:18:36 -04:00
Abe Jellinek
f8826a9e8a fx140: Restore support for synchronous XHR in system code 2025-07-30 22:18:36 -04:00
Abe Jellinek
ece2b59700 fx140: More progress toward startup 2025-07-30 22:18:36 -04:00
Abe Jellinek
845b5a9006 migrate-fx140: Use native Promise.try(), fix Components.utils.import() 2025-07-30 22:18:36 -04:00
Abe Jellinek
c506e41072 fx140: Add working require.js, more progress toward startup 2025-07-30 22:18:36 -04:00
Abe Jellinek
14f4881d04 migrate-fx140: Assume all Firefox JSMs are ESMified 2025-07-30 22:18:35 -04:00
Abe Jellinek
741940dd9a migrate-fx140: Run jscodeshift on all JS files
This is probably why it wasn't doing much.
2025-07-30 22:18:35 -04:00
Abe Jellinek
e94ed24e20 Add Promise.defer() to Bluebird shim 2025-07-30 22:18:35 -04:00
Abe Jellinek
05d19fc6aa Replace Bluebird with async in xpcom/ 2025-07-30 22:18:35 -04:00
Abe Jellinek
8d0923f119 fx140: Remove Bluebird
All module code runs in strict mode, and that breaks Bluebird.

And add a partial shim for the simplest and most useful methods. Not
sure if we actually want that, or if we should just replace it entirely
with native methods.
2025-07-30 22:18:35 -04:00
Abe Jellinek
ee512680ac fx140: Rename esmify to migrate-fx140, add asyncify migration
See README.txt for run instructions.
2025-07-30 22:18:35 -04:00
Abe Jellinek
cd9f90da8d fx140: Add esmify script
This seems to produce decent output on many of our files, but it totally
misses some import statements. Not sure why that is yet.
2025-07-30 22:18:34 -04:00
Dan Stillman
163ed14f92 Add removed-files_linux-arm64 2025-07-30 22:18:34 -04:00
Dan Stillman
e6cd5f322f TEMP: Disable Linux updater
Since we haven't yet build an ARM64 updater
2025-07-30 22:18:34 -04:00
Dan Stillman
0f7590ad13 fx140: Comment out some lines that were failing
I didn't check to see which of these have just moved.
2025-07-30 22:18:34 -04:00
Dan Stillman
e715593eb7 fx140: browser-custom-element.js → browser-custom-element.mjs 2025-07-30 22:18:34 -04:00
Dan Stillman
fd4dde300d fx140: Remove obsolete AppConstants modifications 2025-07-30 22:18:29 -04:00
Dan Stillman
832575b7c0 Update build scripts for Linux ARM64
This doesn't include an ARM updater, so those lines in build.sh need to
be commented out for the build to succeed.

Addresses #3515
2025-07-30 22:15:31 -04:00
Tom Najdek
f5907ed3b2
Expose tag split option in item tags box (#5366) 2025-07-30 22:13:19 -04:00
Abe Jellinek
78534ff2d2 FileHandlers: Infer PDF pageIndex from annotation key
And:

- Update createAnnotation() test support function to create valid EPUB
  and snapshot annotations
- Add more FileHandlers tests
2025-07-30 11:37:52 -04:00
abaevbog
c3f8ba8eb1
Fix glitchy menupopups in dialogs opened from a context menu (#5409)
Opening a dialog window via a command from a menupopup leads to
unexpected glitches in the dialog's popups (e.g., collections menu
in newCollection dialog on macOS won't go away when you click away,
and on Windows, child collections don't appear when a parent is hovered).
This is due to some kind of race condition that arises when the dialog
appears when the popup is still closing.

This workaround captures command events from menupopups, closes the popup,
stops propagation of those events, and then dispatches a copy of
that event after a delay. This gives the popup enough time to close.

Fixes: #5408
Fixes: #4891
2025-07-30 01:56:11 -04:00
Abe Jellinek
735922a2bf
If custom file handler is set to Zotero itself, use reader (#5407) 2025-07-24 12:07:27 -04:00
Abe Jellinek
27affb9f14
Cache CSL Engine for item pane header (#5405)
Once styles are initialized.
2025-07-24 12:06:49 -04:00
Adomas Venčkauskas
11014be449 Server: Add support for UTF in server headers (RFC2047) 2025-07-24 13:26:23 +03:00
Dan Stillman
b31b71304d ZFS: Don't retry download for canceled redirect with mtime/hash match
This was a regression from the switch to `Zotero.HTTP.download()`. 302
wasn't a success code, so `HTTP.download()` would throw, and since the
status wasn't set correctly on the `XMLHttpRequest` within
`HTTP.UnexpectedStatusException`, it would think it was an interrupted
S3 connection and trigger another download after a delay.
2025-07-24 01:31:25 -04:00
Dan Stillman
a370ec8979 HTTP.download(): Don't save file for non-2xx response 2025-07-24 01:28:13 -04:00
Dan Stillman
cc0b1ad0c9 HTTP.request(): Return proper status for canceled redirect 2025-07-24 01:28:12 -04:00
Abe Jellinek
8041d7d4df Complain when Notifier/Prefs observer leaks window 2025-07-23 12:03:53 -04:00
Abe Jellinek
1eb248553a Unregister Zotero_Tabs observers when window is unloaded 2025-07-23 12:03:53 -04:00
Abe Jellinek
5e1541c5ee Extract activateZoteroPane(), try different activeness check
This should hopefully fix intermittent CI failures.
2025-07-23 11:23:36 -04:00
Abe Jellinek
d4a5fbbefe
Cache CiteProc Engine instances, pre-cache for Quick Copy (#5399) 2025-07-23 10:47:23 -04:00
Tom Najdek
cc691abeee
Add missing icons in context menus on Windows/Linux
* Add missing icon for "My Library" in the "Copy To" menu in cases where there are no other libraries in that menu
* Add icon to the "New Collection..." option in the item context menu
2025-07-23 12:56:06 +02:00
Dan Stillman
9b1950c9ea Clear HTTP.mock at end of ZFS tests 2025-07-22 22:12:52 -04:00
Dan Stillman
d1ea8a397b Use BrowserDownload for 403 when enforcing type in downloadFile()
Fixed regression (probably in 1f401f0897) causing Find Full Text not to
use BrowserDownload for a 403

https://forums.zotero.org/discussion/125581/zotero-suddenly-fails-to-retrieve-full-text-although-i-have-access
2025-07-22 22:12:00 -04:00
Tom Najdek
9698927d22
Fix unreadable tooltips in dark mode. Close #5397 2025-07-22 17:19:28 +02:00
Northword
e2a96e512a
Clear plugin cache on re-install (#5395) 2025-07-21 23:55:02 -04:00
Tom Najdek
2d4a086819
Fix picking a type for the creator removes the entry. Close #5396 2025-07-21 13:03:41 +02:00
SSCC
162fb4d51b
fix the missing "yield" in line 158 of storageEngine.js (#5394)
Fix the issue where Zotero.Sync.Runner.sync({background: true}) cannot obtain the itemIDs
2025-07-20 01:07:29 -04:00
windingwind
ce6c27ae7e
Fix tabs menu filtering out empty title (#5392) 2025-07-18 00:46:20 -04:00
Tom Najdek
9c82fed152
Add missing icons to the collections context menu (#5386)
Co-authored-by: yexingsha <yexingsha@gmail.com>
2025-07-16 12:18:58 +02:00
Tom Najdek
0e3b695a85
Use a more universal method of checking the element name 2025-07-15 19:25:41 +02:00
Tom Najdek
c945afb2e1
Fix auto-completion typo toLocaleLowerCase -> toLowerCase 2025-07-15 19:18:30 +02:00
Tom Najdek
248ddf05d2
Fix incorrect context menu when renaming collection #5374 2025-07-15 17:38:49 +02:00
Martynas Bagdonas
057c798202 Ignore reader and note-editor error when Fluent file is missing 2025-07-15 16:00:12 +03:00
Dan Stillman
59730c0fca Move "Show My Publications" localized string from .dtd to .ftl
Added to .dtd by mistake in #5367
2025-07-15 02:53:57 -04:00
Dan Stillman
dd10111e5d Close all tabs before item tags box tests to try to fix CI failures 2025-07-15 01:01:54 -04:00
Dan Stillman
42e21d4fa1 Disable citeproc-rs tests, which are failing after Chicago style update
Note sure why
2025-07-15 00:46:10 -04:00
Dan Stillman
01683b6ccb More chicago-note-bibliography → chicago-shortened-notes-bibliography 2025-07-15 00:46:10 -04:00
Dan Stillman
845361bdbc Update default Chicago style after upstream id changes 2025-07-15 00:46:10 -04:00
Dan Stillman
7a4aef1b32 Update styles and CSL locales
Including new Chicago styles
2025-07-15 00:46:09 -04:00
Tom Najdek
a85e1fb40a
Add ability to hide My Publications (#5367) 2025-07-15 00:31:22 -04:00
abaevbog
387d5966c3
fix trashed collection treated as an item row (#5371)
If the id of the collection happens to be the same
as an id of an existing item, those objects may end
up being used interchangeably in itemTree.
The trashed collection could appear in "My Library"
instead of the item, or the not-deleted item could appear
in the trash instead of the collection.
This is addressed by using .treeViewID instead of the
.id of the objects in ItemTree.refresh and ZoteroPane.itemSelected.
2025-07-15 00:30:28 -04:00
Tom Najdek
98d7d8c408
Re-implement "Create Parent Dialog" without using React (#5380)
* Fixed an issue where the window size did not match the content
* Replaced the semi-transparent progress bar with a spinner
* Fixed a problem that allowed triggering a search while one was already in progress
* Reduced code complexity
2025-07-15 00:29:54 -04:00
Abe Jellinek
3b8e8bea33 Register CookieSandbox observer at startup (#5357) 2025-07-14 14:00:43 -04:00
Abe Jellinek
aff57c2254 Fix all cookies being lost during remote translation (#5357) 2025-07-14 14:00:38 -04:00
Tom Najdek
b8e1b994e0
Add a missing icon for "Change Parent Item" #5373
Co-authored-by: yexingsha <yexingsha@gmail.com>
2025-07-14 17:07:53 +02:00
Tom Najdek
c32e050c6e Unify styles for headers of similar custom elements 2025-07-10 23:40:22 +02:00
Abe Jellinek
f9b3694dd1 Style Editor: Fix splitter
By removing flex from the preview box. The splitter doesn't work if the
elements on both sides have flexes.

Fixes #5361
2025-07-10 11:00:31 -04:00
Abe Jellinek
d9a45726d4 Fix read-only title box on non-file attachment
Regression in e625c0009e

https://forums.zotero.org/discussion/125214/attachment-title-of-web-links-cannot-be-modified
2025-07-07 13:24:46 -04:00
Tom Najdek
7beed24756
Fix truncated content in the Create Parent dialog. Close #5365 2025-07-01 15:00:33 +02:00
Martynas Bagdonas
114bd3c495 Increase reader initialization wait time to reduce test failures in CI 2025-06-30 22:29:08 +03:00
Martynas Bagdonas
bdcc5c551a Reader: Only show text context menu when interacting with a text box 2025-06-30 14:47:23 +03:00
Martynas Bagdonas
4808ebd2e9 Update reader submodule 2025-06-30 13:32:20 +03:00
Tom Najdek
c19032a004
Add missing tooltips for tab scroll buttons. Fix #5352 2025-06-30 12:14:16 +02:00
Martynas Bagdonas
9ba1580c3b Update note-editor submodule with Fluent support 2025-06-26 18:36:47 +03:00
Martynas Bagdonas
80d01c9d02 Add note-editor strings to FTL files 2025-06-26 17:46:52 +03:00
Martynas Bagdonas
355c61e6d8 Update reader submodule and support overriding FTL with current locale 2025-06-25 16:43:36 +03:00
abaevbog
4dbe0f7842
Citation dialog: fix broken item details popup with some non-english locales (#5354)
This allows the locator dropdown to be as wide as it wants
(depending on the longest option in the current locale),
with inputs occupying the remaining space. This is
a more flexible layout that avoids broken UI in
cases if <select> dropdown tries to become too wide
while <input>s occupy a fixed space to remain aligned.

Fixes: #5350
2025-06-25 02:17:41 -04:00
Martynas Bagdonas
774173f04d Update reader submodule and provide FTL data 2025-06-24 21:48:55 +03:00
Martynas Bagdonas
37f8c4d4f4 Fix strings for annotation deletion prompt
Fixes https://forums.zotero.org/discussion/124901/confirm-message-for-deleting-multiple-annotations-in-the-reader
2025-06-24 21:02:30 +03:00
windingwind
6eb8a80e12
Fix reader sidenav buttons wrongly disabled (#5348)
fix: #5332
2025-06-20 23:32:30 -04:00
Martynas Bagdonas
0b5012555d Fix regression triggering multiple reader context menus
Fixes https://forums.zotero.org/discussion/124939/persistent-context-menu-in-the-snapshot-reader
Fixes https://forums.zotero.org/discussion/124938/double-context-menus-on-annotations-in-the-pdf-reader
2025-06-19 21:11:03 +03:00
Adomas Venčkauskas
0acfcd3f99 Update LibreOffice submodule 2025-06-19 11:39:51 +03:00
windingwind
50cafe57a2
Fix linux menu checkmark icon overlap (#5343)
Fix linux menu checkmark icon overlap

fix: #5340
2025-06-19 10:57:53 +03:00
Tom Najdek
57bc913304
Fix tag swatches regressions. Resolve #5322
Fixes missing tag swatches borders, a regression due to a change of the
default values for the `focus-states` mixin in #4961 (61b62d0).

Also introduces opaque tag colors so that tag swatches are not
semi-transparent.
2025-06-17 15:09:55 +02:00
Bogdan Abaev
e6ce021b5f return tags in /connector/getSelectedCollection
Together with all collections and libraries.

To account for tags that may contain "," characters,
expect connector to send tags as an array. If tags
are sent as a string, it will be split by "," for
compatibility with older connector versions.

Addresses: #1706
2025-06-16 09:34:33 +03:00
Dan Stillman
408f1274f4 Select library tab before item tags box tests 2025-06-12 09:45:27 -04:00
Bogdan Abaev
f50e8b0b35 do not open hidden Zotero window on connector save
And fix regression where selecting a collection
in connector would always switch to the library tab.
It was originally added in https://github.com/zotero/zotero/pull/5020
but was lost after https://github.com/zotero/zotero/pull/5148.
2025-06-12 08:33:22 +03:00
Dan Stillman
1c469ce1a0 Remove duplicate general-back string from 3f84856e1 2025-06-11 22:59:33 -04:00
Dan Stillman
9dbac93dc9 Remove lines inadvertently included in ee35361
I meant to merge the test without those lines, since I fixed the problem
from #5297 properly in ded8dca66.

Fixes #5337
2025-06-11 21:57:59 -04:00
abaevbog
96d3f312b3
fix web link attachment row not selected on create (#5338)
Small followup to tweak 5721744386
2025-06-11 21:50:03 -04:00
Martynas Bagdonas
195629186b Update reader submodule and complete migration to Fluent localization 2025-06-11 22:48:49 +03:00
Martynas Bagdonas
3f84856e1e Update strings for reader localization with Fluent 2025-06-11 22:29:22 +03:00
abaevbog
c493a17b13
Connector server support to adding a note (#5064)
* support adding a note from connector

- pass canUserAddNote flag in ping response to tell
the connector that it should display a note field
- when the connector sends a note, create a child note item
if it does not yet exist and set its content. If the
child item for user-added notes is already created,
update it
- if the connector sends an empty note, user-added child
note item is deleted
- record child notes added by the user in _userAddedNotes
cache to distinguish between user added notes and
notes added by the connector automatically
- if the target library changes, child note items are
moved to the new library as well. _userAddedNotes
will be updated to reflect new itemIDs
- if there are multiple toplevel items being added,
the note is added to all of them

Also fix breakage when switching between collections
from different libraries. Fixes: #5331
2025-06-11 14:50:48 +03:00
Tom Najdek
e50787c94f
File renaming: Add pascal case. Fix unicode handling. (#4876) 2025-06-11 01:03:34 -04:00
Dan Stillman
15269763bb Don't use Firefox user agent for files.zotero.net requests 2025-06-11 00:47:28 -04:00
Dan Stillman
b05ddaf32b Fix escaping in rpl command 2025-06-11 00:46:04 -04:00
Dan Stillman
4f7f9ae75b Update reader submodule 2025-06-11 00:46:04 -04:00
Bogdan Abaev
65bc56b07b dont exclude image annotations when creating notes
from multiple selected items.
Regression from 48fd23ccec
2025-06-10 22:22:33 +03:00
Dan Stillman
7a74384b42 Update locales from Transifex and merge new English strings 2025-06-10 11:06:42 -04:00
Adomas Venčkauskas
27648bd73a Update LibreOffice and Word for Windows submodule 2025-06-09 12:23:42 +03:00
Dan Stillman
28ffdd4c10 Update CSL locales 2025-06-08 00:32:49 -04:00
Abe Jellinek
777d6f951f
Undo Scholaread changes to user.js (#5313)
And any other fileHandler changes
2025-06-08 00:30:10 -04:00
Martynas Bagdonas
8cf61fed9e Add spell checking options to reader annotation text box context menu
Fixes #5308, #2838, #2109
2025-06-06 18:40:40 +03:00
abaevbog
6ff349d65d
Select child attachment after a file is drag-dropped onto a top-level item (#5328)
And also handle attachments added via context menu

Fixes: zotero#5320
2025-06-05 02:20:13 -04:00
windingwind
51a62022e9
Improve tabs menu keyboard handle (#5319)
Use space to close tab if the close button is active
Focus next close button after closing tab with keyboard
2025-06-05 02:11:53 -04:00
Dan Stillman
0b7340a651 Update reader submodule 2025-06-05 01:58:58 -04:00
Abe Jellinek
110d04f5f7 Add localization for Focus Mode string 2025-06-04 12:01:06 -04:00
Tom Najdek
ee35361608 Test for subsequent updates providing stale changed object data
From #5297
2025-05-31 02:20:32 -04:00
Dan Stillman
ded8dca668 Properly clear previousData on save for primary data and item fields
Closes #5297
2025-05-31 02:18:07 -04:00
Dan Stillman
05a2539b81 Don't corrupt DataObject#_relations while saving
The predicate name used as an object key was being converted to an id,
so if relations weren't reloaded properly, they would be broken after a
save.

Discovered while working on #5297
2025-05-31 02:16:05 -04:00
abaevbog
1f8e05bfd8
Fix new annotation changing the scroll position in itemTree (#5309)
Extend scrollToRow in windowed-list.js to allow to
scroll the specified row to the top of the window
even if it is located below the current scroll window.
With this, when scroll position is restored in itemTree,
the same row remains at the top.

Fixes: #5233
2025-05-30 01:31:11 -04:00
windingwind
cdcac8a6e1
Fix sidenav drop indicator position (#5304)
regression after #5263
2025-05-30 00:59:08 -04:00
Abe Jellinek
769b4c8c34
Fixes for tags-box regressions (#4951)
* Show "Remove All Tags..." when right-clicking textbox

* Fix pasting multiple tags adding concatenated tag

* Remove unnecessary check

* Fix tag count changing when unsaved tag is removed
2025-05-30 00:56:56 -04:00
windingwind
3b151a0b18
Fix inconsistent collapsed sidenav state (#5311)
fix: #5276
2025-05-30 00:51:10 -04:00
Adomas Venčkauskas
9d04392eb0 Add a read-only library param to /connector/getSelectedCollection
Part of zotero/zotero-connectors#546
2025-05-26 13:41:07 +03:00
Abe Jellinek
3ff13bc08d Info box: Fix second right-click opening section menu
On Windows, after right-clicking on a title field.

this.querySelector('popupset') matched the popupset in the
collapsible-section head, not our own.

Fixes #5294
2025-05-21 12:12:31 -04:00
abaevbog
46f80ebdfb
Citation Dialog: more optimization of initial loading (#5296)
* citation dialog: interactive before io.getFields

- added io.allCitedDataLoadedPromise, which is resolved
when both io.fieldIndexPromise and io.citationsByItemIDPromise
are resolved. Resolved io.allCitedDataLoadedPromise essentially
means that calls to io.sort() and io.getItems()
will be fast because all necessary data is already loaded.
- citation dialog uses io.allCitedDataLoadedPromise to
not await for functions relying on io.sort() and io.getItems()
before the data is loaded, as it could take an arbitrary
amoung of time. Speicifcally, SearchHandler._getCitedItems() and
CitationDataManager.sort. As soon as allCitedDataLoadedPromise
is resolved, cited items will be sorted.
This means that when retrieving fields takes a long time, one can
still add new items, their bubbles will just not immediately
be sorted.
- this replaces earlier SearchHandler.loadCitedItemsPromise, which
was a special case of this handling.
- added a new test ensuring that bubbles can be added even
when io.allCitedDataLoadedPromise is not resolved yet
- cleanup for buildCitation function to remove handling
of io.citation.sortedItems, which is always empty on
load before io.sort() runs
- added a few Zotero.debug statements for future debugging
- Uses a dummy promise if no allCitedDataLoadedPromise 
(e.g. to accomodate the note editor)
2025-05-21 09:55:41 +03:00
Bogdan Abaev
dfc31d9961 citation dlg: data structure refactor, bug fixes
- replace objects with zoteroItem, citationItem, etc.
as the main representation of an entry in the citation
(CitationDataManager.items) with instances of a new BubbleItem class.
BubbleItem has two static methods to create
a new instance: BubbleItem.fromCitationItem() used
to create entries from io.citation.citationItem on load,
and BubbleItem.fromItem used to create entries from
Zotero.Item when a new item is being added into the citation.
BubbleItem.getCitationItem will return a citationItem
in a format that citeproc consumes. This streamlines
the flow of data, makes it easier to manage and avoids
unnecessary conversions between citationItem and Zotero.Item.
- This refactoring fixes the issue of added suffix/prefix
sticking to an item and persisting even if the bubble
is removed and re-added. Fixes: #5282
- add csl data to virtual item in io.customGetItem
to remain consistent with Zotero.Integration.Citation.loadItemData.
That way, csl data is always found on Zotero.Item
and we don't have to check citationItems.

Also:
- apply deduplication to cited items, so that a cited
item from the library that appears in selected or
opened section does not have a duplicate entry in
the cited section.
- added initial test suite for citation dialog
2025-05-19 09:24:01 +03:00
windingwind
086b0c3d84
Allow plugin to uninstall itself in update manifest (#5292)
Use `uninstall: true` in `update_url` JSON `updates` that is valid
for the installed plugin to uninstall the plugin the next time it
checks for updates
2025-05-16 06:10:45 -04:00
windingwind
e18bf2165a
Fix locate button for annotation item (#5298) 2025-05-16 06:05:02 -04:00
Tom Najdek
b0506aafe1
Unhide "title" column on "Restore Column Order" (#5299)
This actually checks for a "primary" column, so if an extension hides the "title" column but provides its own "primary" column, the "title" column remains hidden.
2025-05-15 07:48:25 -04:00
Dan Stillman
2bc0c4861c Fix changed object data not being passed in notifier extraData
Which I apparently broke a decade ago in afe0412c5

And add support for 'deleted' and 'tags', which now use a different
mechanism
2025-05-12 23:36:58 -04:00
Tom Najdek
ed24cce4a1
Fix custom trash header persisting after items are restored or deleted. Fixes #5279.
This was due to a logic bug in `getCurrentPane()`, which returned the wrong pane, causing the incorrect one to be updated.
2025-05-12 17:28:11 +02:00
abaevbog
1eacc8bbdf
Citation dialog: updated Enter handling in panels (#5281)
Unhandled Enter keypress from inside of a panel will now close it.
Enter on "Omit Author" checkbox or on the inactive locator
label dropdown will close the item details popup.
Enter on "Keep sources sorted" checkbox of settings
popup will close it for consistency.

Fixes: #5277
2025-05-10 00:29:44 -04:00
Abe Jellinek
9ed3f6363c Add test for synchronous Zotero.done() call
No one should do this nowadays, but EM still does.

zotero/translate@c858ce9613
2025-05-09 14:42:06 -04:00
Abe Jellinek
420b84d17e Update translate submodule 2025-05-09 14:25:48 -04:00
Abe Jellinek
51649b0045 Update reader submodule 2025-05-09 10:38:54 -04:00
Abe Jellinek
e54665cf49 ReaderTab constructor: Assign _contextPaneOpen from correct option 2025-05-09 10:38:45 -04:00
Abe Jellinek
1b61be71b9 isPaneCollapsed(): Use correct check
We don't know if collapsibleParent is non-null, but we already know that
its previous sibling is the splitter if it is.
2025-05-09 10:36:26 -04:00
abaevbog
e625c0009e
Fixes to annotation row behavior in trash (#5266)
- right-click on annotation rows in trash will display
  "Delete Permanently" option, instead of an empty menu
- in trash and other non-editable collection rows, disable
  "Add Note from Annotations" button in itemPane header
- remove ability to add tags to annotations and other
  items by dragging them into tag selector from trash
- remove ability to add items to collections by
  dragging them into collection tree from trash
- fix attachment row being removed from trash if
  its child annotation row is erased

Also:
- fix contextPane in reader tab being editable for item in trash
- fix title being editable in attachmentBox for item in trash

Fixes: #5261
2025-05-09 02:05:53 -04:00
Dan Stillman
f539d7439d Fix test failure after #5263 2025-05-09 01:52:26 -04:00
Dan Stillman
c1cea87743 Disable advanced search test
Completely, not just in CI, since it's failing for me locally
2025-05-09 01:41:05 -04:00
Abe Jellinek
3102b6b67a
Always show item/context pane toggle (#5263) 2025-05-09 01:27:20 -04:00
Abe Jellinek
c42e144f56
Make XULElementBase into a mixin to reduce code duplication (#5270) 2025-05-09 01:00:43 -04:00
windingwind
0b339a3a30 Fix attachmentsBox#_handleAddPopupShowing
Fix rebase regression after 0b8b4c0
2025-05-08 22:38:42 +02:00
windingwind
32009ccdb6
Fix annotation item pane title word cutoff (#5271) 2025-05-08 16:36:38 -04:00
Abe Jellinek
143829065f SequoiaContextMenuChild: Remove unused field 2025-05-07 10:19:49 -04:00
Tom Najdek
6eafb89e82
Import Wizard: Fix focus loss on options page
Also resolves an issue preventing the wizard from continuing when pressing the Enter key on this screen.
2025-05-07 13:52:52 +02:00
abaevbog
971c57fedd
Disable itemTree row drop between child rows (#5258)
Fixes: #5257
2025-05-07 02:00:22 -04:00
Dan Stillman
f8a517d286 Force "Show Tabs Menu" menu item to update with shortcut key at startup 2025-05-07 01:52:54 -04:00
windingwind
61b62d0a02 Improve tabs menu (#4961) 2025-05-07 01:52:54 -04:00
Abe Jellinek
c6e5e6c1e6 Revert "Show item pane toggle everywhere"
Mistaken push.

This reverts commit 4b5bee37b1.
2025-05-06 12:15:19 -04:00
Abe Jellinek
4b5bee37b1 Show item pane toggle everywhere 2025-05-06 12:05:31 -04:00
Tom Najdek
55423024ea Revert "Tweak column behaviour on visibility and order changes" (#5254)
This reverts commit 997ba12626.
2025-05-05 23:39:53 -04:00
Tom Najdek
de0907c8f7 Fix issues with flexbox width calculations (#5254)
Issues caused by differing padding values between the header cell and the table body cell
2025-05-05 23:39:53 -04:00
Tom Najdek
af6e4cc44c Adjust column resizing logic to account for extra width in the first column (#5254)
Fixes #5198
2025-05-05 23:39:53 -04:00
abaevbog
54763ff722
improve performance of annotation rows removal (#5259)
Do not update itemTree selection on each annotation row
removal when an attachment row is collapsed.
It causes a significant delay when attachment with
many annotations is collapsed if selection is on any
row below the attachment. It is also redundant because
the selection is updated at the end of _closeContainer anyway.

Fixes: #5255
2025-05-05 23:23:59 -04:00
Tom Najdek
31845457a2
Fix creator type dropmarker color in dark mode 2025-05-04 15:51:28 +02:00
Abe Jellinek
03b33d995e Reorder _openTagsPopup() to clarify logic
And only remove the keydown listener when the top-level popup hides.
2025-05-03 01:38:18 -04:00
Abe Jellinek
68aff7b23e Hide leftover popups when switching tabs (#5251) 2025-05-03 01:38:18 -04:00
abaevbog
22996da722
open annotation in new window on Shift+Enter (#5253)
Per https://forums.zotero.org/discussion/123944/shift-enter-to-open-the-annotations-in-separate-windows-of-the-reader
2025-05-03 01:35:46 -04:00
abaevbog
929bacaac7
Fix unintentional title transfer between attachments on item switch (#5245)
Also added similar test for item details table

Fixes #5244
2025-05-03 01:34:06 -04:00
abaevbog
3fc8e4d02e
Fix leftover annotation rows and disappearing attachment rows after drag-drop (#5248)
- collapse all rows before removing them. It makes
  sure that annotation rows will be cleaned up properly
  when an attachment row is moved into another parent.
- refactor conditionals to handle changes of parent
  regardless of whether the item is a container
  (attachment with annotations) or not (a note).
- added tests for itemTree's handling of changing the
  parent of attachments and notes, as well as ensuring
  there are no leftover annotation rows in Unfiled Items.

Fixes: zotero#5246
2025-05-03 01:30:50 -04:00
Dan Stillman
a7964f7116 Fix duplicate attachment row after retrieving metadata
https://forums.zotero.org/discussion/123939/double-pdf-file-after-doing-a-retrieve-metadata-operation-on-a-standalone-pdf-file

Regression from 48fd23ccec
2025-05-01 02:48:42 -04:00
Adomas Venčkauskas
d9b9046201 Fix Google Docs allowing to select note style (endnotes)
Report: https://forums.zotero.org/discussion/123928/zotero-citations-not-appearing-as-endnotes-despite-selected-setting
2025-04-30 16:47:25 +03:00
Martynas Bagdonas
36d979f71e Update build scripts for note-editor, pdf-worker, and reader:
- Finalize renaming of pdf-reader to reader
- Remove client- prefixes from URL paths
- Update pdf-worker to use the new document-worker path in preparation for repository rename #5052
- Ensure note-editor properly uses the ZIP build instead of silently falling back to a local rebuild
- Log errors to console
2025-04-30 13:46:32 +03:00
Dan Stillman
d7d1d03b8b Update reader submodule 2025-04-30 01:51:15 -04:00
Abe Jellinek
230e3d8065
Skip invalid relative path when changing LABD (#5239) 2025-04-30 01:06:40 -04:00
abaevbog
4521f750a4
ItemTree annotations: miscellaneous fixes (#5232)
- disable context menu on collapsible-sections of annotations in `itemPane`
- fix `arrowRight`/`arrowLeft` being able to expand/collapse annotation sections when they are focused
- set proper aria-label and aria-description on annotation cards
- fix misaligned annotation icons

Fixes: #5231
Fixes: #5234
Fixes: #5240
2025-04-30 00:54:45 -04:00
windingwind
bd9735baf3
Fix v-table selector dataKey escape (#5238)
Regression after 0b8b4c0
Fix https://forums.zotero.org/discussion/123877
DataKey from custom columns may include unexpected chars
2025-04-29 09:32:33 -04:00
Abe Jellinek
54006b7c8c
Make hidden readers inactive, firing visibilitychange (#5225) 2025-04-28 04:16:16 -04:00
Dan Stillman
70af1165a5 Update reader submodule 2025-04-28 04:12:32 -04:00
abaevbog
48fd23ccec
annotations showing in itemTree (#3416)
- Annotations are displayed in itemTree under their file attachments
  on a third level. The annotation spans the entire row.
- The title is constructed on the go. When possible, it
  includes annotation quote and comment as pseudo-columns
  of the row. The comment occupies about twice as much space as
  the quote. Otherwise, (if there is no quote) only the annotation
  comment
  is included as the "title" part of the row
- Non-CJK segments of the quote part of the annotation row are
  italicized. CJK segments are left as is. If CJK segments are present,
  there is more padding between quote and comment parts.
- Search matches the actual attachment instead of its parent file.
- Can create child notes from annotations of the same item or
  standalone notes from annotations across different items from
  the context menu or the header button.
- When an annotation (or multiple annotations) are selected, the
  annotationItemPane component is displayed where annotations are
  grouped by their top-level item. Annotations are displayed fully,
  without having their content cut off.
- Special treatment for annotations to always prompt
  to erase the item regardless of what collectionTree row
  is selected (e.g., if a collection is selected, we
  still want one to be able to delete the annotation).
  This only applies if all selected items are annotations.
  If multiple items are selected, some annotations and
  some not, do nothing. This is until the trash is
  ready. In the future, we may send annotations to trash
- strip all HTML tags from annotation for now, until the logic to
  properly render annotation markup is copied over from the reader
  (applies to both annotation-row component and the annotation
  item rendered in the itemTree)
- Added a generalized "expandToItem" function to itemTree to
  expand all ancestors of a given item, similar to "expandToCollection"
  from collectionTree
- add annotation conditions to advanced search
- show [Image not available] if no annotation file for ink or image
  annotations
- only keep annotation-specific context menu options when some
  annotations are selected in itemTree
- enable Quick Copy of annotations from itemTree via drag-drop,
  shortcut key, or Edit → Copy Annotation
- Minor refactoring of Zotero.Annotation.toJSON() to pull out async code
  that handles ink and image annotations, so that
  Zotero.Annotation.toJSONsync() for highlight, underline, and note
  annotations does not have to be awaited. Since ink and image
  annotation don't seem to work for drag-drop Quick Copy, they are just
  skipped for now.
2025-04-28 04:10:28 -04:00
Dan Stillman
3144314d20 Use parent app CFBundleIdentifier as prefix for Safari extension
Instead of org.zotero.SafariExtensionApp.

I don't know if this will help with spurious signature failures, but it
can't hurt.
2025-04-24 02:15:17 -04:00
windingwind
a63cb647ff
Fix item pane test after #5214 (#5220) 2025-04-23 17:09:24 -04:00
Abe Jellinek
d74db17cf1
Select Items dialog: Fix scrollbars and padding, add title (#5213) 2025-04-22 23:37:38 -04:00
windingwind
97f8d942a0
Keep item pane scroll position after refresh (#5214) 2025-04-22 23:35:30 -04:00
Abe Jellinek
56b4c15de9 Scaffold: Don't warn about \u2028/\u2029 in tests 2025-04-22 15:06:29 -04:00
Abe Jellinek
e80615eab8 Scaffold: Don't show deleted line for base-mapped title field
And remove dead code.
2025-04-22 12:23:31 -04:00
Adomas Venčkauskas
1655265189 Add a Connector version update warning for item saving changes (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
f2a86e4af9 Rename attachments imported from stream (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
cc87ff3af6 Remove old and unused Connector Server endpoints (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
2cd4ba205a Update Connector Server tests (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
69dcbda1a0 Misc test fixes (#5148)
Remove redundant and wrong call to changeCollectionTreeRow() in
advancedSearch which triggers test errors sometimes, and disable prompt
button delay when running tests everywhere, not just CI
2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
9579aa154a Do not return recognizer promises early (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
d6d01f66b9 Update recognizer tests to use sinon stub pattern (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
5b1ed9ac8b Save session library switching with filesEditable support (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
5e18337cc6 Simple attachment saving via Connector (instead of Zotero) (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
d781151b9a Make server.js use mozilla httpd and support application/octet-stream (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
6d206f98bb Remove old Z4-fx connector switching code (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
67b5a0bb19 Use the bundled mozilla httpd (#5148) 2025-04-22 09:47:58 -04:00
Adomas Venčkauskas
db1c542a50 Remove unused connector server code (#5148) 2025-04-22 09:47:58 -04:00
abaevbog
e690b0b18e
Expand collectionTree containers on dragover (#5024)
- when something is dragged over a collapsed collection
or group, it will be expanded to reveal children
so one could drop the dragged item/collection/ into them
- when drag is over, the expanded collections will
collapse, except for the ancestors of the newly selected
collection
- trigger collapse of expanded collections on dragend
on the entire document (in case dragend happens not over
the collection tree), or from onDrop handler, from where
we will wait for selection to change before collapsing
rows

Fixes: #4952
2025-04-22 00:17:56 -04:00
Abe Jellinek
1c089bf448 Fix broken spellchecking when only en-US is installed
Regression in 26221b6786
2025-04-21 10:51:28 -04:00
abaevbog
dc084b6961
Move note-editor popup a11y strings to Fluent (#5212)
Per https://github.com/zotero/zotero/pull/5205#issuecomment-2809055908
2025-04-18 00:14:26 -04:00
Abe Jellinek
a7778b93e8 Tags box: Disable Remove All Tags when not editable 2025-04-16 10:29:40 -04:00
Abe Jellinek
b067e0d940 Scaffold: Add tags to item preview 2025-04-16 10:29:40 -04:00
abaevbog
173660d5c7
add string for note-editor a11y link popup message (#5205)
String read out by screen readers when the link popup
appears instructing users to navigate it.

Addresses: #5199
2025-04-16 02:42:42 -04:00
abaevbog
1459ca210d
new collection dlg: fix menu keyboard nav on win (#5208)
Fixed non-working selection of collections in the
dropdown via keyboard on Windows.

Fixes: #5202
2025-04-16 01:57:13 -04:00
abaevbog
f568363098
a11y: clear aria-expanded on empty itemTree rows (#5201)
Per https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-expanded#treeitems
only treeitems that contain children should have
the aria-expanded attribute. This is instead of having
aria-expanded="false" on empty regular items or standalone
attachments, which erroneously indicates to screen readers
that the row has children but is collapsed.

Fixes: #5200
2025-04-16 01:53:54 -04:00
windingwind
0bff70b186
Fix item pane blank (#5207)
This is caused by the persisted splitter state value to be blank from either older versions of client or plugins.
Resetting the empty values fixes this bug.
2025-04-16 01:53:03 -04:00
Abe Jellinek
246005a097
Accept length-7 sortIndexes for snapshots (#5209) 2025-04-16 01:52:09 -04:00
Abe Jellinek
2db51eb0e5 Scaffold: Don't collapse item preview sections
Fixes sections disappearing when collapsed in the main window's item
pane.
2025-04-15 13:01:01 -05:00
Abe Jellinek
71a4742092 Scaffold: Fix code completion not working until pref changes 2025-04-14 11:21:30 -06:00
Dan Stillman
8c7ab1eb6a Remove unnecessary DB resets in storageLocal tests 2025-04-14 04:22:16 -04:00
Dan Stillman
f616d41546 Mark locally missing files marked for upload for download instead
Z7 removed an `OS.File.open()` in `_checkForUpdatedFiles()` that would
throw on missing files and cause them to be marked for download in a
`catch`.

This likely caused the fix for #1753 not to work in Z7.
2025-04-14 04:22:16 -04:00
abaevbog
060a15fe78
Do not switch to library tab while changing target collection in connector (#5020)
Do not switch to library tab while changing target
collection in connector.

Deprecate inLibraryRoot as an independent boolean
param in ZoteroPane.selectItems to instead have
a composite options param { inLibraryRoot, noTabSwitch }

Fixes: #4262
2025-04-10 07:27:20 -04:00
Tom Najdek
cef26fae09
Tweak column behaviour on visibility and order changes (#5162) 2025-04-10 06:23:09 -04:00
Martynas Bagdonas
1116be4a02 Fix PDF worker not loading CMap files 2025-04-09 18:53:41 +03:00
Dan Stillman
e480c78898 Update locales from Transifex 2025-04-09 02:00:53 -04:00
Dan Stillman
ba3cd9e094 Update builds to 128.9.0esr 2025-04-09 01:57:13 -04:00
abaevbog
3d1cf90934
runJS: better message if nothing is returned (#5181)
Display "===>undefined<=== (completed successfully)" instead
of current "===>undefined<=== (undefined)", which is a bit misleading.

Fixes: #5180
2025-04-09 01:31:22 -04:00
Abe Jellinek
650be7d350
Scaffold code completion (#5171) 2025-04-09 00:36:22 -04:00
windingwind
a4db5c9bd2
Fix can't move second-to-last item pane section down (#5187) 2025-04-09 00:34:05 -04:00
abaevbog
4fc7730181
Citation dialog: stricter cleanup of search value (#5185)
* citation dlg: cleaner search value

Additional cleanup of the search value to not include
some punctuation ("(),.;:"), localized "and",
ampersand, and localized "et al". That way, if one
copies a citation like "(Smith et al., 2020)" and pastes it into the
citation dialog, it is more likely that appropriate search
results will appear.

Fixes: #1864

* handle citations with locators

Clean the input before fetching the locator so that
if one copies and pastes (Smith et al., 2025, p. 15),
the locator is still correctly extracted.
2025-04-08 23:56:20 -04:00
abaevbog
b0b9442c95
load all tabs items' data when restoring tab state (#5193)
This fixes the breakage in tabs menu on initial load
if one of the tab is for an item from not-loaded group.
Now, every component relying on tab items (e.g. tabs menu)
can just assume that items are all loaded.

Fixes: #5192
2025-04-08 22:42:56 -04:00
Abe Jellinek
f279e9f33b
Use normal text color for selected context row (#5197) 2025-04-08 22:41:16 -04:00
abaevbog
c6688ba9d4
include mru types in main list of "New Item" menu (#5195)
Per https://forums.zotero.org/discussion/123269/bad-practice-in-new-item-drop-down-menu
2025-04-08 22:40:07 -04:00
Tom Najdek
db90eb9103
Fix misaligned attachment row delete button #5189 2025-04-07 13:03:00 +02:00
Abe Jellinek
c400d11c5c Remove dragstart listener from attachment row on destroy
Follow-up to e6f1983073
2025-04-04 12:36:53 -04:00
Abe Jellinek
e6f1983073
Make item pane attachments/notes/related item rows draggable (#5184) 2025-04-04 12:27:02 -04:00
abaevbog
3d538d71ca
citation dlg: search by identifier (#5182)
- if the search string looks like a DOI or ISBN, use
it as a search condition. https://forums.zotero.org/discussion/comment/489309/#Comment_489309
- have library use "All Fields & Tags" search mode.
Followup to zotero@b78bf8e
2025-04-04 00:27:46 -04:00
windingwind
0b8b4c0ff6
Draggable item pane sections (#5094) 2025-04-03 21:32:37 -04:00
Tom Najdek
fcfb6e16d0
Reword the confusing example in the #generateHTMLFromTemplate() test 2025-04-02 14:01:52 +02:00
Abe Jellinek
c59c1f7e7c
Windows: Reduce input style specificity to fix directory fields (#5112) 2025-04-02 05:33:26 -04:00
Tom Najdek
4f03c5d360
File renaming: add support for counting creators (#5175)
Also extends the templating engine to support inequality comparisons.
2025-04-02 05:31:50 -04:00
abaevbog
a8d32291a4
itemBox: fix overlapping rows on initial load (#5176)
On initial load, the grippy does not immediately
appear because it needs to be loaded. This means that
when itemBox is rendered for the first time, the grippy
has a width of 0, which later becomes 18px. If the
itemPane is narrow, it may push the columns out
and lead to text of value components wrapping
without the rows getting stretched.

This sets explicit width to the grippy to avoid such behavior.

Fixes: zotero#5166
2025-04-02 05:27:47 -04:00
abaevbog
f1244d824c
Remove old citation dialogs (#5177)
- removed quickFormat, insertNoteDialog, and addCitationDialog
.xhtml and .js files, since all of them are now replaced
with new citationDialog
- removed quickFormat and insertNote strings from
en-US localization files
- replaced all mentions of quickFormat in comments and
variables of integration.js and editorInstance.js with
citationDialog
- removed big-sur-specific styling for quickFormat

Closes #5046
2025-04-02 05:26:06 -04:00
abaevbog
b8ec6eb75e
transform menu: preserve cases in capitalize title (#5174)
Do not lowercase the entire title before capitalizing
the first letter of each word to preserve abbreviations
or spelling of unusual words (e.g. 3D or iPhone).

Fixes: #5165
2025-04-01 01:25:34 -04:00
Dan Stillman
2bff0ea93f Update reader submodule 2025-03-27 23:27:09 -04:00
Tom Najdek
3a536c647b
Add ability to delete attachment from item pane (#5133)
Also:

- Introduce a mixin for a toolbar button that appears on hover or focus
- Unifies the border radius of such buttons, which was previously different for the "Libraries and Collections" toolbar button.
2025-03-27 23:25:52 -04:00
Dan Stillman
d5d24f5d9d Update utilities submodule 2025-03-27 23:10:05 -04:00
Abe Jellinek
8eda90cdc0
Scaffold: Add item pane-like preview of translated items (#5079) 2025-03-27 23:02:31 -04:00
Abe Jellinek
5a5f2c2e59 FileHandlers: Fix unintended fallthrough in switch
May have been responsible for this:
https://forums.zotero.org/discussion/comment/483004#Comment_483004
2025-03-27 10:32:12 -04:00
abaevbog
929147b33a
citation dlg: miscellaneous followup fixes (#5095)
- last-closed -> last-used for citationDialogMode pref value
- pref label citationDialogLastClosedMode -> citationDialogLastUsedMode
- update Zotero.Prefs version. While migrating, if
integration.useClassicAddCitationDialog is true, set
integration.citationDialogLastUsedMode to 'library'
so the citation dialog opens in library mode on the first run.
If citationDialogLastClosedMode pref exists, it is
migrated to citationDialogLastUsedMode and cleared
- redone logic of extracting the locator to allow for better
detection of locators and to not rely on long regular
expressions that are hard to troubleshoot. Added tests for it.

These are the new rules for extracting locators:
- locator value can be either a set of numbers potentially
with some punctuation in between OR text surrounded with
single or double quotes
- locator labels can be typed in any of 3 formats:
full (chapter), short (chap.), or short with no
punctuation (chap)
- locator labels go before the locator values and there
may or may not be a space in between. For example,
chap.10 is the same as chap. 10.

Fixes: #5092
Fixes: #5093
2025-03-27 03:45:31 -04:00
Abe Jellinek
d9e8ea8ff7
Let creator autocomplete popup fill row width (#5141) 2025-03-27 03:11:00 -04:00
abaevbog
4421de63de
citation dlg: fix unloaded items errors (#5163)
- get opened items asynchronously and load their data
in case if there are items opened across multiple
libraries, and some of them are unloaded.
This fixes #5161, which makes the dialog unresponsive
upon initial load.
- enfore io.filterLibraryIDs in library mode, the same
way it already is being applies in list mode. This
is currently used to only show items from the current
library when adding citations in a note.
- account for the change above in collectionTree to
by focusing the first library from io.filterLibraryIDs,
if those are present, and only default to userLibraryID
if io.filterLibraryIDs is empty.
2025-03-27 03:05:46 -04:00
abaevbog
a366f16346
citation dialog: remove cited item placeholder in library mode (#5152)
Keep the placeholder node to retain the positioning
of the text consistent but remove the border
so the item card is invisible.

Also: remove spinner

Fixes: #5151
2025-03-27 03:03:03 -04:00
abaevbog
b3a3757716
Citation dialog: fixed errors thrown if you type in itemTree (#5143)
- pass ref to itemsView.changeCollectionTreeRow
to avoid errors thrown when typing numbers (related to
tags shortcuts)
- return string equivalents of true/false in getExtraField.
virtualized-table expects a string in its typing handler.
Previously returned boolean was causing an error.
2025-03-26 01:56:42 -04:00
abaevbog
314bd08c03
citation dlg: localized "Add to Citation" label (#5150)
Fixes: #5146
2025-03-26 01:35:37 -04:00
Tom Najdek
8ec81da1d9
Improve attachment column progress meter (#5156)
* Better styling for file download progress meter #5144

* Fix download progress meters not removed on completion #5145
2025-03-25 00:10:35 -04:00
abaevbog
951ed4fa4b
citation dlg: fix menubar missing on first open (#5154)
Do not wait for the itemTree to add the menubar but
create it immediately and just initialize it when
itemTree is ready.

Fixes: #5153
2025-03-25 00:06:49 -04:00
abaevbog
cf37bf5ce1
citation dlg: no input refocus on Enter from popup (#5159)
Remove refocusing of the input on Enter from item details
popup - just let focus go back to the bubble.
Input refocusing was initially added with the idea that once
you make some edits and confirm them with Enter,
you are ready to go back to typing in the search input.
But then, Enter on Done or Cancel is treated as equivalent
to click, so the focus goes back to the bubble. When
the dialog is cancelled via Escape, focus lands
on the bubble as well, in case you need to keep going to
locate the another item to customize.

This different focus behavior on Enter is indeed a bit
inconsistent and likely no longer needed, now that
you can always refocus input with Cmd/Ctrl+F.

https://forums.zotero.org/discussion/122823/some-advice-for-citation-dialog-in-beta
2025-03-25 00:04:13 -04:00
abaevbog
6787dcd596
Citation dialog: do not wait for cited items to load (#5127)
Before making the dialog interactable.

Initialize loading cited items via io.getItems when the dialog appears.
Once they are loaded, itemsList is refreshed to include
cited matching items and all subsequent searches will include
them too. During the refresh immediately after cited items load,
try to preserve focused/selected state of items.

Added IOManager.preInit that is ran as soon as the dialog
is loaded. Move accept/cancel initialization there.
IOManager.init runs at the very end of onLoad because
it relies on most data and layouts being loaded,
It means if there is some delay or error during loading,
the dialog cannot be closed. To avoid it, setup
cancel/accept buttons separately in the beginning.

Also, minor refactoring of SearchHandler to handle
refreshing of cited items separately from selected and
open items.

Fixes: #5121
2025-03-20 23:42:00 -04:00
abaevbog
41bb2784b5
Citation dialog: add a dropmarker to bubbles (#5130)
- add dropmarker to bubbles after the text to indicate
that bubbles are clickable
- remove X remove button that was there before
- no more mask over the bubble on hover, since dropmarker
is just always visible
- 4px distance between the dropmarker and bubble text

Fixes: #2712
2025-03-20 23:32:39 -04:00
Abe Jellinek
93b677aaf4
Fix HiddenBrowser test failures (#5134)
Wait for 'complete', not 'interactive', so we know the image has been
loaded.

And use single documentIsReady() implementation instead of copy-pasting.
2025-03-20 23:32:02 -04:00
abaevbog
eb54cd82f6
citation dlg: refocus input on cmd/ctrl-f (#5136)
Fixes: #5100
2025-03-20 22:32:09 -04:00
Tom Najdek
9a58be243e
Improve layout of the buttons in the locate manager (#5139) 2025-03-20 17:22:07 -04:00
abaevbog
753032a001
citation dlg: highlight bubble when table focused (#5142)
In library mode, apply highlighting to bubbles that
correspond to selected items in itemTree only when
the items table is focused. When the focus leaves,
highlighting is removed from bubbles.

Fixes: #5138
2025-03-20 17:20:22 -04:00
Abe Jellinek
d79baf8251 Prevent stacked context pane from expanding over toolbar/titlebar
Regression in b649a1a953

Fixes #5135
2025-03-19 15:20:25 -04:00
Abe Jellinek
01db0bfe86 Fix occasional error when reader is closed immediately 2025-03-19 13:09:31 -04:00
Abe Jellinek
2a31c1977e Include item tree SCSS in preferences to restore tick icon
Fixes #5131
2025-03-19 10:09:33 -04:00
Dan Stillman
ab2880471e Add Troubleshooting Mode checkbox to "Restart with Logging Enabled…"
Add "Restart in Troubleshooting Mode" checkbox, checked by default, and
remove "Restart Later" option, since it's not possible to restart later
in Troubleshooting Mode. I doubt anyone used that, and if they really
need it, they can use -ZoteroDebug at the command line or toggle the
`debug.store` pref manually.

Closes #4580
2025-03-19 01:10:52 -04:00
Dan Stillman
35659b599e Indicate Troubleshooting Mode in error reports
And show plugins as disabled

Closes #4345
2025-03-19 00:19:54 -04:00
Dan Stillman
ebc670bb56 Update translators, styles, and CSL locales 2025-03-18 23:46:45 -04:00
windingwind
ccf4fd20cc
Fix plugin scope not loaded if plugin is disabled when starting Zotero (#5129) 2025-03-18 14:36:53 -04:00
Dan Stillman
d92ddd18b7 Fix WebDAV progress updates for Zotero.HTTP.download() 2025-03-18 14:10:24 -04:00
Tom Najdek
087df1f0c1 Restore attachment download progress spinner in item row (#5124) 2025-03-18 14:10:24 -04:00
Dan Stillman
80f9622c65 Change setItemDownloadPercentage() throttle from 100 ms to 25 ms
https://github.com/zotero/zotero/pull/5124#issuecomment-2731535371
2025-03-18 10:39:14 -04:00
Dan Stillman
c9f43bcdb8 Update locales from Transifex 2025-03-18 03:11:47 -04:00
Dan Stillman
91546e2e20 Remove hack for Issue search condition in French locale
https://forums.zotero.org/discussion/comment/473643/#Comment_473643
2025-03-18 02:24:01 -04:00
abaevbog
d780eed06f
citation dialog: restore arrowDown on bubbles opening details popup (#5123)
- restore earlier behavior of arrowDown on a bubble
opening itemDetails popup
- remove arrowUp closing the popup
- remove arrow navigation between rows of bubbles on arrowUp/down
- remove no longer needed edge case of arrowDown
handling on the last row of bubbles

Fixes: #5118
2025-03-17 23:27:27 -04:00
Tom Najdek
fef389290a
Fix unable to select a custom theme. Close #5070 (#5125)
This resolves an issue where, after the selected theme was deleted, it was impossible to select a newly added custom theme. This happened because the preference key for the selected theme uses consecutive IDs and wasn't cleared when the theme was deleted. As a result, the newly created theme would receive exactly the same ID. When the newly created theme was selected, the preference observer did not trigger (because the ID did not change), leading to this bug.

The fix here is to clear the theme preference when it is deleted. The added benefit is that when this happens in dark mode, the dark theme is auto-picked instead of falling back to "Original".
2025-03-17 21:07:10 -04:00
Dan Stillman
0d934c846f Fix file downloads timing out after 30 seconds
We switched file downloads to use XHR to fix downloads failing via
authenticated proxies in fx115+, but that made them subject to our
default 30-second timeout in `Zotero.HTTP.request()`. That timeout uses
the XHR `timeout` property, which applies to the whole request, even if
data is actively being downloaded. As a result, file downloads would
fail for people downloading large files or on very slow connections.

This implements manual connect and inactivity timeouts when using
`Zotero.HTTP.download()`. Currently, these both use `options.timeout`,
or the default 30 seconds, but we could probably take separate options
and have lower defaults now that they no longer apply to the whole
request.
2025-03-15 22:50:49 -04:00
abaevbog
99b4171500
citation dlg: persist screen position (#5122)
Do not explicitly move the window to the center of the screen.

Fixes: #5119
2025-03-14 23:04:31 -04:00
abaevbog
4915f1fadf
citation dialog: fix unhandled click on accept button of unfocused dialog (#5113)
Fix issue where clicking accept button would not work
when the dialog itself is unfocused. Add a small delay in the
focus handler of the dialog to allow accept button clicks
to be handled before rerunning the search.

Fixes: #5110
2025-03-14 07:49:57 -04:00
abaevbog
583fbf4e95
citation dialog: stricter non-sql item search (#5109)
While filtering selected/open/cited items, include
items that match EVERY word from the search string,
as opposed to items that match ANY of the searched words.

Fixes: #5099
2025-03-14 07:33:08 -04:00
abaevbog
a49e4e5449
citation dlg: only do not hide X when search runs (#5116)
Instead, when the search runs, replace just the accept
button with the spinner.

Fixes: #5115
2025-03-14 07:31:58 -04:00
abaevbog
bbf91d65f9
Citation dialog: move locator label lower (#5096)
So it aligns with inputs a bit better. Positioning
is tricky with native select elements but with a bit extra
margins, it looks better.

Fixes: #5091
2025-03-13 23:48:10 -04:00
Abe Jellinek
de0f5693e8
Make the info box ellipsis behave (#5103) 2025-03-13 23:47:40 -04:00
abaevbog
ebdeab4b3e
citation dialog: deduplicate open items (#5105)
So that if there are multiple tabs opened for the
same top level item, it appears only once in search
results.
2025-03-13 23:35:09 -04:00
abaevbog
92d6e69b6e
citation dlg: fix collectionTree rendering (#5114)
After switching from list mode to library mode if
the selected collection row is close to the bottom.

Fixes: #5104
2025-03-13 23:33:12 -04:00
Abe Jellinek
a98d172cd7 Restore icon to Find Full Text
Regression in 7020d60351
2025-03-13 15:39:50 -04:00
Abe Jellinek
bbfede2b55 Merge window: Fix error & blank context menu on right-click
Fixes #5077
2025-03-13 12:21:03 -04:00
Adomas Venčkauskas
bcb7e08f2f Fix citation dialog item tree refreshing on feed notifications
Closes #5107
2025-03-13 11:45:25 +02:00
abaevbog
ea71725e7f
citation dialog: Enter adds row when only 1 match (#5106)
In library mode when there are no selected/open/cited items,
Enter keypress from input will add the first row of itemTree
into the citation only if it is the only row.

Fixes: #5098
2025-03-12 21:25:41 -04:00
Tom Najdek
38188ff7d0
Fix huge buttons in banner on Linux 2025-03-12 13:45:00 +01:00
Tom Najdek
e9c0e47a17
Suggest running git lfs install in check_requirements instructions (#5102) 2025-03-12 06:54:05 -04:00
Northword
2d95cad479
Fix update checker _checker.stopCurrentCheck is not function (#5089) 2025-03-12 06:18:59 -04:00
Dan Stillman
de24306c90 Revert "Info box: Capitalize "Open Context Menu""
This is done on purpose. We distinguish between tooltips that are
command/feature titles and those that are action descriptions. So we
have "New Note" but "List all tabs". Apple does the same -- e.g., "Edit
Tags" and "Perform tasks with the selected items" next to each other in
Finder.

This reverts commit 011c5bd6c0.
2025-03-12 05:36:11 -04:00
abaevbog
cb53c6eb2e
citation dialog: fix IO race condition on load (#5097)
IOManager relies on everything being loaded, so it
should be initialized last. Otherwise, any IO handler
trying to access currentLayout would throw an error.

Also, swap the order of operations in bubble-input to
set input width only after the first input is added.
Otherwise, first input will have an arbitrary width
during initial load.

https://forums.zotero.org/discussion/122554/beta-new-insertion-bar-problem-with-citations-but-not-notes
2025-03-12 00:48:40 -04:00
Abe Jellinek
011c5bd6c0 Info box: Capitalize "Open Context Menu"
Like other button tooltips.
2025-03-11 16:36:43 -04:00
Dan Stillman
b78bf8e24b Citation dialog: Use "All Fields & Tags Mode" in Library Mode
Quick fix for #5090
2025-03-11 08:04:41 -04:00
Abe Jellinek
9cdfadbbae
Fix space before ellipsis in editable-text (#5087) 2025-03-10 22:47:38 -04:00
Dan Stillman
764dd1a9da Take object instead of id in Utilities.Internal.showInLibrary()
Not updating quickFormat.js, since we'll be removing that
2025-03-10 22:40:43 -04:00
Bogdan Abaev
6d52656a92 integration.ftl file for "integration-*" strings
And a few minor .ftl string edits
2025-03-10 22:40:43 -04:00
Bogdan Abaev
4a00304925 Redesigned citation dialog (#4872)
Implemented redesigned citation dialog with library
and list modes one can switch between. This dialog is
a direct replacement of quickFormat and classic citation
dialogs.

In Library Mode:
- items table has a new + button column to add items from the
citation and rows of selected items are highlighted
- open, cited and selected items appear in a section
between the items table and bubbleInput. When there are no
matches, a message is shown.
- only top-level items are shown when citing
items and only notes/notes' parents - when adding a note
- selected items are gathered in a collapsible deck to save space.
Click on the deck will expand it. All selected items can be
added via "Add all" button.
- when an item is added, bubble-input may increase in height and
push itemTree lower. To try to preserve relative positioning
of the mouse, itemTree will scroll to be over the row that was just clicked

In List mode:
- arrow up/down from the input will change the selected item
with the focus remaining in the input
- selected items are a collapsible list section

Other behaviors and fixes:
- one can add any locator (not just pages) by typing its full or short name
in an input and pressing Enter (e.g. line 10, or l. 10, or chap. "test chapter")
- Added a new preference to select if the citation dialog
should always open in list mode, library mode or in the last
mode that was used
- bubbles whose items are selected in library or list mode
are highlighted
- arrow up/down from a bubble will focus the bubble
above/below it for easier navigation across bubble-input
- multi-select is supported on items in list mode or item cards in
library mode via Shift-arrow or Cmd+click to select multiple items
- Cmd/Ctrl + Enter will always accept the dialog no matter what
is focused
- when there are no bubbles, accept button is disabled
- after an item is added, bubble-input is always refocused
- added suppressed property to itemTreeMenubar to be able to
hide if in list mode, where it is not relevant. Fixed menubar
getting stuck or re-appearing on Alt keypress on Linux by setting
height: 0 vs hiding it via hidden.
- added initialFolder and onActivate prop to collectionTree to set which collection
should be reopened when dialog opens and to be able to set a custom
onActivate handler.
- added getExtraField prop to itemTree to get data on if
an item is in a citation or not

Implementation details:
- citationDialog.js is the main file. It relies on a number of
helper files in citationDialog/* directory to keep the main
file less cluttered. popupHandler.js contains the logic of
opening/closing the item details popup to add locator/prefix/suffix/etc.
keyboardHandler.js is responsible for overall keyboard navigation
throughout the dialog. searchHandler.js contains the logic
for running the search based on user's query. Finally, Helpers.js
has general helper functions that don't handle any actual logic.
- SearchHandler is set to run search in two ways: for cited/selected/open
items (which are cached and do not involve any actual SQL query) and
general search for items across all libraries. When layout.search
runs, firstly cited/selected/open items are updated after which the
SQL search runs.
- bubbleInput.js is a customElement responsible for bubbles interface.
bubbleInput.refresh takes a list of items and handles adding/removing/reordering
of bubbles as needed. It always has two inputs on each side of
a bubble, as opposed to having inputs inserted dynamically. It
allows keyboardHandler.js to handle navigation with arrows within
bubbleInput.
- when user interacts with bubbleInput, it emits custom events that are
handled by IOManager singleton in citationDialog.js, which
may update the items information and pass them back to bubbleInput.refresh
to have the list of bubbles updated
- CitationDataManager singleton is responsible for storing
items added into the citation in CitationDataManager.items
in an object with both Zotero.Item and the actual citation item.
It is easier to pass both items to other components
and helpers, as opposed to sharing functions to convert
items back and forth.
2025-03-10 22:40:43 -04:00
Bogdan Abaev
27f1103d88 Use regularOnly in "Change Parent Item" selectItemsDialog 2025-03-10 22:40:43 -04:00
Dan Stillman
cbd6ccbec3 Don't enable Citation Explorer for Google Docs for now 2025-03-10 22:40:43 -04:00
Adomas Venčkauskas
a3654652b2 Adds a Citation Explorer dialog for document integration (#3468) 2025-03-10 22:40:43 -04:00
Dan Stillman
8ddb6bfd17 Remove code to modify Zotero.DB properties via transaction options
No idea why this was ever here, but I don't think it's actually used
(and if it is, it shouldn't be). The only options I see are handled
directly within `executeTransaction()` itself.
2025-03-10 04:26:16 -04:00
Dan Stillman
e532e435f4 Fix very slow purging of itemDataValues at startup in large databases
When an item is erased (removed from the trash or cleaned up from a
feed), we set a flag to purge values in `itemDataValues` on the next
startup, with this query:

DELETE FROM itemDataValues WHERE valueID NOT IN (SELECT valueID FROM itemData);

For some people, that query was incredibly slow and would result in
Zotero intermittently hanging on "Loading items…" for a long time at
startup. It's possible this is mostly limited to people who subscribe to
high-volume feeds and have a lot of item churn. One affected person had
>900K values in `itemDataValues` despite having only 20K items.

It turns out the slow query is due to the foreign-key constraint on
`itemData(valueID)` that references`itemDataValues(valueID)`. SQLite is
checking every row being deleted from `itemDataValues` against
`itemData`, even though the query is specifically removing rows that
don't exist in `itemData`! For the 900K-value DB, disabling foreign-key
checks causes the `DELETE` query to take 25 seconds instead of...some
much longer time that I didn't wait for.

We already had an `executeTransaction()` flag, `disableForeignKeys`, to
temporarily disable foreign-key checks, but it didn't do so in a way
that was safe for post-initialization usage -- a write query outside of
a transaction could've run between the transaction commit and
foreign-key checks being re-enabled. This commit changes it to properly
block all other queries unless they include an `ignoreDBLock` option,
meaning that queries within the function passed to the transaction need
to include that option. (And since that's not realistic for the couple
other uses of `disableForeignKeys` -- one for a test and one in code
that almost certainly hasn't been run by anyone in 15 years -- those now
just run `PRAGMA foreign_keys=OFF|ON` explicitly, leaving this as the
only current use.)
2025-03-10 04:26:16 -04:00
Dan Stillman
659d5e864b build_and_run: Fix handling of ZOTERO_PROFILE containing spaces 2025-03-09 16:16:47 -04:00
Abe Jellinek
ac0813e0f5
Restore window controls on Windows/Linux (#5083) 2025-03-07 16:24:46 -05:00
PChemGuy
8a06edab49
Sort strings naturally or alphabetically (#5075)
Hidden setting. If true, use natural collection sorting matching the current behavior. If false, use conventional alphabetic sorting.
2025-03-07 02:08:11 -05:00
Abe Jellinek
679de040ec Add tests for renderItemTitle() 2025-03-06 11:00:33 -05:00
Abe Jellinek
8082516bf6 renderItemTitle(): Create <span> when inverting style
Creating an <i> with a style attribute that *removes* italics is just
too confusing.
2025-03-06 11:00:32 -05:00
Abe Jellinek
c9c9c500bf renderItemTitle(): Fix nested tag handling when rendering to string
Need to exit the loop regardless of whether we're rendering actual
nodes.

Fixes #5082
2025-03-06 10:20:13 -05:00
Dan Stillman
d931319b12 Prevent DNS/TCP connections in snapshots 2025-03-06 01:46:38 -05:00
Dan Stillman
d7ce4191b1 Remove chai-as-promised submodule
We've included this in package.json for many years, so this shouldn't be
here.
2025-03-05 22:59:49 -05:00
abaevbog
d0bf8f8993
always trim editableText from itemBox on blur (#5081)
So that whitespaces are removed even if the itemBox
does not refresh.

Fixes: #5080
2025-03-05 18:03:03 -05:00
Dan Stillman
05f3ea3b82 Update reader submodule 2025-03-05 07:30:21 -05:00
Dan Stillman
8021ca0a0b Fix /connector/saveSnapshot test for Zotero.HTTP.download() 2025-03-05 07:18:12 -05:00
Tom Najdek
6add721e68
Convert customThemes from a pref to a synced setting (#5071) 2025-03-05 06:43:52 -05:00
Dan Stillman
a464fe0408 Update "Find Full Text" tests for Zotero.HTTP.download()
Downloads are now included in request() call counts
2025-03-05 06:34:25 -05:00
abaevbog
d3cee95fb7
Click on itemBox label focus edits (#5065)
Click on a label of a focused field will refocus itemTree
or the reader content, depending on the tab. That way
focus is not lost.

Fixes: #5063
2025-03-05 05:59:11 -05:00
Dan Stillman
c262a5b392 Add Cr as glboal in eslint config 2025-03-05 05:51:04 -05:00
Dan Stillman
3a26ce3bb1 Avoid args is undefined logged error in file sync tests 2025-03-05 05:50:58 -05:00
Dan Stillman
1f401f0897 Replace Zotero.Utilities.Internal.saveURI() with Zotero.HTTP.download()
Adds a new function, Zotero.HTTP.download(), that uses
Zotero.HTTP.request(). This fixes downloads via authenticated proxies in
Zotero 7 and gives us other request() functionality (e.g., 5xx retrying)
for free.

The downside is that this is probably less efficient, potentially
loading large downloads in memory. We should create a replacement for
request() based on fetch() that supports getting the body as a
ReadableStream.

Fixes #5062
2025-03-05 04:46:51 -05:00
windingwind
ccc1800f21
Fix attachment preview background (#5067)
regression from 9c41874
2025-03-04 09:45:22 -05:00
Abe Jellinek
cab8e38806
Remove deleted actors to prevent console spam (#5074) 2025-03-04 09:45:08 -05:00
Abe Jellinek
5c8859b618 RemoteTranslate: Fix request methods not sending cookies 2025-02-28 15:22:37 -05:00
Abe Jellinek
c19f43ea46 Scaffold: Suppress ESLint JSON.parse() syntax errors 2025-02-28 15:16:26 -05:00
Abe Jellinek
1e08985dcd Scaffold: Accept shorthand URLs in URL box
Like "google.com" instead of "https://www.google.com/".
2025-02-28 15:16:12 -05:00
Dan Stillman
307753d313 "Select add-on to install" → "Select plugin to install"
https://forums.zotero.org/discussion/122235/title-in-the-plugin-selection-windows-dialog-add-on-plugin
2025-02-27 23:30:45 -05:00
windingwind
1b64e3417c
Fix web-ext support (#5068) 2025-02-27 22:28:42 -05:00
Abe Jellinek
6f8da4825e Advanced Search: Remove red background from condition tooltips
Fixes #5066
2025-02-26 16:41:07 -05:00
Abe Jellinek
ba7b521bb1 Scaffold: Clean up load() slightly 2025-02-26 12:09:06 -05:00
Abe Jellinek
ddb5977c48 Scaffold: Remove 2028/2029 fix
Hasn't been an issue since ES2019.
2025-02-26 11:27:02 -05:00
Martynas Bagdonas
9077310669 Update pdf-worker submodule 2025-02-26 18:10:58 +02:00
Abe Jellinek
3c8d50dd47 Remove loadBrowserWindow() test support function (#5050)
A browser window was no longer actually needed for charset detection
(on macOS, at least, and hopefully elsewhere) because we switched to a
HiddenFrame-based hidden browser. Remaining uses now call
`loadZoteroWindow()`.
2025-02-26 03:00:04 -05:00
Abe Jellinek
26221b6786 Fix broken browser window on print + remove many Mozilla files (#5050) 2025-02-26 03:00:04 -05:00
Abe Jellinek
90a9c5164a
macOS: Unescape dragged path when NSURL doesn't (#5059) 2025-02-25 05:28:12 -05:00
abaevbog
c049120efb
do not try to select deleted item in a collection (#5061)
After navigating to the collection from "Libraries and Collections"
section of an item in the trash. Deleted item does not appear in actual
collections and trying to select it will just re-select the trash.

Fixes: #5060
2025-02-25 05:24:59 -05:00
Martynas Bagdonas
a3ebb4ad41 Update reader submodule 2025-02-25 11:24:33 +02:00
Abe Jellinek
854f2188c2 Duplicates: Fix hidden elements remaining visible
And update comment.

Fixes #5056
2025-02-24 11:18:48 -05:00
abaevbog
54346b0ca7
fix broken QF cancellation from editor instance (#5054)
Define missing cancel method on io object passed from the
editor instance to quickFormat dialog. Without this
Escape keypresses throws an error because io.cancel is
undefined.

Followup to #4859
2025-02-21 22:13:41 +02:00
Martynas Bagdonas
96e71762f9 Normalize decomposed chars in PDF text, Zotero notes for proper indexing
Fixes #5051
2025-02-21 14:55:20 +02:00
Abe Jellinek
d3871d6864 editable-text: Forward onTextEntered() from input
Fixes #5043
2025-02-20 14:40:58 -05:00
Dan Stillman
45310397e5 Update Word for Mac submodule 2025-02-20 06:28:27 -05:00
Adomas Ven
2e9b9d4070
Close citation dialog if user interacts with the integration plugin (#4859)
Asks the user if they want to discard the changes in their existing dialog if
they have made changes.

If there is no citation dialog, but a command is running (like updating the document)
an alert is displayed.

Closes #4855
2025-02-18 05:52:23 -05:00
Abe Jellinek
eb30c23a0d
Scaffold: Infer types of parameters based on naming conventions (#5038) 2025-02-18 05:07:51 -05:00
Adomas Venčkauskas
239b68e6b8 Update Word for Windows submodule 2025-02-18 11:43:51 +02:00
Adomas Venčkauskas
d231fb3b53 Do not attempt to activate windows on wayland using X11 libraries
I don't know if something changed in my Ubuntu installation or in the
Firefox runtime (probably the former), but that code crashes Zotero on
wayland.

Window activation (e.g. citation window) does not seem to be affected.
2025-02-18 10:55:22 +02:00
Adomas Venčkauskas
e765a4d3af Update ScienceDirect cf captcha selector 2025-02-18 10:53:02 +02:00
windingwind
3b7dd58c50
Update eslint ecmaVersion to es2022 (#5049)
Current firefox version supports all features of es2022
Fix errors with features like WeakRef
2025-02-17 05:53:15 -05:00
Dan Stillman
fc3b7e0f83 Local API: Fix handling of style ids without standard prefix
Follow-up to #5032
2025-02-17 03:16:22 -05:00
Dan Stillman
9c6b3368f2 Revert "Zotero.Styles: Serialize init() and remove Zotero.Promise.coroutine()"
This breaks style initialization if you trigger it manually before the
normal startup initialization.

This reverts commit d141ab25b1.

https://forums.zotero.org/discussion/121879/missing-item-pane-header
https://forums.zotero.org/discussion/121878/cannot-copy-citation-bibliography-in-reader
2025-02-17 02:19:59 -05:00
Adomas Venčkauskas
8e08527991 Update Word for Windows submodule 2025-02-13 10:36:23 +02:00
Adomas Venčkauskas
51d668db56 Update Word for Windows submodule 2025-02-13 10:30:40 +02:00
Dan Stillman
c51133f43c Update reader submodule 2025-02-13 03:13:54 -05:00
abaevbog
506f3b14e3
Allow dragging items, collections, and searches into trash (#5033)
Fixes: #1943
2025-02-13 02:58:25 -05:00
Abe Jellinek
5978353d57
Fix faulty siblings-of-type check in setAutoAttachmentTitle() (#5045) 2025-02-12 22:29:49 -05:00
Adomas Ven
8dbc6177ce
Macos integration progress bar (#5016)
* Display the progress bar on macOS integration commands more

Avoid displaying before Add/Edit Citations, Add Note and Doc Prefs
since that brings Zotero window to the foreground along with the
relevant dialog, but display the progress bar after confirming those
dialogs, which will bring Zotero to the front, but is still better than
no progress indication.

Display the progress bar for Refresh, Doc Prefs, Unlink and Add/Edit
Bibliography

* Fix progress bar indeterminate state not being visible and not working.

- Update _progressMeter.scss for fx115+
- Some adjustments/resizing to progress bar display in quick format
2025-02-12 08:43:11 +02:00
Abe Jellinek
87f8229b32 macOS-normalize-controls mixin: Cleanup 2025-02-11 15:23:16 -05:00
Dan Stillman
4d8d4bf6a9 Remove issue template
Now in .github repo
2025-02-10 23:25:03 -05:00
Abe Jellinek
98a5b7eaec Local API: Handle out-of-repo styles correctly (#5032) 2025-02-07 07:43:28 -05:00
Abe Jellinek
d25b96643c Zotero.Styles: Serialize init() and remove Zotero.Promise.coroutine() 2025-02-07 07:43:28 -05:00
Dan Stillman
fb8b65b329 Update reader submodule 2025-02-07 03:27:42 -05:00
Dan Stillman
7256072c5b Merge new English strings 2025-02-05 05:10:14 -05:00
Dan Stillman
083b4f69c9 Pretty-print zoteroTypeSchemaData.js
We should get rid of this, but in the meantime, pretty-print it (though
it will need to be generated in a new data directory to be consistent).
2025-02-05 03:27:33 -05:00
Dan Stillman
d358915707 Update sample data for podcast/date mapping 2025-02-05 03:08:32 -05:00
Dan Stillman
46879a8241 Add Date field on Podcast
zotero/zotero-bits#2
2025-02-05 02:52:17 -05:00
Dan Stillman
5d5c043161 Fix sync not downloading queued objects on first sync of session
`firstInSession` wasn't being properly set, so previously failed data
objects weren't being retried until a manual sync. Local files also
weren't being scanned for changes for three hours, but that's probably
better in the age of DB-stored annotations, so leave that off for now
and address properly in #5025.
2025-02-05 02:06:15 -05:00
Dan Stillman
41396c8148 Update Mac build to Firefox 128.7.0esr
Fixes #4762
2025-02-05 01:24:20 -05:00
Martynas Bagdonas
553f0f3994 Implement reader appearance popup with custom themes support
Implements #4949, #5005
2025-02-04 13:43:50 +02:00
Dan Stillman
553e2466ed Revert "Add script to install .desktop file on Linux (#5019)"
After further consideration, doing this in-app makes more sense. This
way, we'd never be able to update the desktop file automatically (e.g.,
to add a new MimeType), and removing the template zotero.desktop file
would break all existing installs using our symlink instructions.
In-app, we can update the existing desktop file on restart after an
upgrade, and we can remove the existing symlink.

This reverts commit 0ac57f8262.
2025-01-31 01:19:18 -05:00
Dan Stillman
3d75801a84 Don't open new copies of runJS/scaffold/csledit
Possible we'll get complaints about no longer being able to open
multiple copies of at least runJS and csledit, and we can reconsider if
so, but reopening the existing window is certainly the intended
behavior.
2025-01-31 00:58:37 -05:00
Martynas Bagdonas
6582f7ffda Fix tags overflowing in attachment annotation preview
Fixes https://forums.zotero.org/discussion/comment/477579/#Comment_477579
2025-01-30 17:49:29 +02:00
Dan Stillman
0ac57f8262
Add script to install .desktop file on Linux (#5019) 2025-01-30 02:56:10 -05:00
Dan Stillman
7466fa479f fx128: Further tweaks to "Check for Updates…" code
Don't use internal interface if we can help it

Relevant Mozilla changes:
https://bugzilla.mozilla.org/show_bug.cgi?id=1875502#c60
2025-01-29 01:07:51 -05:00
Dan Stillman
eb776f8e6e fx128: Fix "No updates found" if update was already downloaded
Previously fixed for fx115 in #3148, but `nsIUpdateManager` changed in
fx128

https://forums.zotero.org/discussion/121482/zotero-7-1beta-does-not-find-updates
2025-01-29 00:46:00 -05:00
Abe Jellinek
51349a5a97 Local API: Read headers case-insensitively 2025-01-28 10:45:08 -05:00
Abe Jellinek
a2a99c12f5 Local API: Fix test 2025-01-28 10:44:37 -05:00
Abe Jellinek
2a7f4fb2a5 Local API: Return everything when since=0
Addresses #5011 (option A)
2025-01-28 10:39:43 -05:00
Abe Jellinek
2aee7ae8d5 RemoteTranslate: Fix updated tests not inheriting defer 2025-01-28 10:07:11 -05:00
Adomas Venčkauskas
2afbe030d5 Update Word for Windows submodule 2025-01-28 10:39:44 +02:00
Dan Stillman
d1e67987bd Fix broken test after #5004
Reverts a change I made to the PR. Only `since=0` would be valid in the
web API, but local items don't have a version by default, so it has to
be `-1` to match those. This probably isn't a great solution, since tools
targeting the web API would use `0`, but this will fix the test for now.
2025-01-28 01:25:08 -05:00
Abe Jellinek
65393d09eb
Check editability based on tab when adding attachments (#4936)
And make `get[Selected/Sorted]Items()` and `canEdit[Library/Files]()` tab-aware
2025-01-28 01:00:17 -05:00
Abe Jellinek
a7fff8cada
Local API: Add /fulltext endpoints (#5004) 2025-01-28 00:58:12 -05:00
Abe Jellinek
6cdae37e5b
Local API: Fix 500 error when attachment has unparseable path (#5010) 2025-01-28 00:54:29 -05:00
Abe Jellinek
48b50064e9
Item box: Fix missing Copy/Paste menuitems on URL fields (#5001) 2025-01-28 00:48:41 -05:00
Abe Jellinek
be023c3a95 RemoteTranslate: Fix error when creating test 2025-01-27 15:23:51 -05:00
Dan Stillman
71d697801e Fix banner style issues
- Fix background color on post-upgrade banner
- Add drop shadow between stacked banners (e.g., post-upgrade banner and
  Mac Word banner, which will generally appear together on an upgrade
  and have the same background color)
- Align right edge of buttons in post-upgrade and Mac Word
- Unify other spacing and font sizes
2025-01-27 07:34:31 -05:00
Dan Stillman
7a467b8bfa Fix selectItems() not selecting non-top-level item in trash
https://forums.zotero.org/discussion/comment/484380/#Comment_484380

Adds `Zotero.Item#isInTrash()` that returns true if the item or any of
its ancestors is in the trash (i.e., `.deleted == true`)
2025-01-27 04:02:10 -05:00
Dan Stillman
814e59f694 Use commas in file size in over-quota error 2025-01-27 04:02:10 -05:00
Dan Stillman
39cbf5e520 Fix double URL launch via keyboard in sync error panel
Space bar or Enter are (now?) equivalent to `click` on a button
2025-01-27 04:02:10 -05:00
Abe Jellinek
465cc89ad6 Scaffold: Use native checkboxes in select dialog 2025-01-24 15:04:52 -05:00
Abe Jellinek
9510eef69a Scaffold: Fix select dialog overflow (again!)
And restore button spacing.
2025-01-24 15:04:43 -05:00
Abe Jellinek
ff3ab619d1 Scaffold: Fix appearance regressions, simplify margin/padding
- Move 16px padding into the tabbox, which lets us eliminate the
  negative margin on #right-pane and the 5px padding to make room for
  the focus ring
- Remove width: 100% from the textarea - not necessary and causes
  horizontal overflow on macOS

Tested on macOS and Windows.
2025-01-24 14:26:05 -05:00
Abe Jellinek
679b1df116 Update translate submodule 2025-01-24 14:10:31 -05:00
Abe Jellinek
3a816fad55 Scaffold & RemoteTranslate: Improve defer handling
- Use extracted delay routine
- Pass defer into newTest()
2025-01-24 12:10:33 -05:00
Abe Jellinek
5f983d71c1 RemoteTranslate: Improve page readiness checks
Treat page as immediately ready after readyState == 'complete', or give
it 100ms after 'interactive'. This is rough, but 'interactive' isn't
always fully ready and 'complete' sometimes never happens.
2025-01-24 12:10:15 -05:00
Abe Jellinek
79092fadcd Update translate submodule 2025-01-24 12:02:43 -05:00
Abe Jellinek
b6ca3eac37 Remove dead contentType branch
Already handled in isCachedMIMEType().
2025-01-23 17:56:32 -05:00
Tom Najdek
dcf809961a
Add a gap between the buttons in the progress queue 2025-01-23 14:59:42 +01:00
Dan Stillman
ed045e640a Tests for Item#fromJSON() changes (#3422) 2025-01-22 03:23:06 -05:00
Dan Stillman
ec280c5bdf Item#fromJSON(): Don't process any Extra rows in strict mode
And enable migration of Extra rows to valid fields in non-strict mode,
but since that's only used by translators now, that probably won't do
anything

Fixes #3422
2025-01-22 03:16:22 -05:00
Dan Stillman
8642091d8e Don't auto-select item after sync on upload error
Bug from 2017
2025-01-22 03:14:07 -05:00
Dan Stillman
e3387bbe96 Adjust debug line if file not available for uploading
Files can be missing locally and flagged for uploading, so not just a
files still being saved
2025-01-22 03:10:40 -05:00
Dan Stillman
aaf7984a8e Fix alignment of tag rows in long tag fixer
Rows were center-aligned
2025-01-22 03:09:31 -05:00
Dan Stillman
39b92d6cdb Fix incorrect spacing around link in Z7 post-upgrade banner
Regression from 564b1766aa

Fixes #4926
2025-01-22 03:07:36 -05:00
Dan Stillman
d2952d3e71 Remove duplicate padding rule 2025-01-22 03:07:19 -05:00
Dan Stillman
9e569c33f8 Adjust nesting of #post-upgrade-banner SCSS 2025-01-22 03:06:40 -05:00
Dan Stillman
a2f3b28b48 Remove unnecessary code after ec50539e80
`getBaseIDFromTypeAndField()` now returns the field itself if it's
already a base field
2025-01-22 01:06:03 -05:00
Dan Stillman
6308ea6a18 Update reader submodule 2025-01-21 22:30:51 -05:00
Abe Jellinek
00c0679333 Add key to Advanced Search menuitem
Fixes #4978
2025-01-21 11:06:35 -05:00
Dan Stillman
296edc3fdd
Unset Mozilla environment variables when launching files and URLs (#4983)
Fixes #4981
2025-01-21 05:40:27 -05:00
Tom Najdek
a4414cc2f0
Remove last few legacy icons #3691 (#4996) 2025-01-21 05:37:56 -05:00
windingwind
67da025e3f
Fix attachments box race condition (#4997)
fix: #4611
Since the attachment preview already has a task queue,
don't skip render calls when rendering
2025-01-21 05:27:33 -05:00
Dan Stillman
810062a1af Remove reference to Zotero for Firefox in incompatible-DB error 2025-01-21 05:17:36 -05:00
Dan Stillman
850431af93 Fix display of button bar in sync error panel 2025-01-21 05:17:36 -05:00
Dan Stillman
e1cee8cc45 Don't try to initialize Places, since we removed its files 2025-01-21 05:17:36 -05:00
Martynas Bagdonas
b84f1a70f0 Update pdf-worker submodule and extract only worker.js from zip build
The pdf-worker zip builds now include cmaps and standard_fonts but in Zotero client we reuse them from Zotero Reader path
2025-01-20 19:12:50 +02:00
Adomas Venčkauskas
94650e2ee9 Fix integration session breaking when an error is thrown during getDocument() 2025-01-20 12:11:50 +02:00
windingwind
998315dd58
Fix menu popup dblclick on MacOS (#4989) 2025-01-17 13:00:01 -05:00
Abe Jellinek
e11d93f0bc
Restore whitespace in search Collection condition menu (#4990) 2025-01-16 23:13:06 -05:00
Dan Stillman
9f83790ed6 fx128: Fix broken update channel after an update on macOS
Don't delete ChannelPrefs.framework during updates
2025-01-16 19:05:43 -05:00
Abe Jellinek
c8051aa3f8 Scaffold: Make Defer checkbox interactive 2025-01-16 11:07:45 -05:00
Abe Jellinek
0bdae76e49 Scaffold: Cleanup 2025-01-16 10:39:05 -05:00
Yichao Yu
8cfcdeb8e6
Use uname -m instead of arch (#4982)
`uname` is used in the script elsewhere already and `arch` does not seem to be available everywhere
2025-01-13 23:37:49 -05:00
Dan Stillman
484eb1f1d7 Fix ids showing instead of creator names for creator autocomplete
https://forums.zotero.org/discussion/121089/beta-author-suggestions-broken-only-suggest-numbers-instead-of-names

Related Mozilla bugs (though I don't see a change that would be directly
responsible for this):

https://bugzilla.mozilla.org/show_bug.cgi?id=1886064
https://bugzilla.mozilla.org/show_bug.cgi?id=1910073
2025-01-13 02:36:28 -05:00
windingwind
524660e10b
Fix dense call to setItemDownloadPercentage freezes app (#4979) 2025-01-11 03:17:56 -05:00
abaevbog
459d00448a
Hide "Report" button from plugin context menu (#4976)
Fixes: #4975
2025-01-10 01:25:51 -05:00
Dan Stillman
52c342b697 Update ESLint and Babel
Updated ESLint is necessary for flat config changes from 54db192be8
2025-01-09 03:11:01 -05:00
Dan Stillman
b86305f40e Fix json[c.field] is undefined sync error
Fix error if local note or attachment is added to a parent item while
the remote version was added to a collection. Now, the new local parent
item will be added to any collections the remote child item was added
to.

Fixes #2934
2025-01-09 03:11:01 -05:00
Dan Stillman
c44d845c8c Indent some switch case statements
For current style
2025-01-09 03:11:01 -05:00
Tom Najdek
c41eb54278
Fix Metadata Retrieval to correctly display the recognized item's title 2025-01-09 01:44:43 +01:00
Adomas Venčkauskas
b538b12d51 Refresh document with delayed citation updates when changing style
Closes #4974
2025-01-08 14:03:44 +02:00
Dan Stillman
ef8de73d5a Update note-editor submodule 2025-01-08 01:48:28 -05:00
Dan Stillman
2c377316e3 Update Mozilla langpack files 2025-01-08 01:41:29 -05:00
Dan Stillman
ab9849e71a fx128: Add arrowscrollbox.ftl from Mozilla
Fixes locales not being fully loaded, including for plugins, in 128

https://groups.google.com/g/zotero-dev/c/kcQ-A3EclBQ/m/ShIFTfM6DAAJ
2025-01-08 01:41:29 -05:00
Dan Stillman
46d5d2f5ee merge_mozilla_files improvements
- Remove duplicate/missorted locales
- Treat empty files in langpacks as missing and use en-US
- Skip empty lines and comments when using en-US file for empty
  non-en-US files, in line with Mozilla langpack files
2025-01-08 01:39:24 -05:00
Dan Stillman
bad01686d8 Fix some spaces instead of tabs in fetch_xulrunner 2025-01-08 00:30:21 -05:00
windingwind
c1c2bc76b7 fx128: Enable -moz-context-properties for SVG context properties 2025-01-07 23:50:46 -05:00
Dan Stillman
bc3c05d064 CI: Update to dpl v2 2025-01-07 01:32:25 -05:00
Dan Stillman
74216a5887 Update note-editor and reader submodules 2025-01-07 01:24:40 -05:00
Dan Stillman
9bee1b1d79 Update builds to 128.6.0esr
128.5.0 launcher still works
2025-01-07 01:15:49 -05:00
abaevbog
5fd94e22df
remove wrong aria-autocomplete from search-textbox (#4966)
searchButton setter in search-textbox element adds aria-autocomplete
to the input. It makes screen readers announce that there is an autocomplete
popup, which is misleading (even though it is appropriate for
firefox that actually does have autocomplete-like dropdown).
This overrides the searchButton setter to remove aria-autocomplete
attribute.

Addresses: zotero#4932
2025-01-03 05:14:36 -05:00
Dan Stillman
805378e49f Update version to 7.1 2025-01-03 01:21:57 -05:00
Dan Stillman
c672392fe4 Move misplaced line in build script 2025-01-03 01:21:57 -05:00
Dan Stillman
7e7ceffd77 Move utility functions for build to separate file
`replace_line`, etc.

To make them available to both build.sh and fetch_xulrunner
2025-01-03 01:21:57 -05:00
windingwind
9777d21001
Fix export error of item.tags being undefined (#4962)
Item generated from embedded image attachment may not have attribute `tags`.
2025-01-03 00:48:31 -05:00
abaevbog
7dad8377df
qf: default arrowUp handling on locator menulist (#4965)
Do not close details panel on arrowUp when locator
type menulist is focused to allow for default handling
(e.g. select the next/previous option on windows).

Fixes: #4953
2025-01-02 22:42:38 -05:00
Dan Stillman
0b44461a66 Fix Zotero.locked getting stuck on in data directory tests
This caused later DB tests to fail due to backups not running.
2025-01-02 07:41:16 -05:00
Dan Stillman
6ee556500d fx128: Implement non-incremental backup option
A new function, `Zotero.DB.backUpDatabase()`, by default makes offline
backups, by closing the database, doing a regular file copy, and
reopening the database. It takes an options object with an `online`
flag to make online, incremental backups that can take multiple minutes
to complete, though for now we're still running them on idle.

The old function, `Zotero.DB.backupDatabase(suffix, force)`, is
deprecated and proxies to the new function, making offline backups.

Fixes #4935
2025-01-02 02:56:41 -05:00
Dan Stillman
54db192be8 Update eslint config to new flat config format
https://eslint.org/docs/latest/use/configure/migration-guide
2025-01-02 01:31:31 -05:00
abaevbog
7b7a0b9e46
save tagsBox updates when another item is selected (#4945)
When tagsBox item is changed by clicking on an itemTree row,
the blur even never fires on the currently focused tag. So
whatever changes were made will be discarded. To avoid it,
blur any opened tag rows (which triggers a saveTx)
when an item is being set, same way it is done in itemBox.

Also, a small tweak to properly fetch the focused tag
via editable-text:focus-within selector, since editable-text:focus is
always empty because the focus is on the input inside of
editable-text.

Fixes: #4942
2024-12-20 02:55:33 -05:00
abaevbog
a89e0a1554
hide switch creator type in non-editable itembox (#4940)
Fixes: #4937
2024-12-20 02:52:06 -05:00
Dan Stillman
001c94b585 Update reader submodule 2024-12-20 02:49:54 -05:00
Dan Stillman
20e28d3f9e Fix handling of redirecting OpenURL base URLs with url query parameter
For a URL like
`https://ezproxy.school.edu/login?url=http://resolver.ebscohost.com/openurl`,
without a trailing `?`, we were just adding a `%` to the end, making the
URL invalid after the redirection (`/openurl&url_ver=Z39.88-2004`
instead of `/openurl?url_ver=Z39.88-2004`).

(And apparently no one who sent in these URLs actually tested them
in-app?)
2024-12-20 02:47:36 -05:00
Dan Stillman
244d182293 Fix logged error in integration progress bar
After b007bd4364
2024-12-20 02:37:25 -05:00
Dan Stillman
e8b1ea5b55 Update Word for Windows submodule 2024-12-20 02:31:25 -05:00
Abe Jellinek
fa48e978c7 Serialize _ensureFeedAbstractBrowserExists()
Prevent a potential race condition.
2024-12-18 12:20:00 -05:00
Abe Jellinek
013a814765 fx128: Fix feed abstracts
Closes #4938
2024-12-18 12:19:30 -05:00
abaevbog
cddbbdd208
fx128: fix broken database backup (#4931)
Per https://bugzilla.mozilla.org/show_bug.cgi?id=1869060#c18,
the backup utility was removed from the storage service and
exposed durectly on the connection itself in fx128.

Fixes: #4929
2024-12-18 07:11:27 -05:00
Dan Stillman
7031d1928a Update note-editor submodule 2024-12-18 07:00:36 -05:00
Dan Stillman
878d1cc401 fetch_xulrunner: Automatically cache unmodified Windows Firefox 2024-12-18 04:25:47 -05:00
Dan Stillman
485033b4a4 fx128: Fix new errors trying to load removed remote-settings.sys.mjs
Fixed previously in 297af9b40
2024-12-18 04:15:38 -05:00
Martynas Bagdonas
b806b41b6f Render ink annotation images when previewing attachment annotations 2024-12-17 18:29:48 +02:00
Martynas Bagdonas
aa4f942b26 Update pdf-worker submodule
Fixes https://forums.zotero.org/discussion/120554/consistent-failures-to-export-annotated-pdf
2024-12-17 17:58:09 +02:00
Bogdan Abaev
b007bd4364 fx128: hide titlebars in dialogs on win and mac
Use titlebar.js to hide titlebars in windows and mac
in all relevant dialogs and windows.
2024-12-16 16:15:18 -05:00
Abe Jellinek
4d90fe72bd CookieSandbox: Fix XHR interface check
Actually broken since fx115.
2024-12-16 12:21:55 -05:00
Dan Stillman
e80b5787fe Switch 'dev' channel builds back to main 2024-12-14 01:20:49 -05:00
windingwind
28e7966973 Fix ZoteroPane#buildFieldTransformMenu document variable (#4927)
fix: https://groups.google.com/g/zotero-dev/c/FwfrxviKi8I
2024-12-14 01:16:06 -05:00
abaevbog
b0fab21cc3 fx128: tweak titlebar border color (#4928)
Followup to: #4924
Addresses: #4922

Pre-fx128, --toolbar-field-border-color was ThreeDShadow,
while right now it is --input-border-color, which looks
more prominent.

Setting border color explicitly for ThreeDShadow now would make
the border look a bit blurry, while transparent border looks closest
to pre-fx128 look.
2024-12-14 01:16:06 -05:00
windingwind
42b97d8fcd fx128: dialog window background (#4921)
fix: #4917
2024-12-14 01:16:06 -05:00
abaevbog
d63c39acff fx128: hide 'Run on sites with restrictions' from plugins page (#4925)
Remove 'Run on sites with restrictions' row from Tools > Plugins tab

Fixes: #4885
2024-12-14 01:16:06 -05:00
Dan Stillman
f118d49d24 update-packaging updates from Mozilla 2024-12-14 01:16:05 -05:00
Dan Stillman
1fa34daeef Better fix for filename with spaces in xz_to_bzip
And some associated Mozilla fixes for the same file ("Firefox Media
Plugin Helper")
2024-12-14 01:16:05 -05:00
abaevbog
ee66d2042b fx128: cover transparent titlebar gap on linux (#4924)
Fixes: #4922
2024-12-14 01:16:05 -05:00
Adomas Ven
e3b243ba45 Remove missing-component integration error. (#4923)
This is no longer a thing since word plugins are not Zotero extensions.
If that code throws - it's because we've done something wrong and it's
a bug
2024-12-14 01:16:05 -05:00
Dan Stillman
d580e420d3 Quick fix for inconsistent logging in updates window 2024-12-14 01:16:05 -05:00
Dan Stillman
ca1e9bc467 fx128: Fix app updates 2024-12-14 01:16:05 -05:00
Dan Stillman
967b0c6df4 xz_to_bzip: Wrap filenames in quotes
fx128 has a helper app with spaces in the filename
2024-12-14 01:16:05 -05:00
Dan Stillman
fed4097384 Use fx128 branch for 'dev' channel builds 2024-12-14 01:16:05 -05:00
Dan Stillman
0152769201 Handle dev channel properly in set-channel-prefs-channel 2024-12-14 01:16:04 -05:00
Dan Stillman
fd7e0ec640 Adjust macOS signing
- Only use entitlements when necessary
- Pass list of files from `find` command to single `codesign` call
2024-12-14 01:16:04 -05:00
Dan Stillman
507fd519bb Omit minidump-analyzer and nmhproxy from Firefox on macOS 2024-12-14 01:16:04 -05:00
Dan Stillman
a9e68d9530 fetch_xulrunner: Automatically cache unmodified Linux Firefox 2024-12-14 01:16:04 -05:00
Dan Stillman
468155c548 fx128: Fix broken Help menu on first open on Linux
Only assign a key to "Support and Documentation" on macOS

Fixes #4918
2024-12-14 01:16:04 -05:00
Dan Stillman
43f9d98c16 fx128: Fix Authorization handling in WebDAV test
Caching Basic Auth credentials with an OPTIONS on /zotero no longer
seems to cause Firefox to pass an Authorization header for
/zotero/AAAAAAAA.prop, so update test to send 401 for the .prop request.
(Presumably /zotero/BBBBBBBB.prop would at least still get the Authorization
header without a 401, but I didn't test that.)
2024-12-14 01:16:04 -05:00
Dan Stillman
fa20733353 fx128: Fix login manager for WebDAV
Only `addLogin` → `addLoginAsync` is necessary at this time, but
`findLogins` is deprecated, so switch to `searchLoginsAsync` as well.
2024-12-14 01:16:04 -05:00
Dan Stillman
d6f3acfede fetch_xulrunner: Automatically cache unmodified Mac Firefox
To avoid redownloading from Mozilla whenever fetch_xulrunner runs. We
might want to add cleanup of old versions at some point.

We should add this for Windows and Linux too.
2024-12-14 01:16:04 -05:00
Dan Stillman
7c2720e8fc Fix translate tests after #4903 2024-12-14 01:16:04 -05:00
Dan Stillman
4319b8d78e Revert modifyLoginAsync to modifyLogin 2024-12-14 01:16:03 -05:00
Dan Stillman
a0bdeab401 fx128: Fix login manager
Use async methods (since the sync ones seem to already be broken from JS
despite https://bugzilla.mozilla.org/show_bug.cgi?id=1832756 still being
open) and avoid loading Firefox Accounts module
2024-12-14 01:16:03 -05:00
Dan Stillman
26bcc49174 Use arrays for DataTransfer#types in tree tests
After the fix for #4893

(And fix a bug that was revealed in the process)
2024-12-14 01:16:03 -05:00
Abe Jellinek
d9550bb5df Server: Expose actual bound port (#4903)
And:
- Use a different port for tests so server tests don't break when Zotero
  is already running
- Remove no-op httpServer.enabled pref updates in tests
   - It's already enabled, no test disables it, and any test that did
     would clean up after itself
   - Updating that pref has no effect without a separate call to
     Zotero.Server.init()
- Remove unused arg to Zotero.Server.init()
2024-12-14 01:16:03 -05:00
Abe Jellinek
b858645957 fx128: -moz-nativehyperlinktext -> LinkText (#4902) 2024-12-14 01:16:03 -05:00
Abe Jellinek
67b5545b93 Un-break global-shared.css with new remove_between function (#4901) 2024-12-14 01:16:03 -05:00
windingwind
7833c6fc29 fx128: Fix macOS menupopup style (#4895)
fix: #4880
2024-12-14 01:16:03 -05:00
Abe Jellinek
275fc4a230 Scaffold: Fix off-center toolbar
Addresses #4900
2024-12-14 01:16:03 -05:00
Abe Jellinek
268ba4821c Scaffold: Fix tabbox styling issues on macOS
- Cramped tabs due to insufficient padding (new in fx128)
- Off-center text due to margins (our styles)
- Off-center text due to padding-top (platform styles)
2024-12-14 01:16:02 -05:00
windingwind
a32e327ef8 fx128: Fix Windows menupopup style (#4896) 2024-12-14 01:16:02 -05:00
Dan Stillman
c963e5785f Update Windows build to 128.5.0esr 2024-12-14 01:16:02 -05:00
Abe Jellinek
d271c6c931 fx128: Remove non-native text input styles (#4890) 2024-12-14 01:16:02 -05:00
Abe Jellinek
72b56e7a59 Pass BrowsingContext to nsIFilePicker init
Fixes #4892
2024-12-14 01:16:02 -05:00
Abe Jellinek
f28fa763cc DataTransfer#types: contains() -> includes()
Not sure what this was before, but it's a standard read-only array now.

Fixes #4893
2024-12-14 01:16:02 -05:00
Abe Jellinek
a96b7f1b68 HiddenBrowserTest: Don't test HTML served as attachment
Something funky is going on with Content-Disposition: attachment on
displayable content in fx128. It's correctly blocking the download, but
we're no longer getting a STATE_STOP notification when that happens.
The HTML test didn't really test anything different from the
octet-stream one, so we can just remove it.

Fixes #4881
2024-12-14 01:16:02 -05:00
Dan Stillman
160cc8ba72 Update Firefox build process for fx128 on Windows 2024-12-14 01:16:01 -05:00
Dan Stillman
45e681431b fx128: Remove uses of nsIDOMChromeWindow
https://bugzilla.mozilla.org/show_bug.cgi?id=1522052
2024-12-14 01:16:01 -05:00
Dan Stillman
9606fca3ad fx128: XPCOMUtils.defineLazyGetter → ChromeUtils.defineLazyGetter
Avoids deprecation warning
2024-12-14 01:16:01 -05:00
Dan Stillman
f11fb6c2a0 Update Word submodules to fx128 branches 2024-12-14 01:16:01 -05:00
Dan Stillman
78975f0f2a Update Linux build to 128.5.0esr 2024-12-14 01:16:01 -05:00
Dan Stillman
9b4961a31f Build deployment ZIPs for fx128 branch 2024-12-14 01:16:01 -05:00
Dan Stillman
f341341012 Use custom ChannelPrefs.framework to set Mac update channel
Mac Firefox builds now specify the update channel via a custom macOS
framework:

https://bugzilla.mozilla.org/show_bug.cgi?id=1799332

We set the update channel in the build script, so bundle a custom
ChannelPrefs framework set to "source" and then patch the binary as
necessary for non-source channels. What could go wrong?
2024-12-14 01:16:01 -05:00
Dan Stillman
5c4a0c3b30 Disable copying of XUL for Mac builds 2024-12-14 01:16:01 -05:00
Dan Stillman
187b1649c1 fx128: Handle changed error message for IOUtils.makeDir on broken symlink 2024-12-14 01:16:00 -05:00
Dan Stillman
24bf583b78 fx128: Remove uses of nsIScriptableUnicodeConverter
Replace convertToByteArray() and convertToInputStream()
2024-12-14 01:16:00 -05:00
Dan Stillman
6b3ea14aa1 fx128: Remove try/catch for Services.jsm not being available
Not sure if there are other errors here that we want to ignore, but the
specified one should no longer be an issue.
2024-12-14 01:16:00 -05:00
Dan Stillman
97329752a1 fx128: Remove Services.jsm imports
Now included automatically
2024-12-14 01:16:00 -05:00
Dan Stillman
7f619e3fe3 fx128: nsIOSFileConstantsService is gone 2024-12-14 01:16:00 -05:00
Dan Stillman
3fde2a3e43 Update Mac build to 128.5.0esr 2024-12-14 01:16:00 -05:00
Dan Stillman
b18b15fc08 Update Mozilla patch and mozconfig for fx128 on macOS 2024-12-14 01:16:00 -05:00
Dan Stillman
05ae75d3b4 Update build process for Firefox 128 2024-12-14 01:16:00 -05:00
Dan Stillman
d970f00243 Add check_line function in fetch_xulrunner
For checking whether a line exists without replacing it
2024-12-14 01:15:59 -05:00
Dan Stillman
31bbf2acfa Update locales from Transifex 2024-12-14 01:08:36 -05:00
Dan Stillman
67486965dd Update reader submodule 2024-12-14 00:56:08 -05:00
abaevbog
4196b61dc5
let Zotero_Tabs.undoClose reopen duplicate tabs (#4920)
Fixes: #4919
2024-12-14 00:42:56 -05:00
Abe Jellinek
85deee9631 Update reader submodule 2024-12-11 13:35:10 -05:00
Tom Najdek
d3ef6cfebd
Improve importing from Mendeley
- Make the annotations importer more resilient to missing data
- Fix notebooks not being imported in some cases
- Fix an instance of a hidden browser leaked by the Mendeley Importer
2024-12-11 12:44:13 +01:00
Abe Jellinek
6c437e3df2 Update reader submodule 2024-12-10 15:47:29 -05:00
Dan Stillman
e4f2894424 Remove debug line 2024-12-10 03:06:31 -05:00
Dan Stillman
8c58d887bf Shower nicer error for malformed WebDAV URL
We fix `://` or `//` automatically after #3483, but a leading ':'
character would still show an internal `NS_ERROR_MALFORMED_URI` error.
Instead, just say "[url] is not a valid WebDAV URL".
2024-12-10 03:06:31 -05:00
Dan Stillman
021c004923 Strip leading :// or // in WebDAV URL
Closes #3483
2024-12-10 03:06:31 -05:00
Dan Stillman
64c03792ea Reset file sync history when changing WebDAV URL
Fixes #3535
2024-12-10 03:06:30 -05:00
Dan Stillman
404fc41b88 Clear library storage version when resetting file sync history
Fixes #1753
2024-12-10 00:59:04 -05:00
windingwind
f3d274afeb
Item pane scroll pos fix after switching from note (#4897)
Follow up to #4879
fix: #4276
2024-12-09 02:26:20 -05:00
Dan Stillman
61b034898d Update version 2024-12-06 09:41:59 -05:00
Dan Stillman
0a60953226 Update reader submodule 2024-12-06 04:38:01 -05:00
Abe Jellinek
886dbd17ff Abstract box: Use focused getter instead of :focus-within
See b4c5c5d539

Fixes #4878
2024-12-05 14:39:27 -05:00
Dan Stillman
d57392d810 Update reader submodule 2024-12-04 16:44:52 -05:00
Dan Stillman
6740115cf2 Revert "Fix Item Pane unstable rendering during scrolling (#4879)"
Regressions:

https://forums.zotero.org/discussion/120216/blinking-item-pane-when-switching-item-with-pinned-section-in-the-sidenav
https://forums.zotero.org/discussion/120217/title-field-is-not-visible-anymore-after-creating-a-new-item-if-a-section-is-pinned-in-the-sidenav

This reverts commit 4067745c7a.
2024-12-04 01:35:04 -05:00
Martynas Bagdonas
8317f77837 Trigger annotation import only for PDF attachments when creating a note
Fixes https://forums.zotero.org/discussion/120181/batch-create-note-from-annotations-for-different-attachment-types
2024-12-03 21:24:37 +00:00
Abe Jellinek
1c70e53006
Fix several automatic relinking regressions due to PathUtils (#4887) 2024-12-03 16:23:00 -05:00
Dan Stillman
6fe2772318 Update locales from Transifex 2024-12-03 16:15:48 -05:00
Dan Stillman
0f415063ce Update styles 2024-12-03 16:11:24 -05:00
Dan Stillman
5939f53e9a Update reader submodule 2024-12-03 16:10:22 -05:00
windingwind
4067745c7a
Fix Item Pane unstable rendering during scrolling (#4879)
Fix wrong vertical position in the Item Pane after switching from a note

fix: #4276
2024-12-02 22:42:32 -05:00
Dan Stillman
99b80723b8 Move special handling of 'timestamp' locator
Avoid "Locator 'timestamp' is empty in en-US locale" warning when
opening citation dialog after 969feb620d
2024-12-02 22:39:34 -05:00
Dan Stillman
b5310d5f04 Update note-editor submodule 2024-11-30 01:51:15 -05:00
Dan Stillman
969feb620d Add "Timestamp" to locator menu
https://forums.zotero.org/discussion/comment/480030/#Comment_480030
2024-11-30 01:47:00 -05:00
windingwind
7296583f2a
Fix item pane custom info row render after item change (#4875)
Add test for info row render after item change
fix: #4874
2024-11-29 16:18:31 -05:00
A1lo
c9c373854c
correct the value of the private field in package.json (#4870) 2024-11-28 00:00:58 -05:00
Dan Stillman
052cbb7702 Update reader submodule 2024-11-27 23:58:27 -05:00
abaevbog
247826194a
fix advanced search anyField condition breakage (#4873)
Process "joinMode" before other conditions that may rely on it

Fixes: #4871

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2024-11-27 23:43:09 -05:00
Dan Stillman
bacb60a103 Fix failure loading feed if no link and no url
APA feed link here:

https://forums.zotero.org/discussion/119954/issue-adding-new-feed-from-url-in-zotero-7
2024-11-26 22:44:48 -05:00
Abe Jellinek
0e2427fc9f Scaffold: Correct field help 2024-11-26 11:04:25 -05:00
Abe Jellinek
5a005b9adb Scaffold: Clean up tab select code slightly 2024-11-26 11:01:18 -05:00
Abe Jellinek
08ed672445 Update translate submodule 2024-11-26 10:48:39 -05:00
Abe Jellinek
bb0d7ab951 PageData actor: Settle for readyState "interactive"
Some pages seemingly never become "complete". "interactive" (which we
already use in TranslationChild) is equivalent to DOMContentLoaded, and
that's enough for everything PageDataChild needs to do right now.

This should make Scaffold test runs more reliable. TranslatorTester uses
{ requireSuccessfulStatus: true }, which calls the PageData actor, and
that was occasionally flaking and causing the test to time out.

Fixes #4869
2024-11-26 10:16:49 -05:00
Dan Stillman
501b7a9801 Update reader submodule 2024-11-26 05:53:48 -05:00
Dan Stillman
204c1e3514 Update version 2024-11-26 05:53:48 -05:00
Dan Stillman
ee4c244e0f Update translators 2024-11-26 02:34:02 -05:00
Dan Stillman
fa822b516c Update locales from Transifex 2024-11-26 02:34:02 -05:00
abaevbog
d698287558
context notes pane focus fixes (#4864)
- shift-tab from a note row focuses section header's twisty
- tab from reader into context pane will focus search
field. Previously focused note row will be focused on tab
from a section header's twisty
- fix focus not leaving context notes pane if all
sections are collapsed
- shift-tab from sidenav will focus the last node
in the contextPane, instead of search input. That is to
have consistent tab order in each direction.

Fixes: #4858
2024-11-26 02:27:55 -05:00
Abe Jellinek
2e202a59c9 Scaffold: Debounce ESLint 2024-11-25 14:02:48 -05:00
abaevbog
f824741d07
itemTree: handle restoring child item from trash in notify (#4796)
If a child item is restored from the trash and its parent row
exists and is open, collapse the parent row and expand it
to re-render child items.

Fixes: #4791
2024-11-22 06:41:55 -05:00
Dan Stillman
56ae6d9793 Update reader submodule 2024-11-21 02:59:46 -05:00
Dan Stillman
2ce9b4701b Update translators 2024-11-21 02:55:59 -05:00
Dan Stillman
5e92421114 Update reader submodule 2024-11-21 02:55:36 -05:00
Dan Stillman
9a578f8572 Update locales from Transifex and merge new English strings 2024-11-21 02:55:36 -05:00
abaevbog
a195750f31
context notes list focus handling followup (#4847)
- remember the last focused note-row in the contextPane
and, if possible, refocus it on shift-tab from sidenav, on
tab from the reader into notes pane, or on tab into the
notes list from the collapsible-section. Otherwise, focus the search input.
Per: https://github.com/zotero/zotero/pull/4837#issuecomment-2478108186

- when a note is opened in the context pane, let shift-tab
from sidenav place focus on the links-box. That way,
it is not skipped during tab navigation.

- fix focus not entering note-editor on Tab from the "Go back"
button and instead wrapping around to the current tab
2024-11-21 02:37:19 -05:00
Abe Jellinek
8c5a863aaf
macOS: Move Window → Zotero to platformKeys (#4778)
And change shortcut to Cmd-Shift-L to avoid conflicts with various
font size and zoom shortcuts.
2024-11-21 02:23:33 -05:00
Dan Stillman
5d0420a7d0 Add nsProcess NSIS plugin to check_requirements 2024-11-21 02:09:18 -05:00
Dan Stillman
e9f3d667b3 Windows signing fixes
- Sign zotero.exe in ZIP builds
- Re-sign xul.dll, which we modify in fetch_xulrunner
- Remove xul.dll.sig, a file for Widevine CDN that we don't need and
  that presumably doesn't match anymore
- Sign Word plugin DLL

https://forums.zotero.org/discussion/119766/tenable-invalid-signature-on-xul-dll
2024-11-21 01:14:38 -05:00
Abe Jellinek
bc2c7956db FeedProcessor: Handle dc:creator in Atom feeds
Fixes #4857
2024-11-20 10:05:39 -05:00
windingwind
f5b653e7fd
Add item tree and info box refresh API (#4850)
For APIs that have lifecycle control, e.g. item
pane section, the `update` is passed in the init
hook.
For APIs without lifecycle, we can't pass a value.
Instead, we provide a method to refresh in the API
instance.
2024-11-20 08:35:56 -05:00
windingwind
8e2ec86e56
Fix duplicate item pane when switching to library tab before reader is loaded (#4838)
fix: #4531
2024-11-20 08:09:42 -05:00
Abe Jellinek
e3f2f4455b
Fix sidenav buttons not getting :active state (#4853) 2024-11-20 07:46:37 -05:00
Dan Stillman
dc39ca3756 Don't detect MP3 with embedded image as JPEG
https://forums.zotero.org/discussion/119725/z-imports-mp3s-as-images-if-image-is-embedded-in-the-file

We were looking for "JFIF" anywhere in the sample, which could include
the ID3 tag.

(An upcoming change will also have it just trust the file extension when
one is available.)
2024-11-19 07:12:52 -05:00
Martynas Bagdonas
75fb301f0a
Add pref to control auto-turnoff of note, text, image annotation tools (#4851) 2024-11-19 05:47:43 -05:00
Dan Stillman
ddacfc0b8a Strip invalid quotes around charset in feed responses
E.g., https://bmcmedethics.biomedcentral.com/articles/most-recent/rss.xml
2024-11-19 05:03:36 -05:00
Dan Stillman
dc47650eb3 Update locales from Transifex 2024-11-15 03:54:01 -05:00
Dan Stillman
1a4ecff347 Update English strings for Transifex 2024-11-15 03:48:52 -05:00
Dan Stillman
3284cb461e Update reader submodule 2024-11-15 03:47:15 -05:00
abaevbog
7f57a43f27
context pane notes list focus handling edits (#4837)
- fix the issue of focus not landing on search field of the notes
pane when it is opened on tab from the reader
- shift-tab from the sidenav when notes pane is opened will focus
the search input as well, instead of the last focusable
node in the pane
- tab from a note-row in the list of notes will focus the sidenav
- shift-tab from a note-row will focus the header of the collapsible-section
of the row

Per https://github.com/zotero/zotero/pull/4235#issuecomment-2472397642
2024-11-15 03:29:01 -05:00
abaevbog
e3c18ee1c7
fix "anyField" conflicting with other conditions (#4845)
Fix the glitch where having anyField search condition
along with any other condition would return an empty
result set if joinMode="any".
This would happen due to a conflict between conditions
caused by wrapping "anyField" condition set into a quickSearch
block, which enforces "AND" operator between conditions.

Fixes: #4830
2024-11-15 02:07:11 -05:00
abaevbog
14c2d58e91
qf: remove sizetopopup from locator popup (#4846)
This may help with the issue of locator popup sometimes
not being properly rendered.

Also, it allows the popup to have a proper width on
windows when "Always show scrollbar" setting is on.

Addresses: #4814
Addresses: #4805
2024-11-15 01:11:15 -05:00
Abe Jellinek
f001123c9b
Libraries and Collections: Fix Add button in reader tabs (#4844)
And:

- Rework a few ZP functions to take items arrays instead of always
  acting on selected items
- Move string to Fluent
- Build entire Add to Collection menu programmatically
2024-11-15 01:08:37 -05:00
windingwind
5b89ceb15e Fix attachment preview unnecessary background color 2024-11-15 00:19:00 -05:00
windingwind
6270311b24 Fix attachment preview button background color 2024-11-15 00:19:00 -05:00
Dan Stillman
a6c178dfe8 Update reader submodule 2024-11-13 00:24:07 -05:00
Dan Stillman
c1bef57123 "Ctrl-Enter" → "Ctrl-Return" in macOS comment 2024-11-13 00:23:23 -05:00
abaevbog
e94789c8db
Make sidenav buttons keyboard accessible (#4235)
- Section buttons, Locate, and Notes in the sidenav are focusable
- itemPane section buttons are combined into one focusable
group. Those buttons by themselves don't mean anything in
the context of keyboard navigation as they just scroll
to the section in the itemPane. In fact, having info,
abstract, attachments, etc. focusable and announceable by
screen readers is just confusing. However, we do want the group
of those buttons to be focusable to switch back to
zotero-context-pane-item-deck from zotero-context-pane-notes-deck
if the notes button in the sidenav is pressed.
- sidenav can be reached by tabbing into it from the end of itemPane
or via shift-tab from the focused tab
- sidenav buttons can be navigated with up/down arrows
- notes list in the context pane can be activated via the button in the
sidenav and navigated via up/down arrows
- use command vs onclick listener for notes list context menus to work
with keyboard-triggered clicks as well
- focus itemPane when tabs are switched in sidenav
2024-11-13 00:20:21 -05:00
Abe Jellinek
d75d638337 Update ISBN ranges 2024-11-12 11:45:12 -05:00
Abe Jellinek
5e84944cd6 Ctrl-Enter handler: Don't intercept two-finger taps
Fixes #4834
2024-11-12 10:33:00 -05:00
abaevbog
7fa00d1cfd
Don't clear quick search after removal from collection (#4618)
Do not try to re-select a previously selected item
if it was filtered out from itemTree, e.g. after
it was removed from currently selected collection.
Otherwise, quick search gets cleared in an attempt to
re-select the item.

Fixes: #4616
2024-11-12 00:28:08 -05:00
windingwind
c937b36e25
Fix child attachment shows up in item pane after being moved to trash (#4777)
fix: #4770
2024-11-12 00:14:15 -05:00
Tom Najdek
055fbb68fc
Import Mendeley notebooks (#4829) 2024-11-12 00:13:17 -05:00
Franklin Pezzuti Dyer
a4e89e62f2
Add ellipsis to 'Install Browser Connector' menu item (#4826)
fixes #4693
2024-11-11 11:29:16 -05:00
windingwind
aec6e61cb3 Add ItemPaneManager.registerInfoRow API
Unify plugin API classes

Add info box custom row API tests

Refactor itemBox.js create element

Wrap hooks in API for safe call

Add test for item tree api and hook error handling

Remove try/catch from #4816

Move plugin API definitions to xpcom/pluginAPI
2024-11-11 11:27:47 -05:00
windingwind
347caaff4c Rename itemBox > infoBox
Following the discussion in #4114
2024-11-11 11:27:47 -05:00
windingwind
28e3c7b47f Fix notifier.js eslint errors 2024-11-11 11:27:47 -05:00
Abe Jellinek
5152d2c7ff Update reader submodule 2024-11-08 11:49:24 -05:00
Dan Stillman
4ca3843ce7 Prevent auth failures for Zotero Storage requests after relinking
If you unlinked your sync account and then relinked, the ZFS storage
controller would still have the old API key and file-sync requests would
fail. Since that was never supposed to be possible, it resulted in
"Group with libraryID 1 does not exist" errors during file syncing until
you restarted the app.
2024-11-08 03:19:41 -05:00
Dan Stillman
7c91f37348 Set new API key on each setCredentials() call in sync preferences tests 2024-11-08 03:18:44 -05:00
abaevbog
e9a19cb7a1
Update tab titles independently of the reader (#4813)
Move handling of tabs' renaming when an item is
modified from Reader into Zotero_Tabs, so that the titles of
unloaded tabs can get properly renamed.

Have the Reader and Zotero_Tabs share Zotero.Item#getTabTitle()
to handle title updates in both tabs and standalone reader windows.

Fixes: #4646
2024-11-08 02:01:43 -05:00
Abe Jellinek
9f8c5c8581
Add support for importing KOReader & Calibre annotations (#4780) 2024-11-08 01:16:10 -05:00
abaevbog
d3456b050a
Allow quicksearch to stretch when there is space in the middle pane (#4828)
Per https://forums.zotero.org/discussion/119312/search-window-in-zotero-7-is-too-small

Also, have spinner always occupy space, so that it does not
push quickSearch out of the bounds of the middle pane
when it is very narrow. Respectively,
make min-width of quicksearch a bit smaller.
2024-11-08 00:56:16 -05:00
abaevbog
5b2e666f4f
scroll to pivot row on arrowUp/Down in duplicates (#4822)
When items are selected, itemTree scrolls to them. Depending on the
arrangement of items, it will often default to scrolling to
the top-most item in the selection, which is not the focused row
in case of duplicates view. To scroll to focused row without
unnecessary scrolling or items visibly jumping to one row and then
another, added option to skip scrolling in itemTree.selectItems.
2024-11-08 00:13:57 -05:00
abaevbog
bc62bbfdda
do not handle tab out of reader iframe in window (#4824)
Only move focus out of the reader iframe on tab/shift-tab
if the reader instance is opened within a tab, meaning the
sync button and the contextPane exist. If the reader
is opened in a standalone window, do nothing.

Fixes: #4823
2024-11-08 00:13:36 -05:00
Dan Stillman
913c500733 Update version 2024-11-07 01:11:13 -05:00
Dan Stillman
1b43521786 Update reader submodule 2024-11-07 01:05:55 -05:00
abaevbog
e2905b22ad
arrowUp/down in duplicates view will select the set (#4800)
When duplicates collectionTreeRow is selected, arrowUp/down within
itemTree will select the entire previous/next set of duplicate items.

Per discussion based on https://forums.zotero.org/discussion/119217/bug-zotero-7-beta-duplicates-collection-navigation-via-arrow-keys
2024-11-06 23:08:16 -05:00
Abe Jellinek
682cceca2d Pass imported-URL attachment URL to reader (#4820) 2024-11-06 23:02:50 -05:00
Abe Jellinek
7f26f246e7 ZoteroPrintChild: Forward zoteroPrint() options (#4820) 2024-11-06 23:02:43 -05:00
abaevbog
c567905bf6
fix color scheme getting reset during printing (#4807)
LightweightThemeConsumer interacts with the color scheme,
so disabling it prevents the color scheme from changing
whenever zoteroPrint runs.

Fixes: #4782
2024-11-06 23:00:44 -05:00
Abe Jellinek
67505f3960 Don't show '0000' on invalid date in reader title
Same logic used for attachment renaming and the item tree Year column.

Fixes #4817
2024-11-06 13:54:03 -05:00
abaevbog
bd8cae6fdd
qf: show recently modified notes when empty input (#4797)
Fixes: #4771
2024-11-06 08:38:05 -05:00
Abe Jellinek
17f003df0f
Item box: Wrap all fields (#4802) 2024-11-06 08:37:38 -05:00
windingwind
51f2c76d82 Ensure custom column renderCell returns element 2024-11-06 07:23:53 -05:00
windingwind
0db1bae009 Fix item tree custom dataProvider break interface 2024-11-06 07:23:53 -05:00
Martynas Bagdonas
30024487f3 Work around contenteditable not updating Edit menu in reader and notes
This seems to be a Firefox bug that exists even in Firefox 132.0a1 (2024-09-29).
Note that right-clicking to open the context menu on a contenteditable element also triggers an update to the Edit menu.

The fix updates all Edit menu options except Redo, which cannot be enabled due to ProseMirror modifying the contenteditable state after each change.

Partial fix for #3398
2024-10-31 11:12:03 +00:00
Martynas Bagdonas
7c8e672f2f Enable text actions context menu across all note-editor text inputs 2024-10-31 11:09:04 +00:00
Martynas Bagdonas
e202924324 Add File, Edit and Window menus to note editor window 2024-10-31 11:06:29 +00:00
Dan Stillman
884a62d526 Fix swapped creator-field-mode icons 2024-10-30 21:42:28 -04:00
Dan Stillman
fadbf3d2df Update translators 2024-10-29 07:11:29 -04:00
Dan Stillman
d0a7cfae6d Update locales from Transifex and merge new English strings 2024-10-29 07:11:02 -04:00
Dan Stillman
f0da5aaf2b Update reader submodule 2024-10-29 07:02:08 -04:00
Martynas Bagdonas
d9c2abd701 Enable text actions context menu across all reader text fields
Fixes #3676
2024-10-29 10:54:48 +00:00
windingwind
364e87a57f
Pass document to ItemTree API renderCell (#4790) 2024-10-29 06:46:00 -04:00
abaevbog
10ed78212b
no background for readonly focused editable-text (#4792)
Fixes: #4789
2024-10-29 06:45:23 -04:00
abaevbog
00b2978c8b
centerscreen " My Publications" dialog (#4795)
Fixes: #4788
2024-10-29 03:57:51 -04:00
Dan Stillman
bb7a7ab961 Match annotation text and comments in All Fields & Tags mode
I think this was only in Everything for historical reasons -- in the
initial implementation of search modes, tags, notes, and (old)
annotations were all in Everything, but tags and notes were later moved
to All Fields & Tags. The old `annotation` condition wasn't moved, and
when I added `annotationComment` and `annotationText`, I just left them
in the same place. But if we match notes in All Fields & Tags, we should
match annotation comments, and if we're matching comments, we might as
well match annotation text as well.

https://forums.zotero.org/discussion/119123/note-annotations-zotero-search-and-zotero-pdf-viewer-search
2024-10-26 02:20:05 -04:00
abaevbog
88e10cdace
include linked items in lib/collectionBox render (#4786)
So that they do not disappear after Libraries and Collections
section is collapsed and expanded.

Fixes: #4784
2024-10-24 23:46:55 -04:00
abaevbog
19977c69c4
tweak settings data directory stylesheet (#4781)
- no margin-top on Windows
- explicitly hide background and border, since
   they remain on Windows otherwise

follow-up to 28f3a29f35
2024-10-23 16:03:55 -04:00
Martynas Bagdonas
bba016ecb8 Add string for reader outline search input
zotero/reader@c619677a
2024-10-23 12:57:50 +01:00
Dan Stillman
ece595e79c Update reader submodule 2024-10-23 05:35:03 -04:00
abaevbog
28f3a29f35
vpat 50: advanced settings - rework custom data directory section (#4048)
Selecting custom data directory radio button in advanced
settings opens up a modal to select the directory. It is
not a typical behavior for radio button, so it conflicts
with 3.2.2 success criteria.

This is a rework of the data directory setting interface to be
similar to LABD. It does not have radio buttons and the
directory explorer pops up on button click.
2024-10-23 05:22:30 -04:00
abaevbog
8e87aa15e7
vpat 17: itemTree view menu for non-main windows (#4433)
- adds View > Columns and View > Sort By menu options
  to all windows that contains an itemTree (Select Items dialog,
  Advanced Search, classic Add Citation, Edit Bibliography
  dialog).
- the menubar is global on macOS. On Windows/Linux it is
  displayed and focused on Alt keypress
- added menu option to move a selected column left,
  which we need as an alternative for drag-drop reordering
  that would not require using a mouse
2024-10-23 02:25:38 -04:00
Dan Stillman
504ec7eb4a Update locales from Transifex 2024-10-23 01:31:18 -04:00
Tom Najdek
7c1eb0c3f1
Fix localize-ftl crashing in certain cases #4773 (#4775)
* Tweak the script to use `en-us` `.ftl` files as the source of truth.
* Update `ftl-tx` to a version that can handle referencing terms with arguments.
2024-10-23 01:30:58 -04:00
Abe Jellinek
88d4598fce Scaffold: Change base font size to 13
We should probably just use the Zotero font size setting here, but
this works as a quick fix.
2024-10-22 15:33:21 -04:00
Abe Jellinek
03b00669ed Fix platformKeys initialization code never running at all
After cb62ab064d.
2024-10-22 15:01:03 -04:00
Abe Jellinek
cb62ab064d Fix platformKeys initialization code running repeatedly
DOMContentLoaded bubbles up from note-editor and reader frames.
2024-10-22 14:47:42 -04:00
abaevbog
8a6bc2cb10
vpat 44 followup: no escape handler in editors (#4776) 2024-10-22 14:21:50 -04:00
Martynas Bagdonas
7c9a0ac624 Use page scroll mode for PDF preview
Fixes #4653
2024-10-22 13:56:30 +01:00
Adomas Venčkauskas
bfa9d5b6d2 Update ScienceDirect BrowserDownload captcha selector 2024-10-22 08:30:40 +03:00
Bogdan Abaev
c0c3d93019 vpat 45: bibliography dialog instructions and aria (#4413)
- made the wrapper of the dialog focusable and added aria-description
  so that when the dialog opens it announces how to use the dialog
- added aria-labels to buttons, references list, and editor
- make sure that the references list always selects an item when
  focused without clicking
- added a border to focused buttons from simple editor to make it visually
  clear when they received focus
2024-10-22 01:17:45 -04:00
Abe Jellinek
3e37c44c82 Localize View menu label in reader windows
https://forums.zotero.org/discussion/118965/menu-translation-missing-for-view-when-moved-to-new-window
2024-10-21 11:38:31 -04:00
Adomas Venčkauskas
a2ed2c8b12 Update Word for Mac submodule 2024-10-21 14:25:16 +03:00
Dan Stillman
62de988cb8 Fix Add button in Libraries and Collections section
Regression from 7cf9097467

https://forums.zotero.org/discussion/118933/the-function-of-add-button-in-libraries-and-collections
2024-10-21 06:48:46 -04:00
Martynas Bagdonas
d2c8f5f186 Fix mixed-up highlight and underline annotation localization strings 2024-10-21 11:18:04 +01:00
abaevbog
c338c0262d
Better label to make item standalone in "Change Parent Item…" dialog (#4768)
More specific labels for the button to turn selected item(s)
into standalone:
- "Convert to Standalone Sttachment(s)" when only attachments
are selected
- "Convert to Standalone Note(s)" when only notes are selected
- "Convert to Standalone" otherwise (e.g. if a note and an attachment
are selected together)

Fixes: #4766
2024-10-20 02:05:22 -04:00
windingwind
eea1291314
Fix select items window overflow (#4747)
Also:

* Remove unused element in select items window
* Move and rename zotero/ingester/selectitems to scaffold/select to
   avoid confusion with selectItemsDialog
2024-10-19 06:33:14 -04:00
Dan Stillman
1c0c17ea47 Update reader submodule 2024-10-18 02:02:34 -04:00
Dan Stillman
5ead1c5aad Switch Word for Mac submodule back to main 2024-10-18 02:02:05 -04:00
Dan Stillman
6e6c212b76 Update version 2024-10-18 02:02:05 -04:00
Dan Stillman
48a1a97c66 Update Word for Mac submodule for 7.0.8 release
Don't include RTF insert via clipboard
2024-10-18 00:08:35 -04:00
Dan Stillman
76618b4de7 Update translators submodule 2024-10-17 23:05:14 -04:00
Dan Stillman
f8e30cff08 Update locales from Transifex 2024-10-17 22:21:54 -04:00
Dan Stillman
e3fda0819a Revert "Change a couple reader accessibility strings to not be terms"
Fixed by 46bdf3805f

This reverts commit f13791de60.
2024-10-17 22:15:07 -04:00
Tom Najdek
46bdf3805f
Localization: Fix a bug when dealing with terms with references
Updated ftl-tx to a version that includes this fix.
2024-10-18 01:29:05 +02:00
Abe Jellinek
1f5b7f5414 Ctrl-Enter handler: Position correctly when selection is empty
In empty <input>s and the note editor.

Also add comment explaining possible alternate approach.

Fixes #4763
2024-10-17 13:54:43 -04:00
Tom Najdek
bb6085bbe0
Fix strings without literals included in ftl json. Fix #4759
Updated ftl-tx to a version that includes this fix.
2024-10-17 15:40:44 +02:00
Dan Stillman
b6d44520a8 Update locales from Transifex 2024-10-17 03:18:16 -04:00
abaevbog
1df2a96ae3
Remove ascii control chars from rendered item title (#4764)
Filter out ASCII control characters in renderItemTitle, since
an error is thrown if those characters are present when
the innerHTML of a tab name in tab bar is set via
dangerouslySetInnerHTML.

Fixes: #4758

---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2024-10-17 03:10:10 -04:00
abaevbog
4c68f834c1
special handling for tabbox focus-ring (#4761)
Set focusring on the child hbox, instead of the actual tab.
The hbox is the element with visibly rounded corners,
so this way the focus-ring will have the right shape.

Fixes: #4744
2024-10-17 01:19:17 -04:00
Dan Stillman
ae101f5393 Update reader submodule 2024-10-17 01:15:54 -04:00
Abe Jellinek
06844d18ad
Implement Ctrl-Enter handler in child frames (#4734) 2024-10-17 01:11:52 -04:00
Dan Stillman
36f4cb48c9 Download NsProcess.zip from us rather than a SourceForge wiki link
Added in #4760
2024-10-16 01:48:51 -04:00
Dan Stillman
7efb296da9 Update locales from Transifex 2024-10-16 01:32:15 -04:00
Dan Stillman
f13791de60 Change a couple reader accessibility strings to not be terms
They cause problems with our import script (I think because they're
processed first, so the non-term placeholder isn't yet available) and
aren't really necessary.
2024-10-16 01:32:15 -04:00
Dan Stillman
617b014b85 Update utilities submodule 2024-10-16 01:32:15 -04:00
windingwind
c75119324c
Fix item pane width jumping in stacked mode (#4757)
fix: #4755
2024-10-16 00:34:12 -04:00
Tom Najdek
a36e0a88f6 Installer: Ignore failed installs if user has no admin rights (#4760)
It's better to attempt to install into existing folder with some junk left over than to leave users in a reboot loop
2024-10-16 00:25:54 -04:00
Tom Najdek
f2367c88f5 Installer: Ignore any leftover files after uninstalling old version (#4760) 2024-10-16 00:25:50 -04:00
Tom Najdek
ba45c72dc0 Installer: Check if Zotero is running before installing (#4760) 2024-10-16 00:24:11 -04:00
Dan Stillman
a6c9af3c28 Update English strings for Transifex 2024-10-15 07:02:52 -04:00
Dan Stillman
d51218cddd Reference existing general strings in option-or-alt 2024-10-15 07:02:52 -04:00
Dan Stillman
e5bc22f64b Update locales from Transifex 2024-10-15 07:02:51 -04:00
Martynas Bagdonas
1904675b71 Update pdf-worker submodule 2024-10-15 13:50:29 +03:00
Tom Najdek
5bd068860c
Fix renaming behavior for attachment without extension (#4742)
Fix #4739
2024-10-15 06:48:04 -04:00
abaevbog
7cf9097467
vpat 16: context menu as a drag-drop alternative to move/copy collections (#4420)
- Added menuitems to move collections within the same
library and to copy collections
- "Move to" only displays collections within the
current library
- "Copy to" displays all libraries, if more than
one library exists. If there is only one library,
top-level collections from "My Library" are displayed.
- while copying within the same library, create copies
of all collections and add items into them, without
actually duplicating items
- while copying between different libraries, items
will be duplicated, the same way it is done when
collections are dragged and dropped in another library
2024-10-15 06:34:42 -04:00
Dan Stillman
2f5a7aa369 Update reader submodule 2024-10-15 06:12:10 -04:00
abaevbog
d786454a3f
simplify reader.ftl (#4756)
Remove logic constructing a11y announcements from reader.ftl.
Instead, reader will fetch and put together components as needed on the fly.

Follow-up to cde21ac9f2
per https://github.com/zotero/zotero/pull/4752#discussion_r1800481917

Also, add { general-key-command } and { general-key-alt } and add a reader
string that uses those on macOS and non-macOS for textual annotation
instructions. On macOS, the end of highlight and underline annotations is
resized via Shift+Command+arrows, which is different from the Option
modifier used in all other instances
(per https://github.com/zotero/reader/pull/138#issuecomment-2373775068)

Finally, tweak aria-description of "Find in Document" as it sounded
as if Control+Option/Alt+1 would create either highlight or underline
annotation.
2024-10-15 06:11:01 -04:00
Dan Stillman
d14a72e1b0 Update reader submodule 2024-10-15 01:36:02 -04:00
abaevbog
cde21ac9f2
reader.ftl file for a11y strings in the reader (#4752)
Per: https://github.com/zotero/reader/pull/142#issuecomment-2410574199
2024-10-15 01:35:07 -04:00
Martynas Bagdonas
d1960cee6b Add string for reader view context menu link copying 2024-10-14 20:21:59 +03:00
Adomas Venčkauskas
0e07c7a26a Update Word for Mac submodule 2024-10-14 13:49:48 +03:00
Tom Najdek
7ac4c8d667
Check for admin privileges in UninstallOld installer routine (#4750) 2024-10-14 01:37:00 -04:00
abaevbog
c14896a640
vpat 44: scaffold keyboard tab selection focus (#4069)
Do not move focus from the tab onto the editor/input
during keyboard navigation to not change context per
https://www.w3.org/WAI/WCAG21/Understanding/on-input.

Focus will still shift if tab selection changed on mouse click.

Also:

- added focus ring to tabs. Additional mouseup handling
to prevent the focus ring from briefly appearing on click.
- on Escape from within the editor, focus the current
tab.
- on shift-tab from the beginning of the editor,
tab out of the editor to previous element.
2024-10-10 17:08:32 -04:00
abaevbog
15ccf28fb4
vpat 16: context menu as a drag-drop alternative to change parent item of attachment/note (#4423)
- added "Change Parent Item…" context menu option to
itemTree as a non-drag-drop alternative to changing the
parent of attachments or notes
- context menu option appears only when all selected
items are notes or attachments
- upon activation, a dialog to select the new parent
will appear. Added a tweak to the dialog to disable
the "accept" button if a selected item is not top level
- minor edit to itemTree to set the multiselect property
based on a prop, since we do not want to have multiselect
enabled in this instance
- hide all virtual collections in selectItemsDialog via new
io.hideCollections parameter
- "Convert to Standalone Attachment" button in dialog if
child attachment is selected
2024-10-10 16:56:34 -04:00
Abe Jellinek
237a2e5b86 Scaffold: Fix test statuses not persisting 2024-10-09 14:15:34 -04:00
Abe Jellinek
e1cf60b3cf Update subprocess() return type in doc comment 2024-10-09 13:43:02 -04:00
Abe Jellinek
f22f87537c Scaffold: Get PATH from login shell for ESLint on macOS
And:
- Use eslint instead of teslint
- Remove debug logging, since we're running this constantly now
- Kill ESLint at the end, although it should exit on its own
2024-10-09 13:43:01 -04:00
Abe Jellinek
528ee8adac Scaffold: Fix evaluation of translator ending in single-line comment 2024-10-09 10:17:42 -04:00
Abe Jellinek
dc60b10f00 Update reader submodule 2024-10-09 09:31:22 -04:00
Abe Jellinek
40dd345280
Scaffold: Run ESLint continuously, not just after save (#4738)
Includes API changes in Zotero.Translators in order to support
in-memory translator serialization.

Type changes in docstrings are corrections, not actual changes.
2024-10-09 01:46:10 -04:00
abaevbog
00182e317c
override fx control + scroll action to scroll (#4723)
That way, once can still scroll collectionTree while
holding Control to highlight collections
2024-10-09 01:45:30 -04:00
Abe Jellinek
54cee37703 Scaffold: Cleanup 2024-10-08 15:26:02 -04:00
Abe Jellinek
1caeb1ef08 Scaffold: Fix richlistbox misalignment 2024-10-08 14:53:30 -04:00
Abe Jellinek
9d9d98b907 Scaffold: Fix silent do* failure when code has syntax error
Apparently _error() does get called!

detect* methods were already logging syntax errors as expected.
TranslationChild handles errors in detect* and do* identically. Odd.
2024-10-08 14:43:58 -04:00
Abe Jellinek
43b491fbd3 FeedProcessor: Interpret more type attributes
Fixes #4733
2024-10-07 17:05:45 -04:00
Abe Jellinek
f1aeb278a6 FeedReader: Be safe when calling createDocumentFragment()
Addresses #4733
2024-10-07 17:05:21 -04:00
Abe Jellinek
fa2316154e _setAriaActiveDescendant(): Use _topDiv for clarity, fix typo (#4731) 2024-10-05 02:01:49 -04:00
Abe Jellinek
23f9ebcd17 Implement macOS Sequoia Ctrl-Enter context menu shortcut (#4731) 2024-10-05 02:01:48 -04:00
Dan Stillman
fc7307fd84 Unify banner padding 2024-10-05 02:01:48 -04:00
Abe Jellinek
dc5ec2dd36 Add autocomplete-richlistbox-popup to reader windows
Fixes #4727
2024-10-04 10:07:24 -04:00
Dan Stillman
b00b23306d Allow EPUBs saved from the web to be dragged out of parent 2024-10-04 01:28:25 -04:00
abaevbog
d462330347
vpat 8: make window buttons not focusable (#4070)
Minimize, maximize, close, etc. window buttons are generally
not accessible for focus. They can get focused on mac with
voiceover enabled which can be confusing.

Added aria-hidden attribute to prevent voiceover from
placing the cursor on them.
2024-10-04 00:02:16 -04:00
Bogdan Abaev
6282eef3cc vpat 40/41: style editor aria fixes (#4022)
- linked all labels to their respective inputs so they are announced by
screen readers
- added aria-labels for the actual editor and preview iframes
- locator type and locator input are assigned aria-labels
- added visible labels to citation style and language menus,
since vpat 40 specifically asks for visible labels
2024-10-03 23:54:09 -04:00
Abe Jellinek
684c63669b Update reader submodule 2024-10-03 15:24:55 -04:00
Dan Stillman
e754fa0c41 Update Word for Mac submodule 2024-10-03 04:38:48 -04:00
Dan Stillman
e2bbe60b65 Update Word for Mac submodule 2024-10-03 04:14:09 -04:00
Dan Stillman
508c34c95b Update version 2024-10-03 00:18:39 -04:00
Dan Stillman
304e76685e Update translators 2024-10-02 13:50:42 -04:00
Dan Stillman
cca605e9c8 Update locales from Transifex 2024-10-02 13:49:24 -04:00
Dan Stillman
605b986a92 Update reader submodule 2024-10-02 13:45:35 -04:00
Abe Jellinek
9672571913
autocomplete-textarea: Reposition popup on resize (#4718) 2024-10-02 03:10:22 -04:00
Dan Stillman
a0da169664 Strip non-printable characters in tab titles when restoring session
https://forums.zotero.org/discussion/118303/zotero-blocked-with-the-loading-items-message
and probably others

Fixes #4721
2024-10-02 00:40:29 -04:00
Dan Stillman
20d13f5a8e Merge new English strings 2024-10-01 17:43:54 -04:00
Martynas Bagdonas
afe669aa46 Update reader submodule and add string for ink annotation merging 2024-10-02 00:39:53 +03:00
Dan Stillman
1391bf23da Update locales from Transifex 2024-10-01 17:19:15 -04:00
Abe Jellinek
7c7e1cba34 Update reader submodule 2024-10-01 10:31:29 -04:00
Dan Stillman
3fcdae8fa9 Update version 2024-10-01 02:05:15 -04:00
Dan Stillman
4434724278 Update English strings for Transifex 2024-10-01 01:59:33 -04:00
Abe Jellinek
5ff35c896c
View Online: Prioritize DOI over attachment URL (#4714)
And lint and remove no-op ifs.
2024-10-01 01:56:19 -04:00
abaevbog
a4225592a1
itembox: shift-enter adds new creator + bug fixes (#4567)
- shift enter on a creator row will add a new empty creator
row after focused row. If shift-Enter is on the last creator
before "More creators", all creators will be rendered.
- fixed encountered glitch where switching the mode of
creator would not always update the pref, so next time
a new creator row is added, it would not be of correct
mode.
- fixed encountered bug where a newly added creator row
could receive an index of an existing creator that is not rendered
( "More creators" label is displayed). In that case,
saving such creator would override an existing creator
and erasing that creator would remove invisible creators.
- added a few tests for these edge cases
- on shift-enter in unsaved creator row that only
has whitespace, do nothing, the focus will stay
in that row. It will be discarded if the focus leaves
it with nothing but whitespace.
- fix focus getting lost on shift-enter on an edited
creator field after adding just some whitespace.

Fixes: #4393
Fixes: #4710
2024-09-27 16:51:23 -04:00
windingwind
f7a56efacf
Unify message in the item details pane when trash contains collections or searches (#4696)
fix: #4688
2024-09-27 16:00:54 -04:00
abaevbog
3ffe736d99
Make "Get additional styles…" link in Style Manager keyboard accessible (#4709)
Fixes: #4707
2024-09-26 14:21:51 -04:00
Abe Jellinek
c59c8cbffe Use more reliable test for IOUtils.exists() error
Amendment to e35c220
2024-09-23 11:46:34 +01:00
Abe Jellinek
e35c220be4 Ignore IOUtils.exists() error when auto-relinking
Should fix #4701
2024-09-23 11:41:14 +01:00
windingwind
d4b2fbf33b
Add Title to attachment box (#4702)
resolve: #4692
2024-09-23 04:31:19 -04:00
Tom Najdek
b946946b00 Fix installer reboot loop on limited accounts on Windows (#4697) 2024-09-23 00:03:28 +02:00
Tom Najdek
acc727358b Revert "Windows installer: Add option to remove installdir when previous installation detected (#4564)" (#4697)
This reverts commit ca83e4303c.
2024-09-23 00:03:24 +02:00
Tom Najdek
7749302295 Revert "Tweak the uninstaller message (#4626)" (#4697)
This reverts commit c900eb7951.
2024-09-23 00:03:18 +02:00
Tom Najdek
1278445f5c Revert "Tweak the uninstaller message (uninstallation -> upgrade) (#4630)" (#4697)
This reverts commit e64ef5c781.
2024-09-23 00:02:59 +02:00
Dan Stillman
da10878f6f Fix syncing of searches in trash
https://forums.zotero.org/discussion/118049/recent-error-with-manually-triggered-sync
2024-09-20 22:48:38 +01:00
Adomas Venčkauskas
6e130a8649 Reduce min-height of classic citation and bibliography dialogs
Apparently some hidpi users don't even have 600px of vertical
resolution

https://forums.zotero.org/discussion/117926/la-page-dinsertion-de-citation-est-trop-grande-je-narrive-pas-a-cliquer-ok
2024-09-17 12:59:34 +03:00
Dan Stillman
9e5b9545e7 Update locales from Transifex 2024-09-16 12:00:55 +02:00
Dan Stillman
b4239fd4c9 Update English strings for Transifex 2024-09-15 23:21:49 +02:00
Dan Stillman
2ca1389b43 Adjustments to Mac Word installation banner (#4660)
- Use real buttons and other tweaks from design
- Use existing .properties string for "Don't Ask Again" for now
- Remove close button
- Update submodule for reminder after 24 hours instead of 7
2024-09-15 23:20:01 +02:00
Adomas Venčkauskas
564b1766aa Add a Mac Word plugin Sequoia permissions warning banner (#4660)
Also refactor some banner rules.
2024-09-15 23:19:47 +02:00
abaevbog
8fbed0b62b
qf: increase likeliness of dialog receiving focus (#4683)
Tweak to Zotero.Utilities.Internal.activate to make
it more likely that qf receives focus. Addresses
the issue of qf not becoming focusable after the
first opening in word and makes it clearer when the
dialog appears in google docs when the dialog cannot
be pulled to the foreground.

getAttention() will flash the icon in the app bar
if the window could not be pulled into foreground,
for example with google docs.

focus() will try to bring the window to the foreground,
which fixes the issue of qf not getting focused
with word on the first opening. Also, without it,
a call to getAttention() interferes with focus landing
on the dialog during subsequent opening in gdocs.
2024-09-13 09:11:32 +03:00
Dan Stillman
8de36726a0 Update version 2024-09-12 06:52:38 -04:00
abaevbog
74a89933dc
VPAT: minor settings tweaks (#4680)
* vpat: add more aria-labels to preferences btns

Per the VPAT review. "Add"/"Remove" instead of +/- as those
are not descriptive enough

* vpat: wrap radiogroup in a groupbox with label

That is so that the "Color scheme" label is not announced
as a description, which requires a specific setting
enabled in JAWS.

* vpat: link itemPaneHeader prefs labels to menus
2024-09-12 06:28:44 -04:00
abaevbog
82d50676d3
fix quicksearch phrase search not respecting scope (#4608)
Fixes: #4381
2024-09-12 06:27:29 -04:00
windingwind
78077fab9d
Fix main window layout and window resizing (#4676)
- Replace flex attribute with flex-shrink and flex-grow style
  to allow elements to be resized by splitter and window resizing.
- Set the max-width on collections pane to prevent it from pushing
  other panes outside window border
- Set the min-width on window according to the size of both library
   and reader tabs
- Use stacked layout when window width is small

fix: #4669
2024-09-12 06:26:31 -04:00
Adomas Venčkauskas
58d98af6c1 Fix citation dialog reference list not selecting with double header
We display "Loading Cited items" while fetching fields as an
additional header before "My Library". Navigating the item list before
this change while the double-headers were displayed did not work with
the keyboard
2024-09-12 13:22:33 +03:00
Adomas Venčkauskas
6504c95d24 Fix citation dialog not appearing until fields are fetched on macWord
Closes #4679
2024-09-12 13:22:33 +03:00
windingwind
01017e7d63
Fix prefs window style on MacOS (#4682)
Use MacOS menupopup style to prefs window
Move style mac/menupopup into mac/components
2024-09-12 05:13:19 -04:00
Adomas Venčkauskas
64bed48de4 Update connector_server code for updated translate module 2024-09-11 15:33:53 +03:00
Adomas Venčkauskas
7a0fb5d1f1 Update translate submodule 2024-09-11 15:25:21 +03:00
Dan Stillman
f95b40f05f Revert "Update translate submodule"
This reverts commit dcf6c14d66.

Test failure due to zotero/translate@8ad44f44c
2024-09-11 07:41:11 -04:00
Dan Stillman
dcf6c14d66 Update translate submodule 2024-09-11 07:19:15 -04:00
Dan Stillman
fe3fdac88e Quick fix for Localized string not available for general.warning
https://forums.zotero.org/discussion/117812/issue-with-installing-zotero-7

With Zotero data directory in cloud storage folder

Regression from af3602124
2024-09-11 07:10:56 -04:00
Dan Stillman
8e6c801127 Update version 2024-09-11 07:10:56 -04:00
Dan Stillman
95fa3cb199 Update styles and translators 2024-09-11 01:19:40 -04:00
Dan Stillman
b9bdc6618c Update locales from Transifex 2024-09-11 01:18:00 -04:00
Tom Najdek
5a3f2ddfa6
Check both HKLM and HKCU in UninstallOld (#4678) 2024-09-10 09:44:56 -04:00
Martynas Bagdonas
5695d08e7d Fix zotero://open-pdf navigating one page too far
Fixes https://forums.zotero.org/discussion/117752/inconsistent-page-numbering-in-zotero-7-url-links-compared-to-zotero-6
2024-09-10 14:06:09 +03:00
Dan Stillman
42219772a7 Reset ui.popup.disable_autohide
Closes #4674
2024-09-08 01:47:16 -04:00
Dan Stillman
5233e0f487 Update English strings for Transifex 2024-09-08 01:46:04 -04:00
Dan Stillman
aff5aef4c1 "Interface" → "Appearance and Language" in settings 2024-09-08 01:46:04 -04:00
windingwind
58f5e188e3 Fix viewing duplicate items does not change item pane splitter state 2024-09-07 11:28:50 +02:00
Dan Stillman
4c04dc583e Sign .jnilib within LibreOffice extension to fix macOS notarization
Apple's notarization service started rejecting the libjnidispatch.jnilib
file within a .jar within the .oxt for not being signed.
2024-09-05 09:13:20 -04:00
windingwind
6631e7c3e0
Fix padding on Close button in About window (#4667)
fix: #4663
2024-09-05 02:51:49 -04:00
Abe Jellinek
5bd5bfa343 Resolve XML entities in parsed strings (#4664) 2024-09-04 02:02:00 -04:00
Abe Jellinek
af3602124b Load DTD strings lazily (#4664) 2024-09-04 02:01:53 -04:00
Adomas Venčkauskas
dbeb1f167c Update LibreOffice submodule 2024-09-04 08:54:56 +03:00
Adomas Venčkauskas
974ac78618 Update LibreOffice submodule 2024-09-03 14:43:56 +03:00
Bogdan Abaev
8de5eb360d vpat 43: add label to scaffold translator output (#4018)
In a new scaffold.ftl file.

Vpat 43 also indicates that the read-only state of the text field
does not get announced - it is a VoiceOver-specific issue on
Firefox, so it is not addressed here as it should be fixed
globally.
2024-09-03 07:35:24 -04:00
Adomas Venčkauskas
989956f392 Update LibreOffice submodule 2024-09-03 14:01:53 +03:00
windingwind
1f8b480e70 Execute attachment box render sub-tasks concurrently
resolve: #4611
Try to avoid race condition in dense render calls.
We used to notify the preview to update
after all other renders are done,
which can cause unexpected race condition.
2024-09-03 01:42:29 -04:00
windingwind
3861af50d1 Fix attachment box preview discard
fix: #4659
2024-09-03 01:42:29 -04:00
Adomas Venčkauskas
7652fb25f0 Update LibreOffice submodule 2024-09-02 18:00:05 +03:00
Martynas Bagdonas
9b10164eac Skip processing with PDF worker when exporting PDF without annotations 2024-09-02 14:40:06 +03:00
Martynas Bagdonas
ce1061c2fb Remove unused "transfer to PDF file" feature artifacts 2024-09-02 14:16:04 +03:00
abaevbog
576e50552b
vpat 25/46: announce section headers of settings (#4434)
- explicitly add aria-labels to groupbox and vbox
sections of the settings. It's required for voiceover
to announce that label when focus enters the group.
It's not needed for NVDA and JAWS as they recognize
most h2 labels as labels of grouppings.
- add all relevant additionl text for the section
as aria-description/aria-describedby so it is
announced after the section's name when focus enters it
- add role="group" to vbox sections, since vbox
does not have any semantics
- skip tabstop on scrollable "#prefs-content" container
since it is not required
2024-09-02 04:46:51 -04:00
abaevbog
901cc7d635
vpat 7,14: popups count and cursor fixes (#3969)
- vpat_7: When a popup is showing, mark menuseparators with
role="presentation" to clear whatever semantics a separator
has. It prevents the screen readers from counting it as
an interactable element while announcing the index of
a menuitem within the popup. It also makes the screen readers
count items across all sections, instead of stopping at
the first separator.
- vpat_14: When menupopup is hiding, for a moment, mark it
as aria-hidden. It forces VoiceOver to move cursor back to
the previously focused element. Otherwise, it is not aware that
the popup went away, the cursor gets stuck inside of the
invisible menu, no elements will be announced until the screen
readers is reloaded.
2024-09-02 04:46:02 -04:00
Tom Najdek
6b7834876f
Fix a couple of issues related to dark mode icons (#4655)
- Fixed missing dark mode icons in the advanced search dialog.
- Corrected inconsistent icon shading in some menus.
2024-09-01 15:48:36 -04:00
Abe Jellinek
474b0eb0d7
Hide selected item background when mouse leaves menu (#4623) 2024-09-01 04:13:48 -04:00
windingwind
181196149a
Use dynamic max height for attachment preview (#4651) 2024-08-31 02:10:23 -04:00
Dan Stillman
e0aaa7e366 Fix CI failures with dpl v2
dpl v2 just left beta, but it's failing with a syntax error in the
CloudFormation template, so stick to v1 for now.
2024-08-31 01:19:19 -04:00
windingwind
a0a8cceda4
Checkbox-and-radio-redesign-on-Windows (#4609) 2024-08-30 07:20:52 -04:00
Adomas Venčkauskas
679c99e465 Update LibreOffice submodule 2024-08-30 10:33:07 +03:00
Abe Jellinek
051d3384c5 Make textareas respect rows attribute on Windows
Specificity conflict with the selector above.

https://forums.zotero.org/discussion/comment/472656/#Comment_472656
2024-08-29 11:58:26 -04:00
Adomas Venčkauskas
460d5e0f9b Update Word for Windows submodule 2024-08-29 16:46:22 +03:00
Abe Jellinek
aed604ddc0
Add "Paste and Search" option to lookup context menu (#4636) 2024-08-28 23:36:15 -04:00
Abe Jellinek
8d7e9cc0e3 Update reader submodule 2024-08-28 16:15:32 -04:00
Abe Jellinek
a7c008b546 Update reader submodule 2024-08-28 13:00:51 -04:00
Tom Najdek
e64ef5c781
Tweak the uninstaller message (uninstallation -> upgrade) (#4630) 2024-08-28 03:56:48 -04:00
Dan Stillman
a2bac6b299 Use Z.Prompt.confirm() for delayed-button prompts to fix CI failures
After f9faa0415f, Zotero.Prompt.confirm() ignores the delayed-button
flag when running in CI.
2024-08-28 03:55:18 -04:00
Dan Stillman
92165cb9ed delayButtons → buttonDelay in Zotero.Prompt
Too confusing to swap order of original flag
2024-08-28 03:54:02 -04:00
Dan Stillman
f9faa0415f Skip Zotero.Prompt button delay in CI
The button delay started causing test failures in GitHub Actions after
updating to Firefox 115.14.0esr.
2024-08-28 03:53:48 -04:00
Abe Jellinek
4549cbf1ed Attachment box: Use un-deprecated attachmentFilename property (#4638)
Fixes warning.
2024-08-28 03:53:11 -04:00
Abe Jellinek
d5bc1dc4b3 Attachment box: Wrap Filename field (#4638) 2024-08-28 03:53:11 -04:00
Abe Jellinek
718c25b2b8
Strip Citeproc.js markup in window titles (#4634) 2024-08-28 01:10:01 -04:00
Dan Stillman
a9953b3f91 Update CSL locale
https://forums.zotero.org/discussion/comment/472455/#Comment_472455
2024-08-28 00:34:05 -04:00
Abe Jellinek
cb6e1e3e59 Lookup Engine Manager: Contain richlistbox
Fixes #4635
2024-08-27 11:20:33 -04:00
abaevbog
15f9a84060
type="arrow" to anchor reference panel (#4629)
And remove no longer needed JS logic hiding and
displaying the panel to keep it next to the dialog
2024-08-27 13:07:46 +03:00
Adomas Venčkauskas
671577e35e Update LibreOffice submodule 2024-08-27 09:22:56 +03:00
abaevbog
75e6e46fb6
Qf: potential fix to the dialog becoming invisible (#4603)
* qf: remove transparent window background from win

Because it seems to still sometimes cause the qf window
to disappear. I could not reproduce it but disabling
background: transparent did help with the issue of qf
disappearing in the past. It allows us to remove very
specific chromemargins which, apparently, do not work
in all cases.

Removed border-radius from qf on windows because now that
the window is not transparent, its corners would be visible.
But the window itself has rounded corners so it doesn't look
that different.

The main drawback now is that a secondary window without titlebar
on win becomes resizable, and having background: transparent was
a workaround to disable that. So now, we set max width and height
so that the window cannot be stretched but, unfortunately, the
resize cursor appears when you hover over the edge of the dialog.

* qf: minor style fixes

- hardcode light theme value for accept button and the
spinner so they don't disappear when the theme is dark
- make sure the item's color from reference panel is not
overriden by a lighter one from another stylesheet
2024-08-27 09:20:53 +03:00
Dan Stillman
d1a82af43c Update Linux build to 115.14.0esr 2024-08-27 01:07:21 -04:00
Abe Jellinek
3017770954 Preferences: Add new status info below local API checkbox (#4615) 2024-08-27 00:53:20 -04:00
Abe Jellinek
5e71fdf1cc Preferences: Fire synctopreference *after* updating preference (#4615)
And add a new beforesynctopreference event to replace the old behavior.
You almost always want the preference to be updated before acting on
the change.
2024-08-27 00:53:20 -04:00
Dan Stillman
9978fa73e1 Update version 2024-08-27 00:53:20 -04:00
Abe Jellinek
6f9abaaffe Suppress "Checking [...] for addons" 2024-08-26 23:36:32 -04:00
Abe Jellinek
9ca70a7946 Prevent "Error: Addon must include an id, version, and type"
And "Addon with ID undefined already installed, older version will be
disabled".
2024-08-26 23:36:32 -04:00
Abe Jellinek
175541ed86 Prevent "Warning: unrecognized command line flag -rd" 2024-08-26 23:36:32 -04:00
abaevbog
868947f4c8
vpat 34-5: aria labels for the error console (#4625)
Add hardcoded, non-localized labels to the X button next
to the input filter and the actual console textarea
2024-08-26 23:32:49 -04:00
Tom Najdek
c900eb7951
Tweak the uninstaller message (#4626) 2024-08-26 23:28:00 -04:00
Dan Stillman
10d27b8f68 Revert "No menu background when not hovered on MacOS (#4619)"
This reverts commit e6c9d912f1.

https://github.com/zotero/zotero/pull/4619#issuecomment-2310063530
2024-08-26 08:20:46 -04:00
Tom Najdek
b350613770
Fix progress bar ignores color scheme. Resolve #4589 (#4599) 2024-08-26 08:00:18 -04:00
Abe Jellinek
ed53f4b756
Register all plugin locales with best-fit aliasing (#4606) 2024-08-26 07:59:12 -04:00
Abe Jellinek
f54becf32e
Render citeproc.js markup in tab titles (#4602) 2024-08-26 07:57:17 -04:00
Dan Stillman
e3c80ac6a0 Add additional files from Zotero 6.0.36 to win32 removed-files
I added some entries in bf59645133 based on an update from an earlier
version, but I missed files that were in the last Z6 build.
2024-08-26 07:53:02 -04:00
windingwind
e6c9d912f1
No menu background when not hovered on MacOS (#4619)
fix: #4614
2024-08-26 07:15:13 -04:00
Dan Stillman
78d59f65df Fix spacing between "Set Up Syncing" and spinner 2024-08-26 07:13:40 -04:00
Dan Stillman
ab814c361a Try to automatically repair "User canceled primary password entry"
Fixes #4540
2024-08-26 07:13:11 -04:00
Dan Stillman
2065a60b79 Update version 2024-08-25 05:08:53 -04:00
Dan Stillman
0d68ac9660 Use current Firefox version when updating win32 .exe 2024-08-25 10:05:45 +01:00
Dan Stillman
f5247cff0d Update Firefox build targets 2024-08-25 05:00:50 -04:00
Dan Stillman
ceb60f5ccc Update Windows build to 115.14.0esr with deelevation disabled 2024-08-25 05:00:46 -04:00
Dan Stillman
3fbe0d62ac Disable launcher deelevation on Windows
Closes #4622
2024-08-25 04:53:24 -04:00
Adomas Venčkauskas
da0e1763a7 Update LibreOffice submodule 2024-08-24 13:29:17 +03:00
Adomas Venčkauskas
5df708d34f Improve word plugin installer logging 2024-08-24 13:28:02 +03:00
Abe Jellinek
f8970b92de Feed abstract: Inherit font size
And fix some code style.

Closes #4600
2024-08-21 12:26:58 -04:00
Dan Stillman
182bfb9a38 OS.Path shim: Add Windows version of fromFileURI() from Fx102
Should fix #4588 for real
2024-08-20 02:50:51 -04:00
Dan Stillman
dba666b990 Update reader submodule 2024-08-20 00:35:32 -04:00
Dan Stillman
4b45b8780d Update locales from Transifex 2024-08-20 00:26:43 -04:00
windingwind
d54f5e516f
Fix context pane lazy load (#4591)
fix: #4548
2024-08-20 00:08:41 -04:00
Dan Stillman
f53ce16b8b OS.Path shim: Add Windows version of normalize() from Fx102
Should fix #4588
2024-08-19 23:58:32 -04:00
Abe Jellinek
a80a9a1598 Feed abstract: Fix scrollbars showing on some abstracts
`clip` somehow doesn't do the trick.
2024-08-19 13:46:59 -04:00
Abe Jellinek
0c9200c862 Feed abstract: Set line-height to 1.5
Fixes #4581
2024-08-19 13:46:22 -04:00
Adomas Venčkauskas
06eb1d7341 Word plugin installer: don't show progress window on repeat attempts to install (#4579) 2024-08-19 08:07:09 -04:00
Adomas Venčkauskas
3d0b5d0099 Update word processor plugin submodules (#4579) 2024-08-19 08:07:09 -04:00
Adomas Venčkauskas
365d6f4295 Fix WinWord plugin installation not running on startup (#4579) 2024-08-19 08:07:09 -04:00
Adomas Venčkauskas
aef0e51186 Throw an error when an update to word processor plugin fails to install (#4579)
- This commit will retrigger the installation for all word processor
  plugins. For the majority of users this will succeed silently.
  - It will fail with an error for Windows users that have Word open.
  - It will succeed with a warning for macOS users that have Word open.
- The updated error prompt links to the new documentation page for
  failed plugin installs
2024-08-19 08:07:07 -04:00
Adomas Venčkauskas
2a0d245018 Refactor and fix code formatting for word-processor-plugin-installer (#4579) 2024-08-19 08:06:08 -04:00
Dan Stillman
cff7e45d90 Update locales from Transifex 2024-08-19 03:40:42 -04:00
Tom Najdek
58234a133a
Fix localized labels after 4f1e449 (#4584) 2024-08-19 03:31:25 -04:00
Tom Najdek
04dbe51280
Fix localize-ftl crashing when attribute is removed. Fix #4583
Updated ftl-tx to a version that includes this fix.
2024-08-18 11:35:30 +02:00
Dan Stillman
cd6c5cd30d Update version 2024-08-18 03:40:04 -04:00
Dan Stillman
d2d4bd8fe5 Update reader submodule 2024-08-18 02:08:16 -04:00
Dan Stillman
6cc03f79f3 Update global schema 2024-08-18 02:08:07 -04:00
Dan Stillman
f8fe506a86 Update locales from Transifex 2024-08-18 02:04:35 -04:00
Dan Stillman
db34491dfd Update English strings for Transifex 2024-08-18 01:47:35 -04:00
Dan Stillman
cc10987dee Fix error loading trash containing collection if bidi.browser.ui == true
https://forums.zotero.org/discussion/116980/zotero-7-0-1-center-right-panes-stop-displaying-items
2024-08-18 01:46:10 -04:00
Dan Stillman
d6c78336da Use line-height: 1.5 for abstracts
Addresses #4581, but need to do feed items separately, since that's in a
browser
2024-08-17 03:15:07 -04:00
Martynas Bagdonas
5dc17be46c Add missing string for reader 2024-08-16 13:04:34 +03:00
Martynas Bagdonas
2e24e046e2 Update reader submodule 2024-08-16 13:02:38 +03:00
Abe Jellinek
1f26b64519
RTL: Small item tree tag display fixes (#4576) 2024-08-16 02:10:52 -04:00
windingwind
0f866d6d33
Fix Context Pane doesn't work in stack mode (#4578)
fix: #4577
2024-08-16 02:10:33 -04:00
Tom Najdek
596703b21b
Fix inverted tag colors order. Resolve #4569 2024-08-15 11:15:51 +02:00
windingwind
ca9508ebce
Lazy load attachment preview (#4568) 2024-08-15 02:22:24 -04:00
Dan Stillman
ec7ffa8c0e Windows installer: Warn if installing x64 on ARM system 2024-08-15 04:58:16 +01:00
Dan Stillman
a83852367f Fix 64-bit installer refusing to run on non-ARM systems
Regression from b8b4bebf
2024-08-14 22:49:02 -04:00
Dan Stillman
874f42df36 Update utilities submodule
Includes zotero/utilities#36
2024-08-14 17:59:48 -04:00
Abe Jellinek
f0d453187d Fix editable-text dir not affecting existing input 2024-08-14 11:19:04 -06:00
Abe Jellinek
64238d56bc Fix circular reference in getDirection()
Was preventing the field-specific switch branch from being reached.
2024-08-14 11:19:04 -06:00
Tom Najdek
4f1e44978e
Fix <wizard> sometimes starts with the wrong title. Resolve #4533.
This is caused by
https://searchfox.org/mozilla-central/source/toolkit/content/widgets/wizard.js#417-428
where fluent attribute is removed and replaced with the default value.
We need to stick with `data-header-label-id` until this is resolved
upstream.
2024-08-14 17:53:33 +02:00
Tom Najdek
ca83e4303c
Windows installer: Add option to remove installdir when previous installation detected (#4564) 2024-08-14 04:53:19 -04:00
Dan Stillman
f5af1898fd Proper fix for getDirection() problems
Hopefully the last fix for my edits to 181afb9 (#4534)

Follow-up to the previous two commits
2024-08-14 04:01:26 -04:00
Dan Stillman
531e8697be Fix additional breakage when bidi.browser.ui is true
Broken by me in an edit to 181afb9 (#4534)

Follow-up to previous commit
2024-08-14 03:42:08 -04:00
Dan Stillman
ec50539e80 Make Zotero.ItemFields.getBaseIDFromTypeAndField() more resilient
- Return base field instead of throwing if base field is passed for a
  type that has a base-mapped field
- Return false instead of throwing for invalid type-field combination
2024-08-14 03:14:29 -04:00
abaevbog
53ad856ef4
vpat 31 and 33 - aria tweaks for Tools > Plugins (#4560)
- vpat 31: mark which menuitems' button is checked,
otherwise selected options (e.g. Update plugins automatically)
are not announced as such
- vpat 33: when plugin details pane appears, remove
a misleading role="tabpanel" from its section because
it is not structured as a collection of tabs
2024-08-13 16:46:46 -04:00
Adomas Ven
ed311cacb9
Show a different error message for WinWord when no document is found (#4563)
And link to a different troubleshooting page
2024-08-13 16:13:00 -04:00
Dan Stillman
5d998a3b37 Load brand.ftl for Zotero.getString() 2024-08-13 16:06:47 -04:00
windingwind
0530afd669
Fix two item panes occasionally appear at same time (#4561) 2024-08-13 02:43:14 -04:00
Dan Stillman
d879c507a5 Enable auto-scroll by default on Linux
Fixes #4537
2024-08-13 00:06:34 -04:00
Dan Stillman
97650efe05 Fix blurry creator row buttons on non-HiDPI displays
From @yexingsha

Fixes #4549
2024-08-13 00:06:21 -04:00
Dan Stillman
9b23755190 Update CSL locales
Includes https://github.com/citation-style-language/locales/pull/319
2024-08-13 00:06:21 -04:00
abaevbog
8c3f13909c
vpat 59: make quickFormat reference box separator text darker (#4400)
So that on Windows, the separator text on white background
has a high enough contrast ratio for accessibility

Also remove opacity when reference panel opens. Without the opacity
on the reference panel, there is a shadow appearing below and to the
right of the panel on Windows. If we let the panel render with
opacity: 0.9 and only then set opacity: 1, the panel will no longer
be transparent and there will be no shadow.
2024-08-13 00:05:11 -04:00
Abe Jellinek
a566d83411 Migrate to our editMenuOverlay.js 2024-08-12 15:25:31 -06:00
Abe Jellinek
d5deb406d7 Include editMenuOverlay.js in Web Link dialog
Fixes #4544
2024-08-12 15:24:56 -06:00
Abe Jellinek
16bb95ad3f
Collection tree: Keep editing state through refresh (#4556) 2024-08-12 16:43:49 -04:00
Abe Jellinek
51fe17c13d editable-text: Don't move cursor when value/alignment changes on focus (#4534)
For example, clicking in the middle of the Accessed field would move the
cursor to the end, no matter where the click happened. Clicking and
dragging when the field wasn't already focused would select from the
beginning of the field to the drag position.
2024-08-12 15:09:27 -04:00
Abe Jellinek
181afb92ac Bidi improvements and fixes (#4534) 2024-08-12 15:09:10 -04:00
Abe Jellinek
98b3745a20
Update Notes section on add (#4554) 2024-08-12 15:06:09 -04:00
Dan Stillman
b1b06cedde Windows installer: Remove some "Zotero Standalone" references 2024-08-10 04:27:07 -04:00
Dan Stillman
b8b4bebfc5 Windows installer: Improve architecture detection
Show an appropriate error if the ARM64 installer is run on non-ARM
Windows or if the x64 installer is run on a 32-bit system, and set the
correct architecture in `CurrentVersion\Uninstall` registry key.

Also fix `x86`/`x64` being swapped in the registry
(https://groups.google.com/g/zotero-dev/c/1Aju4t2TNTo/m/Ga4V8vLrAQAJ)
2024-08-10 04:26:58 -04:00
Dan Stillman
6e155de3e1 Windows installer: Change HAVE_64BIT_OS to HAVE_64BIT_BUILD
https://bugzilla.mozilla.org/show_bug.cgi?id=598615
2024-08-10 02:14:40 -04:00
Dan Stillman
b564924c7c build_and_run: Fix debugger not showing Zotero sources when using d
`-jsconsole` somehow prevented Zotero sources from showing up in the
Debugger tab of the Browser Toolbox, but there's no reason to show the
Browser Console when we're showing the Browser Toolbox, so just don't
pass `-jsconsole` when `d` is passed.

Fixes #4503
2024-08-10 01:32:46 -04:00
Abe Jellinek
041d190286
Item box: Remove hidden buttons from flex calculations (#4541) 2024-08-09 13:53:25 -06:00
Abe Jellinek
b3589e1d89 macOS menupopup styles: RTL fixes
- Use padding-inline-start for gutter
- Refactor other rules that used left/right margins/paddings, to make
  future accidental breakage less likely

Fixes #4538
2024-08-09 13:15:26 -06:00
abaevbog
a7eb49162e
tweaks to Zotero_Tooltip behavior (#4523)
- hide tooltip on click and make sure it does not appear
for a bit to avoid race conditions (e.g. clicking
right after mousemove stopped)
- do not display a tooltip if a mouse key is being
held (e.g. during drag in itemTree)

Fixes: #4519
2024-08-09 12:23:31 -04:00
windingwind
69b4789c17
Unify richlistitem styling rules (#4511)
Unify richlistitem styling rules

- Fix richlistitem unwanted focus ring on Linux
fix: #4510
- Simplify richlistbox styling rules and do not follow Mozilla code
- Use --default-focusring-width for v-table
2024-08-09 15:57:56 +03:00
Dan Stillman
b7bfdd5f7c Update version 2024-08-09 00:51:55 -04:00
Dan Stillman
f55d5c1067 Set version to 7.0 2024-08-09 00:32:47 -04:00
Dan Stillman
5d54b4d37d Handle absence of Z7 incrementals 2024-08-09 05:20:58 +01:00
Dan Stillman
4816eed0f4 Handle 0 incrementals 2024-08-09 00:17:56 -04:00
Dan Stillman
c8fbad4be7 Update release script for 7.0 2024-08-09 00:17:04 -04:00
Dan Stillman
794dc6bf01 Updated icons for creator row buttons
Fixes alignment issues brought up in
https://github.com/zotero/zotero/pull/4535#issuecomment-2276347669

From @yexingsha
2024-08-08 23:33:15 -04:00
Abe Jellinek
2d32efbccd
Apply tag text color to ellipsis (#4536) 2024-08-08 22:54:10 -04:00
Dan Stillman
9dd3807683 Wider icon for creator-field-mode button (#4535) 2024-08-08 22:50:47 -04:00
Bogdan Abaev
7450622047 itembox: switch creator mode button (#4535)
- added button to switch mode to creator rows
- removed that option from options menu
- extra tweak to avoid cursor flickering during re-render after
clicking on the button
- increased itemPane min-width to 320px

Fixes: #3959
2024-08-08 22:50:26 -04:00
Tom Najdek
19dad92b92
No longer create <browser> instance for each AbstractBox. Fix #4530 (#4532) 2024-08-08 17:54:17 -04:00
Tom Najdek
083ad9ee05
Fix missing margin between colored and emoji tags
In the item tree, emojis are spaced 4px apart, but there was no space
between the colored circles and the first emoji, making it look crowded.
2024-08-08 18:09:19 +02:00
Dan Stillman
7f21da9334 Revert "Add additional backslashes in Exec line in Linux desktop file"
This reverts commit 06741ceb62.

A couple people on Fedora 40 reported that the desktop file was no
longer working for them after this change, and it's not clear that
anyone was having trouble on Ubuntu before it -- someone just noted that
`desktop-file-validate` was showing some warnings.
2024-08-08 07:40:39 -04:00
windingwind
6f6444dc12
Fix tab bar scroll arrow button click not working (#4529)
fix: #4527
2024-08-08 04:19:41 -04:00
windingwind
01f9222735
Remove form element rule !important suffix on Windows (#4528)
Fix tab bar button hover effect on Windows
A follow up fix of #4518
2024-08-08 03:40:59 -04:00
abaevbog
4c32317ba4
Quick Format: Prevent CSS override of background color (#4525)
Followup to 55017926b5
2024-08-08 01:39:18 -04:00
abaevbog
35da1187b3
prefs: fix text-link not clicking on space/enter (#4522)
Fix regression after 117197e11d
where space or enter would not trigger a click on
link outside of the main window.

".keyboard-clickable" is handled by listener in ZoteroPane,
so links outside of it (e.g. preferences) are not affected by it.
For now, just explicitly handle "keypress" event by the
zotero-text-link component.

Also, added a focus-ring around the link so it is visible
when it is focused.

Fixes: #4521
2024-08-08 00:24:19 -04:00
Abe Jellinek
531f55120c
Feed settings: Make disclosure triangle focusable, extract SCSS (#4513)
- <hbox> -> <button>, <toolbarbutton> -> <dropmarker>
- Extract styles to SCSS and use focus-ring mixin

Fixes #4512
2024-08-08 00:22:09 -04:00
Abe Jellinek
14ab0cd529
Fix button selector specificity on Windows (#4518)
And remove !important.
2024-08-08 00:21:26 -04:00
Tom Najdek
214a668286
Trim plural/selector variants in ftl-to-json
Updated ftl-tx to a version that includes this fix.
2024-08-07 11:41:37 +02:00
Tom Najdek
4bdbc1a2fe
Trim whitespaces in JSON from Transifex
Updated ftl-tx to a version that includes this fix.
2024-08-07 09:47:09 +02:00
Dan Stillman
d869d7898e Update locales from Transifex 2024-08-07 03:38:14 -04:00
abaevbog
b72bcc3118
tagsbox: focus new tag row on shift-enter (#4514)
On shift-Enter from any tag, add a new empty tag at the
bottom and focus it. Alternative to tabbing to + button
and clicking it.

Fixes: #4394
2024-08-07 03:03:38 -04:00
windingwind
55017926b5
Fix window background overflow when no native titlebar (#4516) 2024-08-07 03:01:59 -04:00
Abe Jellinek
206496332d EPUB recognition: Fix DOI search results being thrown away
https://forums.zotero.org/discussion/116524/epub-articles-and-books-not-getting-metadata-like-pdfs
2024-08-06 11:07:29 -04:00
Abe Jellinek
24aed7d530 RecognizeDocument tests: Extract waitForProgressWindow() 2024-08-06 11:07:28 -04:00
Abe Jellinek
c1f681a228 EPUB indexing: Skip if textMaxLength is 0
Like we do for PDFs already.
2024-08-06 11:07:27 -04:00
Dan Stillman
151218e4de Update locales from Transifex 2024-08-06 02:25:39 -04:00
Dan Stillman
79a3cbd182 Update pdf-worker submodule 2024-08-06 02:25:39 -04:00
Martynas Bagdonas
2ac677e848 Update reader submodule 2024-08-06 09:23:01 +03:00
Adomas Venčkauskas
0cac4f5c86 Update LibreOffice submodule 2024-08-06 08:48:46 +03:00
Adomas Venčkauskas
46813ff9ed Fix citation upgrade code from Zotero 6.0
Report https://forums.zotero.org/discussion/116459/z-beta-the-zotero-field-code-corresponding-to-this-citation-has-been-corrupted
2024-08-06 08:48:46 +03:00
abaevbog
0352fa35b4
OpenURL resolver pref: Fix glitchy drop-down keyboard navigation (#4506)
- minor refactoring to avoid deleting the first ("Custom") menuitem
of the resolver menulist. It is the first item that is selected when
popup opens and deleting it confuses keyboard navigation, so that
arrowDown/Up won't navigate the menu (unless the menu is hovered
over with a mouse)
- explicitly re-select the first item when the menulist closes.
Otherwise, in case of having navigated the menus with arrows
without changing selection and closing the popup, next time
resolver selector appears, arrowUp/Down will not navigate the list.
Only occurs on Windows.
- clear the resolver menus (except for the 1st item) when the popup closes
so that arrowUp/Down on focused dropdown don't select invalid
top-level menus (e.g. "North America").
- make sure that if the URL has been edited, the resolver dropdown's
value will switch to "Custom" even if the resolvers were not loaded

fixes: #4491
2024-08-06 01:31:47 -04:00
Dan Stillman
802210a6bc Quick Format: Use 450px for max-width 2024-08-06 01:21:56 -04:00
Bogdan Abaev
d446fc3c6f Quick Format: wrap description text of citation properties
- set max-width on the actual citation properties popup
- refactor _buildItemDescription to construct item description
as an array of spans, instead of labels, so that the
text can properly wrap.
2024-08-06 01:21:52 -04:00
Abe Jellinek
36e499c259
ExternalLinkHandler actor: Open some links internally, incl. styles (#4505) 2024-08-06 01:12:41 -04:00
windingwind
129938c8fe
Fix quick search styling (#4501)
fix: #4497
fix: #4498
2024-08-05 05:01:59 -04:00
abaevbog
c5027106c2
fix keyboard focus not landing on feeds itemTree (#4495)
Do not use specific "#item-tree-main-default" selector to
find the itemTree node to focus since a different id
can be set for the table, e.g for the list of feeds.

Use a more general "zotero-items-tree .virtualized-table"
selector to focus the itemTree on tab from quickSearch
and on Escape keypress from an editable-text of itemPane.

Fixes: #4494
2024-08-05 00:39:39 -04:00
Dan Stillman
256efd3195 Update utilities submodule
For zotero/utilities#28
2024-08-05 00:28:42 -04:00
Dan Stillman
e307b5e4d8 Update English strings for Transifex 2024-08-04 08:35:26 -04:00
Dan Stillman
4e889934b9 Use 28px tree row height in Comfortable mode at default font size
In line with design
2024-08-04 08:34:39 -04:00
Dan Stillman
71d2cbd66a Clarify 32-bit upgrade message 2024-08-04 08:33:31 -04:00
Dan Stillman
b4f6c050e5 Update reader submodule 2024-08-03 02:20:06 -04:00
Dan Stillman
17c0aa9ef3 Update locales from Transifex 2024-08-03 02:19:09 -04:00
Dan Stillman
833b85d33a Use 22px tree row height in Compact mode at default font size
In line with design

Tested on macOS and Windows
2024-08-03 02:08:17 -04:00
Abe Jellinek
30cb2e1721
Retrieve Metadata & Create Parent: Use autoRenameFiles.fileTypes (#4488) 2024-08-03 01:30:07 -04:00
Abe Jellinek
8209ee6279
File Renaming: Rearrange prefs (#4487) 2024-08-03 01:28:28 -04:00
Kassian Sun
aa19153ebc
Setting - Feeds fix misaligned unread/read cleanup option (#4489) 2024-08-03 00:27:30 -04:00
Tom Najdek
144f2caed8
Use production builds of react libraries (#4482)
And remove patching that doesn't seem to be required anymore
2024-08-02 03:43:02 -04:00
Abe Jellinek
11a5853657
Auto-rename file and set automatic title after Create Parent Item (#4474) 2024-08-02 02:44:41 -04:00
Abe Jellinek
e40cf686bc Remove duplicate CSS rule 2024-08-02 02:01:34 -04:00
Abe Jellinek
56bcd8e69c lookup.js: Code style fixes
Should look into updating our ESLint config so it doesn't yell so much
about multiline comments at the beginning of blocks.
2024-08-02 02:01:34 -04:00
Abe Jellinek
1ca243fa8c Add by Identifier: Fix popup positioning 2024-08-02 02:01:34 -04:00
Abe Jellinek
41031bc995 Update reader submodule 2024-08-01 13:13:30 -04:00
Abe Jellinek
6cb6dd3bb5 File renaming: Fix empty value being added when all types are disabled
And filter out empty values in isRenameAllowedForType() in order to
handle bad pref values set before this commit.

Follow-up to aab90527ec
2024-08-01 10:30:21 -04:00
Abe Jellinek
aab90527ec isRenameAllowedForType(): Handle empty autoRenameFiles.fileTypes
Previously, an empty value for the pref would be treated as matching
*every* MIME type, because s.startsWith('') is true for any string. That
meant that unchecking all the file type checkboxes would actually enable
renaming for all files.
2024-08-01 10:21:18 -04:00
Martynas Bagdonas
61d6ef8d3d Fix context pane leak keeping reader and note-editor iframes in memory
Fixes #4447
2024-08-01 16:04:15 +03:00
Dan Stillman
687399d9b0 Update styles submodule 2024-08-01 01:45:28 -04:00
Dan Stillman
f93718d0af Update reader submodule 2024-08-01 01:45:28 -04:00
windingwind
9a9f11c5e3
Fix attachment annotation box render on non-PDF items (#4478) 2024-08-01 01:45:03 -04:00
Tom Najdek
7c3d04e03a
Warn users running non-ARM version on ARM CPU (#4473) 2024-08-01 01:22:03 -04:00
Abe Jellinek
41fe1e4aea
Create Parent Item: Only call ReactDOM.createRoot() once (#4472)
Also applied to Zotero.AnnotationBox
2024-08-01 00:44:34 -04:00
Abe Jellinek
255de649ca
Autofocus input in Create Parent Item dialog (#4476) 2024-08-01 00:28:53 -04:00
Abe Jellinek
804b2d1216
Tests: Fix importFileAttachment() logic, update outdated test (#4475)
After dd16017
2024-07-31 16:24:19 -04:00
Dan Stillman
374dab2cb4 Update translators 2024-07-31 03:33:31 -04:00
Dan Stillman
93c4fd346f Update locales from Transifex
And fix some whitespace issues
2024-07-31 03:32:47 -04:00
windingwind
98d1f84263 Fix banner style on Windows (#4466)
fix: #4449
2024-07-31 03:23:51 -04:00
windingwind
ed983484d1
Fix note editor tooltip (#4436) 2024-07-31 03:19:26 -04:00
Dan Stillman
072cf33de2 Update locales from Transifex 2024-07-31 03:18:45 -04:00
Dan Stillman
3d85eb663c Merge new English strings 2024-07-31 03:18:45 -04:00
Dan Stillman
fd232e8ac5 Update reader submodule and add new reader strings 2024-07-31 03:18:45 -04:00
Abe Jellinek
dd1601793c
Don't set default attachment title if not renaming file (#4459)
Except from Rename File from Parent Metadata.
2024-07-31 01:39:25 -04:00
windingwind
06f359df23 Fix merge window style (#4430) 2024-07-31 01:37:37 -04:00
windingwind
99a2b83cb6 Fix CR attachment box (#4430) 2024-07-31 01:37:31 -04:00
Abe Jellinek
15fa86410d Update Advanced Search styles (#4464) 2024-07-31 01:35:48 -04:00
Abe Jellinek
fbcadd06ba Update progress queue dialog styles (#4464) 2024-07-31 01:35:43 -04:00
Abe Jellinek
74b86a7033 Make macOS control normalization into a mixin (#4464)
And include in stylesheets that have been updated.

Have to make sure not to include this mixin in the global scope in
stylesheets that are themselves imported elsewhere (i.e., filename
begins with an underscore).
2024-07-31 01:35:31 -04:00
windingwind
c7757131a6
Fix Prefs window style on Windows (#4465) 2024-07-31 01:28:05 -04:00
windingwind
6530ccd101
Fix Zotero.Item.fileExists calling on unsaved item (#4468) 2024-07-31 01:19:31 -04:00
Tom Najdek
a538a5588e
Reset file renaming preference if input left empty (#4462) 2024-07-30 23:08:41 +02:00
Dan Stillman
1d5971c48f Windows: Change Zotero version in "Add or remove programs" after update
Fixes #4454
2024-07-30 02:20:04 -04:00
Abe Jellinek
73a317b8d8 Add gap between file type checkboxes on macOS (#4458) 2024-07-30 01:29:12 -04:00
Abe Jellinek
c836fb3448 Move negative margin on checkboxes/radios (#4458)
Move it from the parent element (<checkbox>, <radio>) to the first child
(.checkbox-check, .radio-check). This way, margins set by classes like
.indented-pref don't negate our global styles.
2024-07-30 01:29:12 -04:00
Dan Stillman
fadcdcaef9 Use "Plugins" everywhere in Add-ons Manager
But we still need to switch to our own strings so they can be localized

Fixes #3354
2024-07-28 04:14:32 -04:00
Dan Stillman
80cc971251 Merge new English strings 2024-07-28 03:34:25 -04:00
Dan Stillman
ba7ab0c262 Update English strings for Transifex 2024-07-28 03:31:17 -04:00
Dan Stillman
8df6661f7e Tweak RTF Scan intro text 2024-07-28 03:30:23 -04:00
Abe Jellinek
9d8845b961 Locate manager: Fix button spacing (#3807) 2024-07-28 03:26:39 -04:00
Abe Jellinek
1573d251e0 Advanced Search: Fix button spacing (#3807) 2024-07-28 03:26:36 -04:00
Abe Jellinek
9a2d6fd8c0 Preferences: Remove Reset button font-size override (#3807) 2024-07-28 03:26:34 -04:00
Abe Jellinek
10c3459a70 Preferences: Make macOS help button smaller (#3807) 2024-07-28 03:26:31 -04:00
Abe Jellinek
3d0014f258 Preferences: Fix styling a bit (#3807)
- Don't import global Zotero SCSS
   - I think this was always a mistake - preferences have their own
     root SCSS file (preferences.scss) and don't need zotero.scss
- Don't add margins on radio or button labels
   - Like above - I don't think this was correct even before the latest
     button style tweaks!
- Don't add global margins
   - Otherwise we start an arms race with all the other elements in the
     pane - anything without a margin-inline-start will look like it's
     sticking out to the left. Apply specific margins instead.
2024-07-28 03:26:28 -04:00
Abe Jellinek
75cb9d44bd Add global button/radio/checkbox styles (#3807) 2024-07-28 03:26:24 -04:00
Abe Jellinek
5f717d3bde Show first-run banner on upgrade (#3807) 2024-07-28 03:26:12 -04:00
abaevbog
1cdb364361
Fix first row of itemTree not getting announced (#4448)
Tweak to the conditional to check if something is focused
via selection.count (instead of selection.focused which
defaults to 0 and fails on the first focused item).

Post: 40fd5efe05.

Fixes: #4444
2024-07-28 02:59:01 -04:00
Tom Najdek
00ae8bb9b2 Add more features to the file renaming functionality (#4424)
* New `attachmentTitle` field, returns the title of the current attachment (or
  the future title of the attachment being created)
* New function `match` to enable testing values with a regex.
* New function `start` to enable truncating from the beginning.
* Ignore new line characters in the template for easier editing.
* Avoid repeated characters when changing case (snake/dash)
* Increase the size of the template input field.

Closes #3252
2024-07-28 02:57:14 -04:00
Grace Dinh
29f4aece24 Add regex replace feature for file renaming (#3562) 2024-07-28 02:56:19 -04:00
Abe Jellinek
4187819cd1
File renaming: Match content type prefixes, add UI (#4431) 2024-07-27 03:01:43 -04:00
Abe Jellinek
4653059536
Select Items dialog: Change accept button label to Select (#4441) 2024-07-27 02:49:22 -04:00
abaevbog
8b67fbcdce
Select Items Dialog: restore tab order (#4442)
After redesign, tab order became: quickSearch -> itemTree ->
cancel and accept buttons -> collectionTree.

This restores original tab sequence: quickSearch -> collectionTree ->
itemsTree -> cancel and accept buttons.
2024-07-27 02:16:38 -04:00
Abe Jellinek
6a99fb673a Remove now-unused string (#4397) 2024-07-27 02:11:58 -04:00
Abe Jellinek
629c5ecab2 Find Full Text: Support Atypon (#4397)
Don't remove all query strings when normalizing URLs - keep 'download'
so that Atypon PDFs/EPUBs resolve correctly.
2024-07-27 02:11:58 -04:00
Abe Jellinek
7020d60351 Generalize Find Available PDF -> Find Full Text (#4397) 2024-07-27 02:11:22 -04:00
Dan Stillman
297af9b409 Remove some additional Firefox modules and avoid logged errors 2024-07-27 02:10:20 -04:00
Dan Stillman
99df46cbbb Better architecture reporting in error reports 2024-07-27 02:10:19 -04:00
Dan Stillman
a92521bd30 Identify Windows 11 as Windows 11 2024-07-27 02:10:19 -04:00
windingwind
8c5d4c7cd5
Add plugin blocking list (#4438) 2024-07-27 00:23:31 -04:00
Abe Jellinek
b71547469f Select Items dialog: Use drawintitlebar, not chromemargin
Fixes missing window border/shadow and makes it possible to drag the
dialog on Windows.

Closes #4440
2024-07-26 11:44:28 -04:00
Dan Stillman
2917f41cb9 Update note-editor submodule 2024-07-26 04:28:48 -04:00
Abe Jellinek
7c7d8c1433
Implement Select Items dialog redesign (#4406) 2024-07-26 02:55:43 -04:00
Abe Jellinek
1463b58b5b Preferences: Make _syncToPrefOnModify work like _syncFromPref 2024-07-25 12:57:43 -04:00
Abe Jellinek
dbc8b9bfed Select Items dialog: Double-click to accept
Closes #4428
2024-07-25 10:13:21 -04:00
Dan Stillman
bf59645133 Update removed-files for Win32 and Linux after #3133 2024-07-25 03:12:34 -04:00
Dan Stillman
8076c97900 Merge new English strings 2024-07-25 03:00:09 -04:00
Dan Stillman
2d8bcce314 Update reader submodule 2024-07-25 02:58:59 -04:00
Dan Stillman
9b38d3a02f Don't touch precomplete or removed-files in build_autocomplete.sh
Follow-up to ef2cceba7
2024-07-25 02:58:19 -04:00
Dan Stillman
352647a068 Fix path to removed-files on Linux
Follow-up to ef2cceba7
2024-07-25 06:29:27 +00:00
Dan Stillman
cf389ff20f Update removed-files for macOS after #3133
This is all the files removed since 5.0.
2024-07-25 02:13:52 -04:00
Dan Stillman
0f777efbf6 Don't bundle Safari extension test files 2024-07-25 02:13:22 -04:00
Dan Stillman
4bd46821de Stop using deprecated argument syntax for macOS codesign 2024-07-25 02:13:22 -04:00
Dan Stillman
ef2cceba7e Fix deleted files not getting removed after complete updates
Mozilla uses a `precomplete` file to delete local files when doing a
complete update, but since Zotero 5 in 2017 we've just been bundling an
empty file, which has meant that deleted or moved files have been left
behind. Among other things, this has likely been the primary cause of
Safari App Extension post-update brokenness for many years.

Incremental updates weren't affected, since those include explicit
removal instructions for moving from the given build to the latest one.

This restores proper generation of the `precomplete` file during builds,
using the Mozilla script added in 74ec6620e.

Separately, we'll update the `removed-file` for each platform to remove
files that should've been removed during previous updates.

Fixes #3133
2024-07-25 02:13:22 -04:00
Abe Jellinek
9a43e8f057 Related box: Filter out missing items
Fixes #4427
2024-07-24 16:58:31 -04:00
Martynas Bagdonas
10adea71fc Add "Citation" string for note editor 2024-07-24 17:36:28 +03:00
Martynas Bagdonas
32f7919952 Update note-editor submodule 2024-07-24 17:32:03 +03:00
Martynas Bagdonas
d825b51db6 Fix and enable reader tests
Fixes #3256
2024-07-23 11:12:32 +03:00
Abe Jellinek
0944f3bdc6 Item pane header: Show default context menu for attachment titles
Closes #4415
2024-07-22 12:45:18 -04:00
Martynas Bagdonas
c2575d2a14 Gray out "Import Annotations…" in reader window when no annotations
Fixes #4416
2024-07-22 14:42:14 +03:00
Dan Stillman
74ec6620e3 Add Mozilla script to generate precomplete file 2024-07-22 03:05:14 -04:00
abaevbog
c5c613c82c
vpat 80: focus first field in search window/dialog (#4402)
Instead of focusing the first condition, which ends up placing
focus in the middle of the new window or modal. It is best
to focus the first node, which is the general convention,
per https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/, and
what many screen reader users expect. When we focus a field in
the middle of the window/dialog, it makes it seem for some users
that this is the first node, which will make them miss all the
fields above it.

Also, linked search name input to its label in searchDialog.xhtml.
2024-07-21 06:02:50 -04:00
Dan Stillman
846279da01 Use include.js in customElements.js 2024-07-21 06:01:43 -04:00
Dan Stillman
8a075dce9e Fix error generating header in updates window 2024-07-21 06:01:26 -04:00
Dan Stillman
1d0cdf4df0 Fix "Check for Updates" button in startup error dialog 2024-07-21 05:59:25 -04:00
Dan Stillman
3b1cb2b9c2 Avoid error if item is modified before collections pane is loaded
E.g., during Extra field migration at startup
2024-07-21 05:57:17 -04:00
Dan Stillman
9446f7f583 Fix Collection [n] not yet loaded startup error
Can happen during Extra field migration at startup due to
Item::getCollections() change in 2d3375e9f6 that requires collections
to be loaded

https://forums.zotero.org/discussion/115993/collection-not-yet-loaded-error-on-startup
https://forums.zotero.org/discussion/116137/zotero-cannot-be-used-after-updating-to-the-latest-version
2024-07-21 05:57:04 -04:00
Dan Stillman
7e01a7d0ec Merge new English strings and fix some backslash errors 2024-07-20 02:35:03 -04:00
Martynas Bagdonas
d16ea8fe15
Enable type change between highlight and underline (#4411) 2024-07-20 02:27:11 -04:00
Dan Stillman
e20e62d4f7 Update reader submodule 2024-07-20 02:24:27 -04:00
Dan Stillman
934a74fba4 Use -jsdebugger for build_and_run, and don't bind devtools on port 6100
Since -jsdebugger apparently works fine, there's no reason to connect to
Zotero from Firefox anymore. So just open the Browser Toolbox when
passing the -d flag to build_and_run, and stop having the devtools
server listen on port 6100 for devtools-enabled builds, since
-jsdebugger uses a random port of its own.
2024-07-20 02:20:03 -04:00
Dan Stillman
34eb8205d1 Fix -jsdebugger flag on Linux
https://groups.google.com/g/zotero-dev/c/h4_UZDml-10/m/DjQCcl6PAAAJ
2024-07-20 02:16:32 -04:00
Martynas Bagdonas
532ae729c0 Implement highlight ↔ underline annotation conversion (delete, recreate)
#3744
2024-07-19 14:31:46 +03:00
Martynas Bagdonas
10fecce381 Add missing File → Import Annotations option to reader window
Fixes #3864
2024-07-19 12:20:22 +03:00
Dan Stillman
691d26886f Update locales from Transifex 2024-07-19 04:27:15 -04:00
Dan Stillman
6969ce394c Update reader submodule 2024-07-19 02:42:46 -04:00
windingwind
b04f2c8ccb
Fix context notes pane not load (#4289)
fix: #4284
introduce a new notifier type "load", "tab", a follow up fix to #4174

---------

Co-authored-by: Bogdan Abaev <bogdan@zotero.org>
2024-07-19 02:41:45 -04:00
abaevbog
53fed83e05
do not save edits on Escape in reader tags popup (#4399)
<panel> takes over Escape handling by just closing the popup via
what looks like a capturing listener on document, since Escape
keydown events never even reach the popup itself. When the popup
is just closed like that, tagsBox is blurred so all unwanted edits get saved.

To properly handle Escape, attach our own capturing listener that will
reset all edits before the popup is closed.

Fixes: #4398
2024-07-19 02:34:28 -04:00
Abe Jellinek
38391f356c
Restore autoscroll support in reader (#4405)
- Mozilla's ActorManagerParent was only being imported when devtools
  were initialized (either by opening the Error Console or by connecting
  via remote debugging). Import it in our ActorManager so Mozilla
  actors, including AutoScroll, are always registered.
   - This may have other effects! I'm assuming most of us test with
     the error console visible, though, so we would've had Mozilla
     actors, while users running without devtools wouldn't have. We
     definitely want those actors. (Most of them, at least.)
- Don't override autoscroller styles with our panel customizations.
2024-07-19 01:57:45 -04:00
Abe Jellinek
192ea54de0 Update reader submodule
Addresses #4401
2024-07-18 10:56:37 -04:00
abaevbog
e6b5ba60dd
fix tab not scrolling into view (#4404)
After react 18 update, the tab node may not yet be rendered
by tabBar.jsx when we try to scroll it into view in Zotero_Tabs.select.

- To make sure scrolling happens when rendering is done, move scroll-related
logic into a useEffect of tabBar.jxs. It also makes sure that we'll scroll to
a selected tab if it is moved via context menu to the very beginning or the end.

- Added a small scroll-padding to tabs container to make sure the border
does not get cutoff after the tab is scrolled into view instead of
JS code accounting for the border.

- Fixed a glitch where the pinned library tab would not get selected
on shift-tab from opened tabs menu.

Fixes: #4382
2024-07-18 02:19:07 -04:00
abaevbog
40fd5efe05
vpat 48: announce selection for default virtualized table (#4391)
* vpat 48: announce selection for default virt table

For simpler virtualized tables
(e.g. style manager in Zotero_Preferences.Cite), the table
does not get re-rendered when selection changes, so
aria-activedescendant does not get updated in render().

- a single function to update aria-activedescendant of the table
- call it in _updateTree of the tree selection because _onSelection
is not called the very first time a table is rendered. In that case, after
restart, collectionTree would have a selected row but no aria-activedescendant
- remove this.forceUpdate() from selection handlers of itemTree and
collectionTree because judging by the coment it's main purpose was to set
aria-activedescendant through render()
- set aria-activedescendant in _onSelection handler
of virtualized table. 
- construct and set aria-label for rows build via
makeRowRenderer of VirtualizedTable so that is is
announced when the row is selected.
2024-07-17 10:34:16 +03:00
Martynas Bagdonas
a46f1bcbbb Fix reader popups being covered by contextPane in Stacked View mode
Fixes #3542
2024-07-16 15:12:26 +03:00
Dan Stillman
220bb43830 Update reader submodule 2024-07-16 03:44:31 -04:00
Bogdan Abaev
ed1f3853b4 fix shift-Enter tagsbox inconsistent glitches (#4231)
- remove earlier shift-Enter behavior that makes tag's
input multiline.
- shift-Enter will function just as Enter by saving the
tag and allowing focus to return to reader or itemTree.
- except after pasting multiple tags which will still turn
the tags input into a multiline field. Then, shift-enter
will add a new line, just as with any other multiline
editable-text.
2024-07-16 02:36:10 -04:00
Bogdan Abaev
16a5b5b6bc add aria-label to tag edit fields (#4231) 2024-07-16 02:36:02 -04:00
Bogdan Abaev
a73035c848 vpat 66-68: fix focus within tagsBox popup (#4231)
- focus will always enter the tagsBox popup opened from the reader
- escape from within the popup with tagsBox will close the popup (vpat
  67)
- one should not be able to collapse the tagsBox. Added `collapsible`
  getter and setters to the collapsible panel to prevent the section
  from changing its open status. This may be also used in other cases,
  such as to prevent itemBox from being collapsed in duplicates mode.
- patched a glitch where tab from the last empty tab input would loose
  focus.
- changed the `menupopup` for `panel` to display the `tagsbox` because
  `menupopup` has implicit `role="menu"` which is not meant to contain
  inputs, so voiceover completely looses cursor when inputs are focused
  inside of the popup. Also, tweaked spacing a bit to avoid the
  focus-ring getting cutoff.

Addresses: #4222
Fixes: #4230
Fixes: #4226
Addresses: #4388
2024-07-16 02:35:53 -04:00
Tom Najdek
f227aeb6e0
File renaming: suppress duplicate suffixes #3317 (#4389) 2024-07-16 01:59:07 -04:00
abaevbog
25d0cf66bd
save itemPane title/abstract fields on blur (#4390)
As opposed to 'change' event.

Because if the field is editted and another window is focused
while the cursor is in the field, the change event will be
swallowed and when the field finally looses focus, it will not
be saved.

This may address the reported issue of edits not being saved in
title and abstract fields.

Addresses: #4388
2024-07-16 01:35:35 -04:00
Martynas Bagdonas
abad33116b Add reader text selection popup annotation mode toggle pref
Fixes #3352
2024-07-15 15:43:53 +03:00
Dan Stillman
06741ceb62 Add additional backslashes in Exec line in Linux desktop file
https://github.com/zotero/zotero/issues/4163#issuecomment-2220309854
2024-07-15 04:20:39 -04:00
Dan Stillman
d949748945 Update reader submodule 2024-07-15 04:15:27 -04:00
abaevbog
26f7c707ba
display emojis from color-less tag in itemTreeRow (#3330)
- display the first continuous span of emojis in the primary cell of
the itemTree for non-colored tags.
- the emojis appear after the colored tags' circles (if any)
- to keep things consistent with itemTree, sort tags in the tagsBox in
the following order: colored tags first sorted by their position,
emoji tags after sorted alphabetically, followed by remaining tags sorted
alphabetically.
2024-07-15 00:28:01 -04:00
Abe Jellinek
833ecca364
Set automatic titles in more or less all cases (#4369)
By moving the setAutoAttachmentTitle() calls to importFromFile() /
_addToDB().

Also:

- Chop off file extension when setting the parent's title based on the
  filename in Create Parent Item -> Manual Entry.
- Fix Manual Entry not renaming the attachment correctly by awaiting
  createEmptyParent().
2024-07-14 23:37:24 -04:00
abaevbog
ac1cb29c69
refresh library tab's icon cache on update (#4387)
When tabs' state is updated, refresh library tab's icon.
Do not skip it if the icon already exists (as for reader tabs).
Otherwise, when selected row from collectionTree changes,
the icons in the library tab will not update.

Fixes: #4385
2024-07-13 15:46:33 -04:00
windingwind
b16bbc4a8a Fix richlistitem inner element style
fix: https://github.com/zotero/zotero/pull/4339#issuecomment-2225908561
2024-07-13 23:51:56 +08:00
Abe Jellinek
174bde7451
Find Available PDF: Use translator-provided title (#4377) 2024-07-12 00:58:38 -04:00
windingwind
f79dab8f3e
No focus ring and background in CR readonly fields (#4380)
fix: #4138
2024-07-12 00:57:04 -04:00
abaevbog
c0f6671542
fixes to saved search dialog layout (#4378)
- remove padding between the <dialog> and the window edges
- explicit width for all zoterosearch fields because otherwise
a menulist with a long content (e.g. longer collection name) name
can push the + and - buttons outside of the window

Fixes: #4374
2024-07-12 00:55:49 -04:00
abaevbog
f387c67fbc
remove unneeded .trim from react-virt patch (#4379)
Followup to #4370, per https://github.com/zotero/zotero/pull/4370#discussion_r1674336402
2024-07-12 00:21:45 -04:00
Abe Jellinek
c3e927e52f Disable flaky Advanced Search test on CI
Re-enable after we figure out #4375, but this is breaking PR CI runs
right now.
2024-07-11 11:43:23 -04:00
abaevbog
0ea3d232f0
quickFormat rtl layout fixes (#4372)
- properly determine between which two bubbles a click landed
- set input direction
- delete the bubble on the left of the cursor
- in rtl, use selectionStart as the expected end of the input
and selectionEnd as the start. It fixes the issue of the
cursor getting stuck at the end of the input, as well as
fixes the Home/End not working from the right end.
- fix spacing issues for item descriptions in both layouts

Fixes: #4371
2024-07-11 05:39:24 -04:00
Dan Stillman
40a9ebc225 Update reader submodule 2024-07-11 01:47:42 -04:00
Tom Najdek
260709969e Improve RTF Scan UI
* Multiple accessiblity fixes
* Increase font size
* Nicer layout of the welcome screen
* Fix description in the welcome screen
* Add stripes to the table in citations matching screen
* Change icons for accept and resolve manually buttons
2024-07-11 01:46:16 -04:00
Tom Najdek
9cb7e7bb92 Few small tweaks to the wizards styling
* Align buttons with content on macOS
* Slightly reduce padding
* Remove font-size definition
2024-07-11 01:46:16 -04:00
Tom Najdek
843300c62d Use built-in color for the focus ring on macOS 2024-07-11 01:46:16 -04:00
Bogdan Abaev
80b5486991 fix some buttons not opening on space/Enter (#4243)
E.g., field-version button in itembox merge mode
2024-07-11 01:44:15 -04:00
Bogdan Abaev
8f9d5e190e fix itembox field-version button remaining visible (#4243)
Even after the merge mode is no longer active.
Fixes: #4240
2024-07-11 01:44:15 -04:00
abaevbog
a07117c938
Patch react-virtualized to fix react 18 scroll lag (#4370)
React 18 introduced automatic batching which tries to avoid unnecessary
re-rendering (https://react.dev/blog/2022/03/08/react-18-upgrade-guide#automatic-batching).
In some components based on react-virtualized (e.g. tag selector),
it leads to visible lagginess on scroll via keypress or
mouse wheel (not trackpad). This patch wraps setState of the scroll handler
of react-virtualized with ReactDOM.flushSync, which opts out
of automatic batching.

Fixes: #4368
2024-07-11 01:18:25 -04:00
Abe Jellinek
657d5c4c42 Fix skip() error on CI
Apparently you can't call skip() directly from a describe() block.
2024-07-10 14:03:06 -04:00
Dan Stillman
0b3eda5d82 Update styles and translators 2024-07-10 02:16:43 -04:00
Dan Stillman
d90f655513 Update locales from Transifex 2024-07-10 02:15:35 -04:00
Dan Stillman
5d67514705 Update reader submodule 2024-07-10 01:51:56 -04:00
Abe Jellinek
9ea56705a0 Don't change title when renaming from parent metadata (#4363) 2024-07-10 01:51:39 -04:00
Abe Jellinek
327206f931 Rename subsequent attachments after their file base names (#4363) 2024-07-10 01:51:33 -04:00
Abe Jellinek
13496afeb3
Use SelectedItemText color on SelectedItem backgrounds (#4350) 2024-07-10 01:20:47 -04:00
Bogdan Abaev
2f1aa19ae5 tweaks for tests to pass after React 18 upgrade (#4338)
- Wait for the itemsView to be initialized in the onload listener of the
  Advanced Search window
- moved waitForTagSelector in a few tests to avoid it resolving too
  early. For some tests these tweaks are always required, for others -
  tests would pass half the time. Again, not clear why it's necessary,
  potentially some flakiness from react 18?
2024-07-10 01:04:33 -04:00
Bogdan Abaev
fd93af8305 ReactDOM.unmountComponentAtNode => root.unmount() (#4338)
unmountComponentAtNode is deprecated, so save or
pass the root as a prop and call root.unmount when
the component is destroyed
2024-07-10 01:04:31 -04:00
Bogdan Abaev
37991e220e use Icons.getCSSIcon instead of getDOMElement (#4338)
- getDOMElement relied on React.renderToStaticMarkup,
which is react 18 was moved to a different file than the
one exposed with react-dom-server. To not add another
file just for that one function, replace getDOMElement
with getCSSIcon.
- getDOMElement was mainly used for a few remaining
png icons that were not replaced with svg. For those
few icons, just record which background-url should be
set when the module loads and add it in getCSSIcon if
applicable. Alternatively, background-image setting
could be moved into a stylesheet?
- a few hardcoded twisty svgs in icons.jsx are not used anywhere
(they would be fetched via IconTwisty), so those are
removed
2024-07-10 01:04:28 -04:00
Bogdan Abaev
af4bbd2c4d ReactDOM.render -> React.createRoot().render (#4338)
- await for promise that is resolved in ref attribute
of root.render() as an alternative for removed callback
from ReactDOM.render
- await-ing for promise every time when ref needs to be
used after render (e.g. tag selector container), otherwise
ref will be undefined
- additional window.sizeToContent calls to properly size
dialogs with react-rendered content (e.g. create parent),
otherwise the window can cut off some of the content.
2024-07-10 01:04:24 -04:00
Bogdan Abaev
4e0c89b352 react 18.3.1 updated dependency (#4338) 2024-07-10 01:04:17 -04:00
Abe Jellinek
6eea3704a9 Zotero.ItemFields.isAutocompleteField: Cache, use Set 2024-07-10 00:48:53 -04:00
Abe Jellinek
a334d9fdd8 Item box: Use startsWith, not includes, for field name checks 2024-07-10 00:48:53 -04:00
Abe Jellinek
c05d43fa8e Item box: Enable autocomplete on long fields 2024-07-10 00:48:53 -04:00
Abe Jellinek
38764efb5a editable-text: Allow autocomplete with wrapping 2024-07-10 00:48:53 -04:00
Abe Jellinek
3e6cc03e2e Add autocomplete-textarea CE
Exactly the same as the Mozilla autocomplete-input CE, with a different
base class. Seems to work perfectly fine.
2024-07-10 00:48:53 -04:00
Abe Jellinek
0f5fc2962a RTL: Reverse collapsible-section animation 2024-07-10 00:43:59 -04:00
Abe Jellinek
ddfe376900 RTL: Flip attachment preview arrows 2024-07-10 00:43:59 -04:00
Abe Jellinek
043c6e1795 RTL: Use direction-aware arrow key handling 2024-07-10 00:43:59 -04:00
Abe Jellinek
ea2d4417e1 RTL: Add direction-aware arrow key utilities
We need these all over the place.
2024-07-10 00:43:59 -04:00
abaevbog
b0fa4415ee
fix focusring not appearing on linux (#4365)
-moz-accent-color variable doesn't seem to exist on linux.
Use --color-accent as the focus border, same as what is
already done in the reader.

Fixes: #4340
2024-07-10 00:41:13 -04:00
abaevbog
32b92c0205
Cache tabs' icons in data field (#4367)
So that after reload, we can display the correct icon sooner

Fixes: #4342
2024-07-10 00:31:54 -04:00
Abe Jellinek
8cb93b35a4 Tests: Fix -noquit flag
Fixes #4359
2024-07-09 12:07:32 -04:00
Dan Stillman
b899fc9d46 Update reader submodule 2024-07-09 04:54:22 -04:00
Dan Stillman
287ab3296d Update English strings for Transifex 2024-07-09 04:49:10 -04:00
Dan Stillman
5c08e07bf5 Don't expect return value from renameSelectedAttachmentsFromParents()
Removed in da1599ca34, because it was inconsistent and not actually
meaningful
2024-07-09 04:47:56 -04:00
Dan Stillman
da1599ca34 Show popup for Rename File from Parent Metadata
Closes #3230
2024-07-09 04:44:36 -04:00
Abe Jellinek
af1a4941ce
Set automatic title on first child attachment of each type (#4237) 2024-07-09 04:11:39 -04:00
windingwind
e4f75c36e1
Fix scaffold window UI (#4339)
fix: #4258
2024-07-09 04:02:52 -04:00
Abe Jellinek
f79a59f56a
Move various item pane strings to Fluent (#4329)
And:

- Accept Fluent l10nId/l10nArgs in ItemMessagePane#render()
- Reuse existing <description> tag to eliminate l10n flickering
2024-07-09 04:00:19 -04:00
windingwind
006c6e890a
Fix window control in RTL (#4348)
fix: #4332
2024-07-09 03:56:19 -04:00
abaevbog
2d3375e9f6
Revised logic of trashed collections in item cache (#4358)
- revert change from 2401a34031
that only loads un-trashed collections in _loadCollections.
If an item only belongs to deleted collections, item._loaded.collections = true
from _loadCollections will never run, so an exception
will be thrown in item.toJSON() when syncing happens.
Instead, to address the problem of item.getCollections()
having stale data #4307, add 'includeTrashed' parameter to
item.getCollections() based on which item._collections
will be filtered. Fixes: #4346
- revert earlier, no more necessary, changes from a532cfb475
to not alter item._collections cache when collections are being trashed or restored.
Collection is removed from item._collections only when it is permanently
erased.
- removed unnecessary test checking for consistent item._collections
value before and after reload, since item._collections is no longer
modified
- fix encountered bug where a trashed child collection is not
unloaded if a parent collection is erased without being trashed first.
- tweaked Zotero.Search sql construction to count items
that only belong to trashed collections into 'unfiled'. Fixes: #4347

---------

Co-authored-by: Dan Stillman
2024-07-09 03:34:12 -04:00
Abe Jellinek
58c445b616 Preferences: Extract #prefs-search queries 2024-07-08 16:40:26 -04:00
Abe Jellinek
c2b51c7dfe Preferences: Separate load and show, fix navigation race condition
Now we give the caller control over whether the pane should still be
shown after it loads. We're fine with showing in all cases when handling
a search, but we don't want to show when handling a navigation select
if the user already selected something else while the pane was still
loading.

Fixes #4357
2024-07-08 16:38:58 -04:00
Abe Jellinek
a80c4c46bd Make OpenURL resolver base URL field LTR in all locales
Fixes #4354
2024-07-08 16:10:52 -04:00
Abe Jellinek
5444e4ec4d RTL: Flip sidenav Locate icon
Fixes #4353
2024-07-08 15:44:59 -04:00
windingwind
d2f5d1f47b Fix item pane do not update after closing/reopening
fix: #4344
Fix eslint error in itemPane.js
2024-07-08 19:20:31 +08:00
Dan Stillman
4f780424e8 Update locales from Transifex and merge new English strings 2024-07-08 00:26:50 -04:00
Dan Stillman
72dd5128fb Update English strings for Transifex 2024-07-08 00:26:39 -04:00
windingwind
19d4c8e038 Fix RTL: Wrong direction of PDF page preview next/forward buttons
fix: #4333
2024-07-08 09:34:09 +08:00
Tom Najdek
2b5e116717
Fix RTF Scan never marks citations as unmapped (#4328) 2024-07-06 06:31:33 -04:00
Tom Najdek
21203501a9 Don't fade right edge of a tab if text doesn't overflow. Fix #4330 2024-07-06 06:18:31 -04:00
Tom Najdek
73bc0cbb94 Optimization: Reduce number of renders in tab bar
By extracting Tab into a separate, memoized component, caching handlers
and tweaking how icons and other props are passed, we're able to only
re-render tabs that actually changed, rather than re-rendering the
entire tab bar all the time. This should be especially noticeable when
dragging tabs around but will reduce CPU cycles used in general.
2024-07-06 06:18:31 -04:00
Dan Stillman
d9790b707a Fix style list breakage if style name contains HTML special characters
https://forums.zotero.org/discussion/115761/z7-beta-document-settings-do-not-show-full-list-of-styles
2024-07-06 04:13:53 -04:00
Martynas Bagdonas
eeece86b4e Add missing access keys for View and Go menus 2024-07-05 09:01:15 +03:00
Martynas Bagdonas
8622ef6fe6 Update reader and pdf-worker submodules 2024-07-05 08:34:20 +03:00
Martynas Bagdonas
95b27f6f85 Fix double menu separator in reader window View menu 2024-07-05 08:31:53 +03:00
abaevbog
2401a34031
Fix updating of deleted collections in Libraries & Collections (#4324)
- listen to 'collection' notifier events and re-render
the section if a relevant collection is moved to trash or
modified. That way, a deleted collection will be removed,
a restored collection will be added back, and renaming a
collection will update the name.
- fixed a bug where a restored collection would not
be added into item._collections cache. Fixed false-positive
test for it.
- do not add deleted collections into items. _collections cache in
Zotero.Items._loadCollections. Otherwise, deleted collections will
appear in librariesCollectionsBox after the app is restarted.
2024-07-04 22:07:37 -04:00
Dan Stillman
680a175a32 Fix "-" button in Manage Lookup Engines
Which has maybe always been disabled/broken?

(Though it's possible you should only be able to disable custom engines,
not bundled ones)
2024-07-04 05:29:39 -04:00
Abe Jellinek
2849913d1b FullText: Remove unused function 2024-07-03 14:51:06 -04:00
Abe Jellinek
ee0df08cfb Locate menu: await l10n translation
Should reduce jank when opening the item context menu and sidenav
Locate menu, especially on Windows (where the flash of blank menuitems
lasted an especially long time for some reason).
2024-07-03 11:33:08 -04:00
Abe Jellinek
595eeeff6d TranslationParent: Don't throw on removeHandler() if none added 2024-07-03 10:45:41 -04:00
Abe Jellinek
3e6cfaf9ac RemoteTranslate: Use ZOTERO_CONFIG 2024-07-03 10:29:06 -04:00
Abe Jellinek
4619949678 Fix RemoteTranslate null ref error when translation fails 2024-07-03 10:18:49 -04:00
windingwind
54721652b3
Fix colorpicker styling on Windows (#4326) 2024-07-03 03:26:20 -04:00
Dan Stillman
694ccecf4a Merge new English strings 2024-07-03 02:37:47 -04:00
Dan Stillman
2ae25e6d7a Add space in tab bar for dragging window on macOS
Closes #4313
2024-07-03 02:25:43 -04:00
abaevbog
668c84fed5
always open duplicatesPane itembox (#4323)
Since the header of the collapsible section is not visible,
there is no way to expand the itemBox if it was collapsed
before dulicate items are selected. With this, itembox
is always opened when a new set of duplicate items is selected.

Fixes: #4318
2024-07-03 01:58:04 -04:00
Abe Jellinek
f6a0ea6282
Use span in hiddenDOMWindow to measure text width (#4316) 2024-07-03 01:41:15 -04:00
abaevbog
63615f1f09
vpat 15: more detailed labels for itemPane (#4050)
- added dynamic tooltip whose label is set only when it appears.
It allows us to have a visible tooltip without screen readers
announcing it
- fetch the pane name string and pass it as an argument to
fluent to set the appropriate label on expand/collapse buttons
- tooltiptext is set dynamically on expand/collapse buttons to
avoid having screen readers read both the label and the tooltip text
that are almost identical
2024-07-03 01:27:35 -04:00
Abe Jellinek
5f47a3d41d
Translation: Treat EPUBs as primary attachments (#4321) 2024-07-03 01:18:23 -04:00
Dan Stillman
931d89468f Update reader submodule 2024-07-03 01:17:12 -04:00
Abe Jellinek
222125c1a2 Add menu type classes to separators
Fixes #4317
2024-07-02 13:43:00 -04:00
Adomas Venčkauskas
e7d2a9a7d6 Update Word for Windows submodule 2024-07-02 13:14:08 +03:00
Dan Stillman
8211934d97 Update connector strings 2024-07-02 05:43:31 -04:00
Dan Stillman
c44015671a Update reader submodule 2024-07-02 05:21:59 -04:00
Dan Stillman
ef89b2df7a Increase height and fix min-height on tag selector
Addresses #4186
2024-07-02 05:05:53 -04:00
Dan Stillman
ea5194f206 Update locales from Transifex 2024-07-02 04:08:31 -04:00
Dan Stillman
27b439a052 Update en-US strings for Transifex 2024-07-02 01:13:57 -04:00
Abe Jellinek
92bb6b3403 Remove duplicate ID 2024-07-02 01:02:54 -04:00
Abe Jellinek
d96938f6cd Attachments box: Build Add menu locally instead of cloning
Avoids having to refactor various ZP methods to be aware of the current
tab.
2024-07-02 01:02:54 -04:00
abaevbog
2d1b8a21db
Strings for reader aria-live announcements (#4293)
used to announce which annotation is selected during
keyboard navigation, as well as the index of the current
search result

Followup to zotero/reader#130
2024-07-02 00:59:11 -04:00
Abe Jellinek
cd5df6b2c0
Add Gecko types and a script to update them (#4296) 2024-07-02 00:58:51 -04:00
abaevbog
3a59a68779
fix X button not appearing in tag selector (#4309)
With minor tweaks to positioning.

Fixes: #4299
2024-07-02 00:55:24 -04:00
Abe Jellinek
1bb7862114
Fix missing icons in menulists on Windows (#4305)
Only set display: none on the icon element when we actually don't have
an icon to show.
2024-07-02 00:46:34 -04:00
Tom Najdek
390b65f2ab
Fix Import Wizard navigates to the incorrect page. Fix #4300
"Continue" button is now disabled until all checks are completed.
2024-07-01 12:55:23 +02:00
Tom Najdek
76caebdd8a
Show current locale in error message in localize-ftl. Fix #4302 2024-07-01 11:08:41 +02:00
Dan Stillman
4866c467dc Update reader submodule 2024-07-01 04:37:29 -04:00
Dan Stillman
ecd6c66750 Additional logging when changing linked attachment base directory 2024-07-01 03:56:29 -04:00
Dan Stillman
d73a6f8a11 Fix PathUtils.joinRelatve() error when changing LABD on Windows
We store relative paths with forward slashes, but PathUtils requires
platform-specific slashes, so it was failing with
NS_ERROR_FILE_UNRECOGNIZED_PATH.

https://forums.zotero.org/discussion/115552/zotero-7-path-problem
2024-07-01 03:56:10 -04:00
Abe Jellinek
3df1a9b812 Code style fixes 2024-07-01 03:32:14 -04:00
Abe Jellinek
d8eae4cd3b Enable Undo Retrieve Metadata when translator added note (#4267)
Closes #2977
2024-07-01 03:31:45 -04:00
abaevbog
a054831a3a
Prevent focus from being lost in itemBox (#4287)
- always render options and link buttons - just do
not display them if their respective field is empty.
That allows us to easily handle focus after refresh
because otherwise, the node may does not exist.
If we try to restore focus to such hidden component,
simulate a "tab" from it to focus the next possible node.
This fixes the issue of focus being lost on tab after all
content of editable-text is cleared.
- add tabindex=0 to itemType menulist, otherwise it was
not perceived as a candidate to return focus to.
- somewhat special treatment for restoring focus to
creator rows. If the desired node is not found, we'll
try to focus the respective node in the last creator row.
It prevents focus from being lost on tab after clearing
the very last creator.

Fixes: #4241
2024-07-01 03:01:33 -04:00
abaevbog
7dc68209a5
fix to unwanted empty creator row in itemBox (#4275)
this._addCreatorRow needs to be properly initialized to
false (as opposed to being undefined) because 'false'
is the value we check against to decide if an empty
row should be added and focused after rendering.

Fixes: #4268
2024-07-01 02:24:01 -04:00
Dan Stillman
29fa2f7073 LABD: Add test for ignoring a file that already exists under new path 2024-07-01 01:48:22 -04:00
Dan Stillman
cc3bdb59c1 Add an index on itemData.valueID
Hopefully this will drastically speed up purging after people delete
huge numbers of items.

https://forums.zotero.org/discussion/comment/466885/#Comment_466885
2024-07-01 01:48:22 -04:00
Dan Stillman
16ae145d6c Don't purge data tables before syncing
This was copied over from classic syncing, and while I noted in
1100015d2c that it wasn't necessary before syncing anymore, I didn't
remove this call.
2024-07-01 01:48:22 -04:00
windingwind
c270069639
Redesign Document Preferences and Create Bibliography dialogs (#4265) 2024-07-01 00:24:35 -04:00
abaevbog
2dfb243924
Show correct context menu and itemPane header for collections in trash (#4297)
- only have enabled "Permanently delete" and "Restore to library"
options in the context menu for collections and searches in the trash
- display the custom header with buttons to delete or restore
in the itemPane when a collection or search in the trash is selected

Fixes: #4295
2024-06-28 16:42:45 -04:00
Dan Stillman
df8a4799e1 Use numbered variables in another new string
https://forums.zotero.org/discussion/115566/new-strings-with-multiple-variables-on-transifex
2024-06-28 16:28:59 -04:00
Dan Stillman
78507161df Use numbered placeholders in localized string
https://forums.zotero.org/discussion/115566/new-strings-with-multiple-variables-on-transifex
2024-06-28 16:22:41 -04:00
Tom Najdek
c7d816783b
Fix issues in filename renaming preferences pane. Fix #4291
* Fix template and preview overflowing container
* Fix extra whitespace around "documentation" link
* Increase minimal height of the template input field
2024-06-28 14:55:21 +02:00
Dan Stillman
6942506eba Rework object type checking in items list
a532cfb475 added `isCollection()`, `isSearch()`, and `isItem()` methods
to data objects to handle collections and searches in the trash, with
`isItem()` checking whether `._ObjectType` was `Item`. That left out
feed items (`._ObjectType` == `FeedItem`), and when c384fef867 made
`getSelectedItems()` return only items, it used `isItem()`, so feed
items were excluded, which broke feed-item toggling between read and
unread [1] and possibly some other things.

The simple fix would be to make `isItem` match feed items as well (which
could potentially fix other bugs related to feed items), but there was
actually no need to add new methods (which can get confused with
`CollectionTreeRow` methods) when we can just check the object type with
`obj instanceof Zotero.Item`, which gets the benefit of inheritance and
matches `Zotero.FeedItem` instances as well.

[1] https://forums.zotero.org/discussion/115571/cannot-change-the-status-of-title-in-subscribtion
2024-06-28 02:09:49 -04:00
Abe Jellinek
20e9f20580 Update reader submodule 2024-06-27 13:35:16 -04:00
Abe Jellinek
5a6b1a9f76
Add hyphenation and text appearance options for EPUBs (#4256)
And remove duplicate string
2024-06-27 06:02:47 -04:00
Dan Stillman
7f372fdd42 Add recursiveCollections test for items in deleted subcollections
Addresses #4271
2024-06-27 05:10:59 -04:00
Adomas Venčkauskas
87f7a6a7bd Integration: Don't activate document after clicking Manage Styles in Doc Prefs
Closes #4290
2024-06-27 10:09:23 +03:00
Dan Stillman
d5bb667fb3 Merge new English strings 2024-06-27 02:34:24 -04:00
abaevbog
f6b47987e9
fix tab duplication breakage (#4286)
Fix to breakage after 3f45def that would not open a duplicate
tab but instead create another reader instance in the same tab.
Instead of finding a tab for a specific item, use tabID that
is passed when reader should be loaded in an unloaded tab. That
allows us to know if the tab is being duplicated or not.

Fixes: #4272
2024-06-27 01:19:25 -04:00
Abe Jellinek
4eb4741795 Prevent pinning Notes button in reader sidenav
Sidenav button pane IDs usually correspond to sections with the same
IDs, but `context-notes` actually corresponds to two sections
(`context-all-notes` and `context-item-notes`). We were preventing
those sections from being pinned, but not the button that reveals them.

Fixes #4283
2024-06-26 11:17:17 -04:00
Abe Jellinek
10b248d68d Update reader submodule 2024-06-26 10:49:07 -04:00
Abe Jellinek
c52ca2ee32
EPUB / Snapshot: Support printing (#4279) 2024-06-26 10:48:36 -04:00
Dan Stillman
a2dc0f7e37 Sort related items by title
Closes #4281
2024-06-26 01:02:07 -04:00
Martynas Bagdonas
ce0b364571 Update reader submodule 2024-06-25 17:26:49 +03:00
Abe Jellinek
0861710245 Style Editor: Indent with 2 spaces
Closes #4269
2024-06-24 11:14:39 -04:00
Dan Stillman
38b0b3a69a Fix bug in #_setHighlightedRowsCallback() test 2024-06-24 04:42:59 -04:00
Dan Stillman
4ca92adb89 Tests: Use select() instead of selectCollection()/selectSearch() 2024-06-24 04:40:12 -04:00
Dan Stillman
ca5ea08e2b Fix failing test from 173f4c491e 2024-06-24 03:01:57 -04:00
Dan Stillman
cd43e95b85 Fix build failure from 42d4064bac 2024-06-24 02:53:48 -04:00
Dan Stillman
9c519948bc Add missing async to CollectionTree::selectSearch() 2024-06-24 02:45:20 -04:00
Dan Stillman
a9c5c1bfa5 Tests: Remove some unnecessary waitForItemsLoad() calls 2024-06-24 02:45:20 -04:00
Dan Stillman
621435be68 Tests: Rework collection/search-in-trash tests
- Update for auto-`skipSelect` on collections and searches
- Remove interdependencies that prevented independent runs
- Remove unnecessary manual object names
- Remove unnecessary delay
- Switch to new convenience selection functions
- Switch to customary object naming
2024-06-24 02:45:20 -04:00
Dan Stillman
173f4c491e Tests: Don't auto-select collections and searches after creation
This changes `createDataObject()` to pass `skipSelect: true` for objects
other than items. If a test is creating a bunch of collections, there's
no reason for each one to be selected and for an items list to start to
load. If a test does need a new collection or search to be selected, it
can call the new convenience function `await select(win, obj)`, which
will select the passed object in the collection tree and wait for its
items list to load. I'm hoping this reduces random test failures due to
items list churn.
2024-06-24 02:45:20 -04:00
Dan Stillman
09aad7b075 Tests: Make some ZoteroPane tests more reliable 2024-06-24 02:45:20 -04:00
Dan Stillman
6dfd8965f1 Fix hanging tests after c384fef867 2024-06-24 02:45:20 -04:00
Dan Stillman
aaac18ced6 Tests: Add convenience function to pause execution without timing out
`await pause(this)` can be used to disable the test timeout and pause
execution so the UI state can be manually inspected
2024-06-24 02:45:20 -04:00
Dan Stillman
42d4064bac Tests: Add additional convenience functions for object selection
Objects can now be selected in the UI with just `await select(win, obj)`
2024-06-24 02:45:19 -04:00
Dan Stillman
6757c586ea Update package-lock.json with newer caniuse 2024-06-23 05:10:03 -04:00
Dan Stillman
764e75a39a Fix typo in test title 2024-06-23 05:09:32 -04:00
Dan Stillman
c61892e4b6 Fix Collections.getCollectionsContainingItems() when no ids are passed
Previously it would return all collections
2024-06-23 05:09:31 -04:00
Dan Stillman
c384fef867 Add getSelectedObjects() and limit getSelectedItems() to items
This adds an explicit function on ZoteroPane and the item tree for
getting objects -- including collections and searches in the trash --
and limits `getSelectedItems()` to returning actual items from the
selection. We shim various item properties on the collections and
searches in the trash, but code that's getting the selection should be
explicit about what it wants. Outside of the trash, they're equivalent,
except `getSelectedObjects()` does have an `asIDs` mode.

This switches to using getSelectedObjects() in various places and fixes
collections in the trash appearing as belonging to My Publications when
using the collections-containing-an-item highlight [1].

This also adds support for highlighting the parent collections of
collections in the trash.

[1] https://forums.zotero.org/discussion/115449/zotero-7-beta-deleted-collection-appears-as-belonging-to-my-publications
2024-06-23 05:09:31 -04:00
Dan Stillman
a612c1227e Fix collections in trash showing up in menus
New Collection menu and Add to Collection menu

https://forums.zotero.org/discussion/115447/zotero-7-beta-deleted-collections-still-appear-in-the-ui
2024-06-22 16:33:11 -04:00
Tom Najdek
b9f0d26cee
Improve ftl localization scripts 2024-06-21 15:40:10 +02:00
abaevbog
3c6625f3cf
Tweaks to itembox unsaved creator row (#4178)
- Remove unsaved creator row on blur or escape
- Rename "unsavedRow" for "position" as we want to be able to find
the relative position of creators after the next refresh not only
for unsaved rows. In many cases "unsavedRow" as returned by getCreatorFields
is the actual index of the creator row.
- Calculate and use "position" in getCreatorFields for all creator rows, not
only unsaved one, when a new row is being added.
This fixed a bug where wrong row gets focused if an unsaved creator row is
added, some text is typed and then another creator row below this unsaved row is clicked.
- fixed a bug where autocomplete options would not be updated after creator mode
is switched for the default empty row (if there are no creators)
- simplified paste handler of creators to use modifyCreator that
also shifts creators if a creator is unsaved. Fixed bug brought up in
https://github.com/zotero/zotero/pull/4165#issue-2313280474 where
pasting creators does not always focus the last added creator.
- Fixed another bug brought up in https://github.com/zotero/zotero/pull/4165#issue-2313280474
where shift-enter from creator before "_ more creators" label
will add a new row in the end instead of focusing the next creator.
- Fixed bug where adding a row right before "_ more creators" label
and blurring it will remove all creators after it. Now, clicking +
on a creator right before the "_ more creators" label will display
all creators and add a row after it.
- Fixed a bug where if "_ more creators" is present, editing
a creator name and pressing shift-enter would loose focus
instead of adding and focusing a new row in the end.
- Fixed a bug where focus got lost from some buttons

Fixes #4143
Fixes #4241
2024-06-21 01:28:28 -04:00
Dan Stillman
b78938e773 Update reader submodule 2024-06-21 01:09:51 -04:00
Dan Stillman
6b5b47a83a Sidenav: Only show context menu with "Pin Section" on section buttons
Don't show on Locate menu button

Addresses #4253
2024-06-21 01:02:22 -04:00
abaevbog
bb3d9ccf8f
vpat 46: more aria for preferences inputs (#4264)
- linked color scheme radio buttons to their label. Using
aria-describedby on individual radio buttons instead of
linking color scheme label to radiogroup because voiceover
does not announce the label in that case.
- linked item pane header dropdown to its label
- linked markdown and richtext note format checkboxes to their labels.
- added aria description to linked attachments base directory
so the input and "choose" button
- linked virtualized tables to their labels

Data directory location setting needs some more labeling as well
but it's mechanics should be generally reworked per vpat 50.
2024-06-20 23:34:23 -04:00
Abe Jellinek
3231e24bd5 Local API: Use getByLibraryAndKeyAsync() 2024-06-20 13:20:09 -04:00
abaevbog
3f45def928
tabs startup loading optimization (#4174)
- if an unloaded tab is being opened, do not close the
tab and have reader re-open a fresh tab. Instead, keep the
tab as is, have reader use the tab as a container and
just change the tab's type. It should fix a glitch on
windows when if you click on a tab during initial loading,
it will disappear until reader re-adds it. A few tweaks
to allow unloaded tabs be generally "selectable".
Fixes: #4149
- during startup loading, select the yet-unloaded tab right
away. That way, a tab is almost immediately selected,
instead of being stuck on the library tab until the reader is ready.
- if the items are not loaded yet, use a placeholder
icon for tabs. Fixes: #4150
- special handling for reader loading message during initial
load. When an unloaded tab is selected, the loading message
needs to be displayed but, since there is no reader yet, we
add it in Zotero_Tabs.select and try to remove by the reader
when it's loaded.
2024-06-20 05:41:14 -04:00
Dan Stillman
d188857e06 Fix Reset not graying out after resetting note font size
https://forums.zotero.org/discussion/115372/zotero-7-beta-reset-is-not-greyed-when-using-default-note-font-size
2024-06-20 03:08:27 -04:00
Tom Najdek
936044b01f
Skip var-only and term-only messages in ftl-to-json 2024-06-19 17:01:46 +02:00
abaevbog
13812f46b4
open itembox creator type menu on arrowUp/down (#4257)
To preserve behavior from zotero 6. We likely want to make
the creator type menu a proper menulist in the future.

Addresses: #4248
2024-06-19 02:28:26 -04:00
windingwind
24b5f2efb4
Assign ItemPane#_itemDetails default tabType (#4261)
Fix pinnedPane set to ItemDetails before tabType is assigned not stored to pref
fix: #4260
2024-06-19 02:26:08 -04:00
Abe Jellinek
310e741a01
Fix duplicate attachment row from attachments-box notify() (#4250) 2024-06-19 02:23:46 -04:00
Dan Stillman
fad3e25278 Local API: Return 404 for unknown group library 2024-06-19 00:40:13 -04:00
Dan Stillman
ecfc217ce9 Local API: Load library items if not yet loaded
Fixes #4244
2024-06-19 00:28:25 -04:00
Dan Stillman
e00b754fce Use Type instead of Genre for column in items list
https://forums.zotero.org/discussion/comment/465996/#Comment_465996
2024-06-18 13:52:45 -04:00
Tom Najdek
b7244998a1
Few fixes to ftl-to-json and localize-ftl scripts (#3707)
* Omit msg-ref-only strings from Transifex JSON
* Fix msg-ref-only strings not included in translated .ftl files
* Update ftl-tx. Simplify localize-ftl script.
* Tweak FTL -> JSON conversion to produce a single file
2024-06-18 06:34:17 -04:00
Dan Stillman
f8a8f694b4 Use sentence case for tooltip 2024-06-18 06:29:12 -04:00
Dan Stillman
30890b322a Remove obsolete strings
Calling code removed in 9eabc169c4
2024-06-18 06:28:21 -04:00
Dan Stillman
8d8ffd52b5 Add colons after labels in Locate settings
We left these out on purpose, but we've decided to keep colons in
non-phrase labels for now.
2024-06-18 06:20:35 -04:00
Martynas Bagdonas
06127d84da Update reader submodule and add missing strings 2024-06-18 09:49:54 +03:00
abaevbog
4d3b36efd3
new aria strings for the reader (#4239)
Aria labels and descriptions used by zotero/reader@e0e595a
to add a number of accessibility improvements to the reader
2024-06-17 23:19:24 -04:00
Dan Stillman
e7e7e4d230 Tweaks to trash functionality for collections and searches (#3307)
- Use SVG icons
- Show "[x] collection selected" or "[x] searches selected" in the item pane
- Show "[x] objects selected" if multiple types are selected, which I
  don't love, but I don't have a better idea
- Use existing strings for ARIA labels
2024-06-17 23:14:48 -04:00
Bogdan Abaev
a532cfb475 trash functionality for collections and searches (#3307)
When a collection or a saved search is deleted, it appears in
trash among other trashed items. From there, it can be restored
or permanently deleted.

Items of trashed collections are not affected my the trashing/permanent
deletion of a collection and need to be deleted separately like before.

Subcollections of a trashed collection do not appear in the trash and
are restored or permanently deleted with the top-most trashed parent.
2024-06-17 23:14:21 -04:00
Bogdan Abaev
f4d428cb16 vpat 37: run JS aria edits + localization (#4021) 2024-06-17 06:17:39 -04:00
Adomas Venčkauskas
338afc2b80 Add tests for HTTP integration endpoints 2024-06-17 12:45:28 +03:00
Dan Stillman
f829d7c43e Explicitly close file input stream at end of md5Async()
Fixes "Could not remove the non-empty directory at…" file-sync error on
Windows

Fixes #4246
2024-06-17 01:24:15 -04:00
Dan Stillman
f7d7625c1c Redownload file marked as a forced download when opening file
Previously we were redownloading only `SYNC_STATE_TO_DOWNLOAD` files,
not `SYNC_STATE_FORCE_DOWNLOAD`, because the latter gets downloaded even
when using on-demand file syncing, but if the download fails for some
reason, it should be retried on a manual open.
2024-06-16 16:31:04 -04:00
Dan Stillman
e7ddf810c0 Fix error reporting for download failure on attachment open 2024-06-16 16:31:03 -04:00
Dan Stillman
49d3bae256 Fix Mac Word breakage after 44d9530ec
(Which predated HTTP Mac Word integration, so didn't include a change
for server_integration.js)
2024-06-16 16:31:03 -04:00
Dan Stillman
137a1ddcc0 Missing file for 639b4b5623 2024-06-15 00:45:28 -04:00
Dan Stillman
639b4b5623 Use local HTTP server for Zotero.BrowserDownload test 2024-06-15 00:40:03 -04:00
Abe Jellinek
dab423e857
Preferences: Replace legacy options with single scrollTo option (#4242) 2024-06-15 00:24:11 -04:00
abaevbog
2c74b0279d
fix focus not moving from reader into contextPane (#4238)
If the header is in bibliography entry mode.

Instead of trying to focus editable-text of the header (which
may not be possible), just focus the next node after the header.
2024-06-15 00:19:48 -04:00
Dan Stillman
d2fda98bcb Add fill: #000000 to Linux symbolic icon
https://forums.zotero.org/discussion/115150/zotero-7-symbolic-icon-isnt-recognized-as-such-by-gnome
2024-06-14 07:01:51 -04:00
Abe Jellinek
50e2250fe0
Add pref to enable local API (#4236)
And keep enabled in tests
2024-06-14 06:25:39 -04:00
Dan Stillman
17539404b2 Fix test failure calling item.toResponseJSON() with no library set
After #4270
2024-06-12 05:50:36 -04:00
Dan Stillman
3aaf3432da Local API: Add note to switch to getLibraryWebURL() (#4270)
Once #2893 is merged
2024-06-12 05:50:21 -04:00
Dan Stillman
9f4b15bbb7 Local API: Better handle users who have never logged in (#4270)
- Don't include `alternate` links
- Replace `users/local/:localKey` with `users/:userID` in `self` links
- Use `0` for id in `library` block
2024-06-12 05:48:34 -04:00
Dan Stillman
d33a904207 Local API: Use libraryTypeID rather than libraryID for library (#4270) 2024-06-12 05:48:29 -04:00
Dan Stillman
6b79b5849e Local API: numChildren=0, not false (#4270) 2024-06-12 05:45:54 -04:00
Dan Stillman
3363cb448a Local API: Attachment size fixes (#4270)
- Don't fail on missing attachment
- Get size of main file only
- Include best-attachment `attachmentSize` for parent items
2024-06-12 05:45:51 -04:00
Abe Jellinek
5d197e4b12 Mostly complete (read-only) compatibility with web library (#4270)
- Add pagination, limits, and Link header
- Add schema endpoints and dummy /settings endpoint
- Add /file endpoints
  - Browser security restrictions prevent the web library from actually loading
    the file: URIs that the local API returns, but out-of-browser use will work
    fine
- Add toResponseJSONAsync() DataObject function: delegates to toResponseJSON()
  by default, adds information that requires awaiting promises
  - Best attachment (links.attachment) and file size (links.enclosure.length)
    for items, meta.numItems for groups
  - Separate function for compatibility with the existing test code that uses
    toResponseJSON(), but we could consider unifying

This commit does not add the Access-Control headers that allow webpages to make
requests to the local API, since I don't think we actually want that.
2024-06-12 05:45:48 -04:00
Abe Jellinek
44d9530ecf Add local implementation of Zotero web API (#4270)
This required some tweaks to other parts of Zotero infrastructure:
- Search:
  - Add 'includeDeleted' condition to match behavior of 'includeTrashed' API
    parameter in a single search
- Data objects:
  - Improve toResponseJSON() implementations so output better matches the web
    API
    - Add toResponseJSON() to Zotero.Tags - has to be async so it can query the
      database and generally works differently from other toResponseJSON()
      functions, but accomplishes the same task
  - Remove unused getAPIData() and apiDataGenerator() DataObject functions. They
    aren't functional and wouldn't really make implementing the local server
    easier, so now seemed like a decent time to remove them
- Server:
  - Support resolving routes using pathparser.jsm
    - Add allowMissingParams option to PathParser#add(): prevents /route from
      matching /route/:param
  - Replace the query property of the data object sent to endpoint init()s with
    searchParams, an instance of URLSearchParams - supports #getAll() for
    repeatable parameters
- URIs:
  - Make getObjectURI() public, add utilities for converting URIs to API
    endpoints and web library URLs
2024-06-12 05:45:38 -04:00
Dan Stillman
fe47cbe805 Adjust menu widths in advanced search
Addresses #4190
2024-06-12 00:37:49 -04:00
Tom Najdek
88743682c3 Improve Advanced Search Dialog #4190 (#4225)
- Set the window minimum size to 700px x 500px.
- Fix a regression where non-applicable operators remain visible.
- Fix the "✔️" appearing next to multiple operators in the operator popup menu.
- Include the "Year" and "Attachments" columns by default in the results table.
2024-06-12 00:37:22 -04:00
Dan Stillman
f59a4da7f0 Update Word for Windows submodule 2024-06-11 14:44:02 -04:00
Martynas Bagdonas
1d33b68761 Fix exported PDF annotation date and update reader/pdf-worker submodules 2024-06-11 21:13:17 +03:00
Dan Stillman
569225897d Update Word for Windows submodule 2024-06-11 04:46:59 -04:00
windingwind
b0e617e968 Don't show experimental warning on plugin startup
Fix: https://groups.google.com/g/zotero-dev/c/zTNnAaeVg1s/m/ykEtux_PAAAJ
2024-06-11 09:07:05 +08:00
Dan Stillman
c0c00a00e7 Update reader submodule 2024-06-10 15:53:23 -04:00
Martynas Bagdonas
50a037ecdc Add item pane preview mode support to reader and update its submodule 2024-06-10 16:35:46 +03:00
Dan Stillman
e3a831a68b Show dependent styles in CSL Preview
Addresses #4219
2024-06-10 05:52:29 -04:00
abaevbog
98066b1bc5
qf: improved multiselect (#4217)
- richlistbox shift-click selects a range starting with
_selectionStart. After a few cmd/ctrl clicks, _selectionStart
ends up not being correct - it can even point at an unselected item.
To help richlistbox properly select a range, before each click is
processed, reset _selectionStart to be either the first
or last selected item, depending on where shift-click landed.
- also, fixed a small glitch where inputs would be created if
you click on the red border outside of the actual editor.

Fixes: #4206
2024-06-08 04:55:24 -04:00
Dan Stillman
85a15175ae Fix sizing problems in Create Parent dialog
Use a regular paragraph for the intro text rather than an input
placeholder, which gets cut off it's too long, and allow the window to
be sized dynamically based on the title and localized strings.

Fixes #4109
2024-06-08 04:42:14 -04:00
abaevbog
249c5b8d12
vpat 49: refactor note format preference section (#4027)
"Note format" section in "Export" tab is technically a table and is
announced as such by screen readers, which is misleading.
It also opens a menulist when a checkbox is clicked, which is
not an expected behavior and can shift focus.

This refactors the "Note format" section to be a vbox container
with <checkbox>es and labels, which is more correct semantically and
does not confuse screen readers. In addition, when a chekbox is
clicked, dispatch a "change" event instead of unnecessarily open
up a menu.
2024-06-07 05:25:37 -04:00
Dan Stillman
7f84716c7e Update OpenURL setup prompt and add intro text to prefs
Closes #3788
2024-06-07 05:07:20 -04:00
Dan Stillman
4af4212360 Reorder preferences strings 2024-06-07 00:54:32 -04:00
Dan Stillman
92206d30f6 Restore min-width on style manager -/+ buttons
Set to 0 in 23da0d70b, possibly because the default was too chunky, but
it's definitely wrong with 0
2024-06-07 00:54:32 -04:00
Dan Stillman
be2ae2c1d7 Fix missing labels on -/+ buttons in style manager after #4006 2024-06-07 00:54:32 -04:00
Dan Stillman
e86458f11b Remove redundant zotero.ftl line after #4006 2024-06-07 00:54:32 -04:00
windingwind
5cc6631fd3
Improve merge pane (#4200)
resolve: #4142
2024-06-07 00:37:54 -04:00
Abe Jellinek
c826805bca
editable-text CE: Don't modify the DOM in sizeToContent() (#4214) 2024-06-06 23:35:53 -04:00
Abe Jellinek
88221d5fc7 Fix long unbroken word in annotation row causing overflow
Fixes #4212
2024-06-06 10:02:52 -04:00
Dan Stillman
4522704a77 Fix Zotero.FileTypes.getIDFromMIMEType() (unused) 2024-06-06 08:09:34 -04:00
Adomas Venčkauskas
d306fa9142 Sort translators before calculating the translator hash 2024-06-06 10:08:27 +03:00
Dan Stillman
71f83c0a35 Update reader submodule 2024-06-06 01:07:20 -04:00
Dan Stillman
4e719e0d0c Update translators and styles 2024-06-06 01:07:19 -04:00
abaevbog
4f7b43747a
vpat 27/28: rtfScan aria edits (#4020)
- linked input/output file labels to the input fields so
they have descriptive names
- added more detailed button labels
- fixed "No file selected" not appearing if no file is selected
2024-06-06 01:03:58 -04:00
Abe Jellinek
f30d8f07d5 Correct field/getter names in collapsible-section CE 2024-06-06 00:58:11 -04:00
Abe Jellinek
0f0fec0c64 Persist pinned item pane section across restarts 2024-06-06 00:58:11 -04:00
abaevbog
a81701d7e7
vpat 51: add aria labels to advanced search (#3987)
In addition, make toolbarbuttons explicitly focusable
and make them clickable on space/Enter.
2024-06-06 00:54:54 -04:00
abaevbog
5a45717270
vpat 3: make "-"" btn focusable even if hidden (#4053)
In libraries, notes and tags boxes, do not hide the actual
"-" toolbarbutton, hide the <image> inside of it. Visually,
it looks the same but the button can be focused via tab
without having to expicitly make it visible. It means that
shift-tab from the section header will not skip the "-" button.

Also, make "remove" toolbarbutton from tagsbox focusable like all
others for consistency.
2024-06-06 00:13:26 -04:00
abaevbog
70d52277b1
vpat 11: do not skip over disabled tags during arrow navigation (#4051) 2024-06-06 00:11:52 -04:00
abaevbog
c07a13fcfe
vpat 46: remaining aria-labels in preferences (#4006)
- Linked remaining found inputs/menulists to their labels.
- Made the "Choose resolver" a proper visible
label, so that it does not oddly disappear if you click
on the dropdown with "Custom" showing after even if the
selection did not change. For the purpose of VPAT, a
visible label is always good for success criteria 3.3.2
https://www.w3.org/WAI/WCAG21/Understanding/labels-or-instructions
- Added explicit names to +/- buttons
- aria-labelledBy for inputs surrounded by text
- fluent strings for resolver preferences
- remove openURL.version preference, hardcode "1.0"
2024-06-06 00:00:33 -04:00
Abe Jellinek
094b8157af Libraries & Collections pane: Use properties instead of global state 2024-06-05 14:33:51 -04:00
Adomas Venčkauskas
1354371cc6 Update Word for Mac submodule 2024-06-05 17:35:53 +03:00
abaevbog
c9d60999d8
quickFormat guidance panel fixes (#4193)
- added 8px padding around text on linux. Mac and win already have some
padding around text through --panel-padding. Fixes: zotero#4187
- guidancePanel.js fetches text from .ftl file instead of zotero.properties
- added first-run-guidance-quickFormat to zotero.ftl with updated
text to better reflect current functionality. Fixes: zotero#4191
- removed unnecessary special treatment for qf guidance panel on mac
- moved guidance panel text for itemBox creator menu into zotero.ftl

---------

strings tweaked by @dstillman
2024-06-05 06:36:29 -04:00
Abe Jellinek
eca5f6bea1
zotero://select handler: Switch to library tab (#4204) 2024-06-05 00:52:03 -04:00
abaevbog
56980080ad
QuickFormat: adding multiple items with shift-arrow (#3851)
- multiple reference items can be selected with
shift-arrowUp/Down or Cmd/Ctrl-click and added as bubbles
via Enter or click on one of selected items
- Shift-click can be used to select the range of items
- if there is a retracted item among multiselected
that is not OK'd (cancel or view in library clicked),
no bubbles are added and the item is removed from
the multiselection
- added a red note to item's description indicating
if an item is retracted
2024-06-05 00:38:56 -04:00
Abe Jellinek
4d7c641f7b Libraries & Collections: Make all collections clickable in context pane
Fixes #4201
2024-06-04 11:14:10 -04:00
Abe Jellinek
5539bd50ce Remove redundant click handler code from FeedAbstract actor
Missed when committing 8eedfd4a14.
2024-06-04 10:55:14 -04:00
Dan Stillman
94f061b0ec Fix "Desktop file didn't specify Exec field" error on Ubuntu 24.04
Latest Debian/Ubuntu seems to require some extra escaping of backslashes

Fixes #4163
2024-06-04 06:51:25 -04:00
windingwind
a6076ce76c
Fix item pane header (#4159)
* Improve feed item pane header (fixes #4141)
* Show item pane custom head when headerMode is none (fixes #4116)
* fx115: Fix button style on windows (fixes #4120)
* Move split-menu-button styles to SCSS
2024-06-04 02:14:20 -04:00
Abe Jellinek
845f11b1da Remove nonfunctional style repo CSS modification code 2024-06-04 02:06:32 -04:00
Abe Jellinek
8eedfd4a14 basicViewer: Open links externally 2024-06-04 02:06:32 -04:00
Abe Jellinek
7eb4c1f6f6
Reports: Support dark mode (#4198) 2024-06-04 02:02:35 -04:00
windingwind
fab20327a5 Fix QF titlebar on wayland 2024-06-03 11:23:36 +03:00
Dan Stillman
191d112aad Remove newline in attachment-info-convert-note.tooltiptext string
Otherwise it's included in the Fluent string:

https://github.com/zotero/zotero/pull/3707#issuecomment-2144469525
2024-06-03 03:40:17 -04:00
Dan Stillman
b20926aa75 Update CSL locales
https://forums.zotero.org/discussion/comment/464380/#Comment_464380
2024-06-03 00:53:10 -04:00
Abe Jellinek
aa9198bafc Update reader submodule 2024-05-31 12:24:58 -04:00
Abe Jellinek
43779b5e26 svgicon mixin: Don't preload other variants when color is 'universal'
Prevents debug spam due to missing resources.
2024-05-31 11:06:38 -04:00
windingwind
066eda7315
Fix collection tree renaming background color (#3829) 2024-05-31 07:16:05 -04:00
Tom Najdek
d6d9979f19
Fix dates not following configured locale. Resolve #3559 (#3880) 2024-05-31 06:58:14 -04:00
Dan Stillman
5c1f6d065d Update reader submodule 2024-05-31 06:41:06 -04:00
abaevbog
709281db02
vpat 56: added tooltip for quickFormat Z-menu (#4000)
It could be a simple aria-label but tooltip is more functional
2024-05-31 06:28:33 -04:00
abaevbog
e7c7367509
zp tab focus tests pass if run on their own (#4183)
Make sure that more than one tab is opened before tab navigation
tests are run so that the tabs menu is always focusable.

Fixes: #4180
2024-05-31 05:54:26 -04:00
Martynas Bagdonas
6ecfc7e34d Update reader and pdf-worker submodules 2024-05-31 01:15:50 +03:00
Dan Stillman
79fa160e43 Update reader and pdf-worker submodules 2024-05-30 03:11:16 -04:00
abaevbog
c4dbf19446
vpat 23: better aria label for itembox merge btn (#4173)
Added the field name for the label to be more descriptive.
The new announced label is e.g. "Select version of title field".

Followup to https://github.com/zotero/zotero/pull/4096#issuecomment-2121894422
2024-05-30 01:44:49 -04:00
Abe Jellinek
6b4cac1fb5
Allow item pane sections to declare dependencies for rerender, fix Libraries and Collections not updating (#4155) 2024-05-30 01:44:11 -04:00
windingwind
5ebd6c4141 Try to fix unstable attachments pane test 2024-05-29 21:27:13 +08:00
Dan Stillman
4a9ce6b82b Use correct URL for beta builds for Windows 32-bit-on-64-bit warning
For #4172
2024-05-29 07:05:15 -04:00
Tom Najdek
14a0a8ab24 Show banner to 32-bit Windows users to reinstall 64-bit version (#4172)
Resolves #3940
2024-05-29 07:03:57 -04:00
Dan Stillman
08ffa64abf Add Zotero.isBetaBuild and fix Zotero.isDevBuild
Previously `isDevBuild` was true for beta, dev, or source builds (but
also wasn't used anywhere)
2024-05-29 06:59:17 -04:00
Martynas Bagdonas
e96426d18c Adjust fulltext test 2024-05-28 17:32:03 +03:00
Martynas Bagdonas
97c37de7f7 Update reader and pdf-worker submodules and partially disable one test 2024-05-28 17:18:56 +03:00
Dan Stillman
24ca4e44fa Don't sign 'test' channel builds 2024-05-28 06:44:23 +01:00
Dan Stillman
4067514a7e Don't build bzip updates for architectures that didn't exist in Z6 2024-05-28 06:44:23 +01:00
Dan Stillman
044e228a49 Omit additional files from Windows Firefox builds 2024-05-28 06:44:22 +01:00
Dan Stillman
7056513b77 Finish Windows ARM support
And rename to "ARM64"

Closes #3112
2024-05-28 06:44:21 +01:00
Dan Stillman
08706332f9 Fix metadata of setup .exe on Windows
E.g., "Zotero Setup", not "Firefox"
2024-05-28 06:44:21 +01:00
Dan Stillman
81edd1ee1c Don't show "Firefox Software Updater" on Windows
And fix other .exe metadata

Fixes #3571
2024-05-28 06:44:20 +01:00
Dan Stillman
a7ae98c4c8 Remove Firefox 102 patch 2024-05-28 06:44:19 +01:00
windingwind
fe3dae2d15
Refactor AttachmentPreview render and discard (#4161) 2024-05-28 00:05:29 -04:00
Martynas Bagdonas
a3857cb5e0 Update reader and pdf-worker submodules to fix test issues 2024-05-27 18:56:10 +03:00
Martynas Bagdonas
a15e185318 Update reader and pdf-worker submodules 2024-05-27 17:29:29 +03:00
abaevbog
c8cf38cdf1
fix itembox creator btns not hiding in view mode (#4169)
Fixes: #4166
2024-05-25 04:09:19 -04:00
Dan Stillman
17255e4f5b Update Word for Windows submodule and revert ui.window_class_override
Addresses #3930
2024-05-25 03:21:47 -04:00
Abe Jellinek
f906fee819 Allow item tree to shrink further in Stacked view
Fixes #4081
2024-05-24 14:58:39 -04:00
Abe Jellinek
bbde79818f Snapshot resource handler: Use attachmentReaderType
isSnapshotAttachment() checks the link mode (needs to be IMPORTED_URL),
but we actually allow viewing all attachments with text/html MIME types
as "snapshots" in the reader. Don't throw on any HTML attachment that
the reader is willing to open.
2024-05-24 11:25:37 -04:00
Abe Jellinek
2776d21ba0 Fix leak warning when indexing snapshots
Closes #4133
2024-05-24 11:19:04 -04:00
Abe Jellinek
b68957debe Item box: Show View Online button in feeds
Fixes #4167
2024-05-24 10:34:54 -04:00
Abe Jellinek
81954d74d1
Item box: Save text selection along with focus (#4165) 2024-05-24 10:12:12 -04:00
Abe Jellinek
3176516b79 Feeds: Fix error parsing items with rights information
- 59afef6 added a duplicate assignment to item.rights that was putting
  a TextConstruct(!!!!) in the item JSON field instead of a string
- info.rights was being set to a TextConstruct (preexisting issue!)
2024-05-23 14:20:44 -04:00
Abe Jellinek
92bb96ac49 Feeds: De-prioritize prism:copyright
Seems to be more used for copyright owner names than license
information, which is probably what we want in that field when it's
available.
2024-05-23 14:16:38 -04:00
Abe Jellinek
e20b02c124 Fix broken feeds due to rights fields missing in _textConstructs
And warn instead of throwing in the future.

Fixes #4162
2024-05-23 10:46:08 -04:00
abaevbog
9325f773cc
fix tagsbox enter glitch (#4160)
The 'blur' event needs to be dispatched by editable-text
before its state is reset (not after) because tagsbox uses
.initialValue in the 'blur' handler.

followup to 101e6d55d5

Fixes: #3575
2024-05-23 00:16:36 -04:00
Dan Stillman
721f54fe49 Disable tagsbox test again due to CI failures (#3575) 2024-05-22 23:22:05 -04:00
Dan Stillman
debe5590f2 Temporarily disable intermittently failing tests (#4139) 2024-05-22 23:02:56 -04:00
Abe Jellinek
59afef6c2e
Feeds: Refactor to move field extraction to FeedProcessor (#4158)
And support more PRISM fields.
2024-05-22 18:29:58 -04:00
abaevbog
101e6d55d5
fix itembox creator row glitches (#4152)
- fix the infinite loop glitch. Tweak of editable-text to only
dispatch 'blur' event if the input was actually blured. It prevents
the hideEditor from being locked in an infinite loop due to the
call stack hideEditor -> modifyCreator -> moveCreator -> blur -> hideEditor
- refactor blurOpenField to not be async and to not be used in most
places. It is mainly redundant now that editable-text handles blur
if clicked anywhere outside of it, so it helps to avoid confusion.
- since moveCreator does not await or yield for anything anymore, remove the
Zotero.spawn part. The rest of the function is unchanged.
- on focusin of the empty unsaved creator row, use its future unsaved id
that reflects its positioning instead of its real id (which technically is
the very last creator row). That way, a tab from a creator row that was just
filled will land to the proper component after render, as opposed to
focusing the very last row.
- similar approach to removing the unsaved creator row when the focus is
in it - focus the row above it, as opposed to the last row.

Fixes: #4145
Addresses part of: #4143
2024-05-22 18:26:52 -04:00
Abe Jellinek
d24b923542 Use text color for icons in New Collection dialog
See 19f4509, which fixed #3869. This changes that fix to use the current
text color instead of always using --fill-secondary.

Fixes #4153
2024-05-22 14:41:02 -04:00
Tom Najdek
6d71b2f6e4
Update note-editor submodule. Fix #4151 2024-05-22 14:23:46 +02:00
Abe Jellinek
d5cbb0fa03 Allow item tree to shrink further in Standard view
Addresses #4081 for Standard
2024-05-21 11:07:51 -04:00
Dan Stillman
9de70613a8 Update note-editor and reader submodules 2024-05-21 03:04:52 -04:00
Bogdan Abaev
2071a7c4cf enable + button on all creator rows
- plus button is enabled on all creator rows, not just the last one
- enabled plus button will add an empty unsaved creator row below
  current creator row. After that, plus button is disabled as long as
  the next row is unsaved.
- the grippy of a newly added unsaved row is disabled
- adding an unsaved creator row will remove another unsaved creator row
  if one exists. That way, only one unsaved row can exist at a time
- once the unsaved creator row is added, it is tentatively perceived as
  the "last" creator row based on its id. That is to avoid shifting all
  other creators' indicies and saving the item too many times.  When the
  field is blurred, that new creator is moved into its "unsavedIndex"
  before saving the item
2024-05-21 02:50:52 -04:00
Bogdan Abaev
fe01113935 fix wrong suggestions for creators
Fix to a glitch where after switching creator field mode, the
autocomplete suggestions for creators would still be for the old mode.
This only happened if the field mode was changed on an empty, unsaved
creator row.
2024-05-21 02:50:47 -04:00
Bogdan Abaev
c6799bc3c2 itembox focus edits and refactoring (#4096)
- removed ztabindex logic from itemBox. It is no longer needed, adds
  unnecessary complexity and is likely at the root of multiple glitches
  if a plugin inserts an arbitrary row that does not have ztabindex set.
- if a creator row is deleted when the focus is inside of the row, focus
  another creator row to not loose the focus.
- more centralized button handling in `_ensureButtonsFocusable` and
  `_updateCreatorButtonsStatus`
- refactoring of hidden toolbarbuttons css so that the icons are still
  hidden and don't occupy space (if desired) but are still visible for
  screen readers, so they are focusable without JS changing their
  visibility (this with ztabindex removal fixes vpat 24)
- removed `escape_enter` event from `editable-text`. It was a workaround
  to know when itemBox should move focus back to itemTree. Unhandled
  Enter on an input or Escape should focus itemTree (or reader) from
  anywhere in the itemPane/contextPane (not just itemBox), so that logic
  is moved to itemDetails.js. To avoid conflicts with Shift-Enter, do
  not propagate that event outside of multiline editable-text. Fixes:
  #3896
- removed not necessary keyboard nav handling from itemDetails.js. It
  was only needed for mac, and is redundant if "Keyboard navigation"
  setting is on
- using `keydown` instead of `keypress` for itemDetails keyboard nav
  handling because `Enter` `keypress` does not seem to get out of
  `editable-text` but `keydown` does.
- old handleKeyPress from itemBox is no longer relevant for most
  elements, so it is removed and substituted with a dedicated handler
  just for creator row.
- moved the creator's paste handler into its own dedicated function
  from the autocomplete handler (which was confusing)
- special handling for `enter` and `escape` events on `editable-text`
  with autocomplete to not stop event propagation, so that the events
  can bubble and be handled in `itemDetails`. It avoids some cases of
  the focus being lost and returned to the `window`. It was unnecessary
  earlier due to `escape_enter` workaround but only within itemBox and
  only within itemPane.
- removed explicit tab navigation handling from `collapsible-section`
  header. Currently, it may get stuck when buttons are hidden (e.g. in
  the trash mode). It was only added to enable keyboard navigation on
  mac before special "Keyboard navigation" setting was discovered (it
  was never an issue on windows), so now it's easier to just let mozilla
  handle it.
- always use `getTitleField` to find and focus the proper title field in
  itemBox
- on shift-tab from the focused tab, just move focus to the first
  focusable element before the splitter without any special handling for
  attachments, notes and duplicates pane as before. It ensures a more
  consistent and predictable keyboard navigation, especially now that
  itemPane is fairly keyboard accessible.

Fixes: #4076
2024-05-21 02:45:19 -04:00
Dan Stillman
1394381257 Include unixMode in OS.File.stat() shim 2024-05-21 01:56:38 -04:00
Dan Stillman
03be938444 Don't try to use Zotero.isWin in OS.File shim 2024-05-21 01:56:28 -04:00
Abe Jellinek
eed7acff08 Ignore sort keyboard shortcuts in non-library tabs
Fixes #4140
2024-05-20 10:34:13 -04:00
windingwind
7fa7cf310e Fix merge window (#4130)
- Fix render issues
- Fix merge pane min-width
- Use no-titlebar modal for merge window on MacOS
- Disable section collapsing in merge pane
- Disable section open state caching in merge pane

fix: #3611
2024-05-19 00:58:14 -04:00
windingwind
1f322cddb8 Fix eslint errors in mergeGroup.js 2024-05-19 00:55:10 -04:00
Dan Stillman
14c6d26f20 Clarify comment for numDistinctFileAttachmentsForLabel() test 2024-05-19 00:54:13 -04:00
Dan Stillman
47bf4de08a Add test for numDistinctFileAttachmentsForLabel() filter function 2024-05-19 00:52:36 -04:00
Abe Jellinek
90634fc5c8 numDistinctFileAttachmentsForLabel: Filter best attachment 2024-05-19 00:52:36 -04:00
Abe Jellinek
bc64f06352 Item pane header: Don't reserve space for scrollbar
https://github.com/zotero/zotero/issues/4129#issuecomment-2117158647
2024-05-17 11:38:35 -04:00
Abe Jellinek
f9dc083771 _paneHeader.scss -> _itemPaneHeader.scss
Match the CE name.
2024-05-17 11:37:57 -04:00
Dan Stillman
95d5a54174 Fix file-import breakage from 8e7d9927ef
https://forums.zotero.org/discussion/114465/zotero-7-bug-report-latest-beta-build-78-5be5ca941-broke-file-import
2024-05-17 10:05:35 -04:00
Sean Takats
a3b1558f00
Updated icon file with corrected shade of white (#4135) 2024-05-17 05:49:28 -04:00
Dan Stillman
cd0ec45dc8 Make all publicationTitle fields multi-line, not just bookTitle
For some reason applied only to Book Title in #890

https://forums.zotero.org/discussion/comment/463195/#Comment_463195
2024-05-17 05:27:40 -04:00
windingwind
126d12905b Revert menulist type=radio
Partially revert 5438247, 63012a8 because the menulist style is fixed by 4a0bb2d in SCSS
See also #4052
2024-05-17 17:23:22 +08:00
Abe Jellinek
f6ee160186 editable-text: Reset state after programmatic blur()
Regardless of whether the window is active.

Fully fixes #4101
2024-05-16 11:07:47 -04:00
Abe Jellinek
b4c5c5d539 Item pane header: Use focused getter instead of :focus-within
:focus-within doesn't match when the window is inactive but the field
is focused.

Addresses #4101, except that focusing the new item's title field and
pressing Escape will clear the field (without modifying the item).
2024-05-16 11:07:15 -04:00
Abe Jellinek
c7159a5fa6 Revert "Fix item type menuitem type attribute"
This reverts commit 6db62c6705.

Fixes #4106
2024-05-16 10:16:11 -04:00
Dan Stillman
5be5ca9416 Always return from numDistinctFileAttachmentsForLabel() once we're >1 2024-05-16 01:41:55 -04:00
Dan Stillman
834ee0ff6c Switch to separate localized strings for "Show File"/"Show Files"
https://github.com/zotero/zotero/pull/4124#issuecomment-2114036702
2024-05-16 01:41:17 -04:00
Abe Jellinek
1bf0fd7d57 Scaffold: Manage blank lines before test cases automatically 2024-05-15 12:42:00 -04:00
abaevbog
1e990f3ca0
vpat 42: link url label to input in scaffold (#4017) 2024-05-15 06:58:52 -04:00
windingwind
f1d8a1c289 Fix splitMenuButton dropdown icon 2024-05-15 06:45:10 -04:00
windingwind
bc47ee46c8 Fix item pane buttons after CEification
Fixes #4115
2024-05-15 06:45:10 -04:00
windingwind
9a23031c12 Rename ItemPaneHeader CE localName to item-pane-header
Closes #4114
2024-05-15 06:45:09 -04:00
windingwind
1e3ebc082e Rename PaneHeader to ItemPaneHeader
Addresses #4114
2024-05-15 06:45:09 -04:00
windingwind
4fc8850f1e Skip item pane section render when not in selected tab 2024-05-15 06:45:09 -04:00
windingwind
8b083aa426 Fix context pane unnecessary update
Fixes #4029
2024-05-15 06:45:09 -04:00
windingwind
91c0c28b5d Fix attachments & annotation box refresh bugs and add tests (#4031)
Fixes #3993
Fixes #3995
Closes #4082
2024-05-15 06:45:01 -04:00
Dan Stillman
07e8f0a01d Try to make numDistinctFileAttachmentsForLabel() test more reliable 2024-05-15 06:09:40 -04:00
Dan Stillman
0c8d3f0829 Improve counting of file attachments for Show File and Export PDFs
If a parent item and its primary attachment are selected, it should
still say "Show File" rather than "Show Files". This adds the
questionably named `Zotero.Items.numDistinctFileAttachmentsForLabel()`
to try to figure out if we're operating on 0, 1, or >1 items.

Follow-up to #4124
2024-05-15 05:50:47 -04:00
Abe Jellinek
c47617c809 Move "Show File" out of Locate menu and into File menu (#4124) 2024-05-15 05:50:42 -04:00
Dan Stillman
e1f1003318 Add Zotero.Item::numFileAttachments() 2024-05-15 05:48:03 -04:00
Abe Jellinek
bb146328b8
Update default locate engines (#4125) 2024-05-15 05:45:38 -04:00
abaevbog
8f065d9f1f
remove unnecessarry scrollbar in tabs menu on mac (#4123)
Make sure the vertical scrollbar does not occupy space
on mac when the menu is not scrollable even if
the "Show scroll bar" setting is "Always"

Fixes: #4121
2024-05-15 05:42:06 -04:00
windingwind
f0c578effa
Use transparent collection & item tree scrollbar (#4122) 2024-05-15 00:45:57 -04:00
Abe Jellinek
099c8e9958 Locate manager window: Support Accel-W to close 2024-05-14 14:58:45 -04:00
Abe Jellinek
c94c0bae8f Locate manager window: Update list after Restore Defaults 2024-05-14 14:57:31 -04:00
Abe Jellinek
9eabc169c4
Move Locate to sidenav (#3747) 2024-05-14 04:19:58 -04:00
abaevbog
7091fa3a58
touchscreen longpress displays context menu (#4104)
Fixes the issue where long press would not open up
context menu in a virtualized table and tab bar because
it was handled in mousedown events that longpress on a
touchscreen does not dispatch.

This behavior is still observed in the scrollable area
of the reader and the note editor.

Addresses: zotero#4094
2024-05-13 19:03:29 -04:00
Martynas Bagdonas
31616af2af Update reader submodule 2024-05-13 11:19:07 +03:00
Abe Jellinek
5dae581ad3
Lazy load CEs (#4112) 2024-05-11 04:11:22 -04:00
Dan Stillman
9783cc57c4 Add test for placement of creator rows in Info pane 2024-05-11 04:09:12 -04:00
Bogdan Abaev
be1c890051 After new item creation, focus title in itemBox (#4113)
When item is created manually, title field in itemBox
will be focused instead of the title in the itemPane as before.
If the itemBox is collapsed, it will be opened.

Added 'open' setter to item pane section for brevity

Fixes #4111
2024-05-11 04:09:05 -04:00
Dan Stillman
c01b3ae270 Don't use [ztabindex] in selector when finding metadata fields 2024-05-11 03:47:51 -04:00
abaevbog
ffef57eed1
redone fix of focus sticking to tab after click (#4087)
- revert debcb9944d since it breaks
drag-drop reordering of tabs
- when reader is being refocused by contextPane, add a small delay
so that the focus settles on the tab before focusing the reader
- also explicitly refocus the reader tab after drag, since then focus
also lands on the tab and finds itself outside of the reader
2024-05-11 03:21:59 -04:00
Abe Jellinek
59b1d75b98
Item pane header customization (#3791) 2024-05-10 08:23:26 -04:00
abaevbog
8278140492
Prevent empty item type menu from appearing after Cmd-Shift-N when info section is collapsed (#4105)
If the info section is collapsed, do not try to focus and
open the itemType menu as it can lead to an empty dropdown.
Just focus the header title in that case
2024-05-10 03:23:20 -04:00
Dan Stillman
85f58cc97d Fix Utilities.Internal.md5Async() on missing files and empty strings
https://forums.zotero.org/discussion/114208/zotero-7-beta-bug-report-consistent-error-when-syncing
2024-05-08 01:16:37 -04:00
Abe Jellinek
8f2bf50cec
Try to prevent ConcurrentCaller from failing CI (#4097) 2024-05-07 19:38:44 -04:00
Abe Jellinek
9ab42c5c65 Override tab color-scheme for Windows dark mode compat
https://forums.zotero.org/discussion/114239/z7-beta77-scaffold-bugs-report
2024-05-07 15:25:44 -04:00
Abe Jellinek
634e27c621 Scaffold: Don't use cookie sandbox by default
Instead, just set an empty cookie sandbox when running tests without
"Remember cookies" enabled. The cookie sandbox doesn't remember cookies
set in JS, which breaks some sites in the Scaffold browser.

https://forums.zotero.org/discussion/114239/z7-beta77-scaffold-bugs-report
2024-05-07 15:11:03 -04:00
Abe Jellinek
19ab6b6643 Scaffold: Fix duplicate text in test status label 2024-05-07 14:30:56 -04:00
Abe Jellinek
387210e139 Scaffold: Fix Open URL 2024-05-07 14:28:50 -04:00
Abe Jellinek
655575eb77 Monaco / Scaffold: Use LF line endings on all platforms
https://forums.zotero.org/discussion/114239/z7-beta77-scaffold-bugs-report
2024-05-07 12:10:57 -04:00
Abe Jellinek
f1cf1b1a2b Fix merge pane overflowing without scrollbar
https://forums.zotero.org/discussion/114241/zotero-7-beta-merge-unusable-with-long-author-lists
2024-05-07 11:59:58 -04:00
Abe Jellinek
bd9048861c HiddenBrowser: Test download blocking
9b7d3edbb3
2024-05-07 11:17:30 -04:00
Dan Stillman
de9e7ff962 Remove border-radius in color-picker buttons on Windows 2024-05-07 05:16:21 -04:00
Abe Jellinek
14ea68c819 Fix color picker button styles on Windows 2024-05-07 05:16:21 -04:00
Abe Jellinek
e414e6029b Prevent Windows button defaults from overriding other styles 2024-05-07 05:16:21 -04:00
Abe Jellinek
5f8ea3af9c PageDataChild: Return null channelInfo on non-HTTP channel
Rather than throwing. Fixes requireSuccessfulStatus on file: (etc.)
URIs.
2024-05-07 04:51:49 -04:00
Abe Jellinek
9b7d3edbb3 HiddenBrowser: Block all downloads 2024-05-07 04:51:49 -04:00
Dan Stillman
0cd868ec87 Update reader submodule 2024-05-07 04:35:13 -04:00
Abe Jellinek
8e7d9927ef Create Bibliography: Use HiddenBrowser to fix printing 2024-05-07 04:33:51 -04:00
Abe Jellinek
120d4cfacd HiddenBrowser: Add print support 2024-05-07 04:33:51 -04:00
Abe Jellinek
a473002663 Extract zoteroPrint() 2024-05-07 04:33:51 -04:00
Abe Jellinek
7f993a1528 Tab shortcuts: Use event.code for better keyboard layout compat 2024-05-07 04:29:20 -04:00
Abe Jellinek
13c96c6520 Sort shortcuts: Use Alt for better keyboard layout compat 2024-05-07 04:29:20 -04:00
Abe Jellinek
7e225c4517 Feed abstract: Load CSS asynchronously
Probably won't fix #4091, but can't hurt.
2024-05-06 14:12:23 -04:00
Abe Jellinek
e7b792e2d5 HiddenBrowser: options is optional, support data: URIs 2024-05-03 10:33:37 -04:00
Abe Jellinek
82107beaa9 Fix menulist label misalignment on macOS
I think they're still slightly off center, but now they look exactly
like they do in Firefox. Dropdown labels in Apple's native macOS apps
are actually offset toward the top by a pixel or two.

Fixes #4086
2024-05-02 11:00:05 -04:00
Adomas Venčkauskas
99d977be3f Update Word for Windows submodule 2024-05-02 12:30:11 +03:00
windingwind
4a0bb2df52 Fix menulist popup item padding and icon on MacOS and Windows
A follow up fix after #4052
Default to radio style menuitem on MacOS and Windows
2024-05-02 15:19:45 +08:00
abaevbog
debcb9944d
prevent focus from sticking to tab after click (#4078)
After clicking on a reader tab, the reader will get focused
but the default mousedown event handler can then shift
focus onto the actual tab. It looks like the focus gets "lost",
and breaks reader keyboard shortcuts so we want to avoid it.
Mainly happens on windows.

Fixes: #4077
2024-05-01 23:59:10 -04:00
Abe Jellinek
04748ec9a6 Don't allow flex layout to shrink collections pane
updateLayoutConstraints() needs its size to be fixed across window
resizes. It didn't shrink automatically until fx115, I think, and this
commit restores that behavior.

Fixes #4062
2024-05-01 15:30:12 -04:00
Abe Jellinek
729b5a2082 Quick Search: Don't run on mode switch if field is empty
Fixes #4075
2024-05-01 14:43:42 -04:00
abaevbog
adaa61f2cf
Make opened tabs menu scrollable (#3833)
- If there are too many tabs opened to fit onto the screen,
the tabs menu can be scrolled
- When tabs menu is opened, scroll to the selected tab
- Use margins instead of padding to that the scrollbar does not
overlap with the cross button
- Make sure that if the tabs menu is long, there will
be a gap between it's top/bottom and the edge of the
screen
- On linux, screen.availTop and screen.availHeight are not always
correct and the menu can go outside of what is supposed to be
the available screen area. Special treatment for those
edge cases
2024-05-01 02:00:15 -04:00
abaevbog
9f453b55ad
post vpat-57: qf locator string tweak (#4067) 2024-05-01 01:18:28 -04:00
abaevbog
fa647459ac
set quicksearch placeholder as fluent argument (#4074)
Fluent seems to clear out label/placeholders attributes set directly
(not via .ftl file). So quicksearch placeholder added directly ends
up being emptied out.
This is the cleanest workaround found so far: add the placeholder
as the fluent argument

Fixes: #4073
2024-05-01 01:11:15 -04:00
windingwind
63012a816f Fix library menu type attribute
A follow up fix after #4052
Fix the padding of library menu on MacOS
2024-05-01 11:44:00 +08:00
abaevbog
638efad3eb
properly refocus tag from tag selector on re-enter (#4035)
- do not erase the last recorded tag on blur of the tag selector
- on tab from collectionTree or shift-tab from tag selector input,
try to refocus that last focused tag. If one does not exist,
try to focus the first non-disabled tag.

Fixes: #4008
2024-04-30 10:31:55 -04:00
Abe Jellinek
d5194f234d
Update progress window to use SVG icons (#4047)
* Fix translation progressWindow
* Use SVG icons, don't use determineAttachmentIcon() / getImageSrc()
* FeedItem#translate(): Pass itemDone params in correct order
* Why does FeedItem#clone() return JSON?
* Fix text misalignment
2024-04-30 05:32:54 -04:00
windingwind
a5acf02264 Fix menulist popup checkbox and radio icon on Windows
A follow up fix after #4052
2024-04-30 17:21:11 +08:00
windingwind
6db62c6705 Fix item type menuitem type attribute
A follow up fix after #4052
Fix the padding of item type menu on MacOS
2024-04-30 16:46:30 +08:00
windingwind
dc06c699ec
Fix notes context handling issues (#4036)
fix: #4024
2024-04-30 03:03:17 -04:00
Abe Jellinek
da1eb6fda9 Feeds: Prefer content to summary when available 2024-04-30 02:14:57 -04:00
Abe Jellinek
4fe7d6fa0e Feed abstract: Add <base>
Fixes broken relative (or protocol-relative) images.
2024-04-30 02:14:57 -04:00
Abe Jellinek
c32a352ecc Feed abstract: Set color scheme automatically
Fixes black on black text in dark mode.
2024-04-30 02:14:57 -04:00
Abe Jellinek
302d8e925e
Remove a bunch of unused PNG icons (#4071) 2024-04-30 02:13:17 -04:00
Abe Jellinek
472ee72093
Fix column-sorting shortcuts on Windows (#4068) 2024-04-30 02:10:03 -04:00
Abe Jellinek
b9a93faabb Fix color picker tiles only showing outline
The @windows-form-element-base mixin sets background-image, so we need
to override that instead of just setting background-color.

Fixes #4065
2024-04-29 13:06:38 -04:00
Adomas Venčkauskas
1626ecf48e Limit related-items dialog to same library
Add ability to filter collection tree based on list of library IDs
Closes #4060
2024-04-29 17:19:32 +03:00
windingwind
54382475be Fix advanced search menu issues
Fix needsgutter padding of menupopup in menulist on MacOS
fix: #4052
Fix advanced search operator menu multi-select status
2024-04-29 11:45:09 +08:00
windingwind
3ec1a64a6b Fix QuickSearchTextbox value property
fix: #4057
2024-04-29 10:56:14 +08:00
Dan Stillman
81ed1f6ebb Strip line and paragraph separators in filenames
And don't fail on existing filenames with these characters in
`Item::attachmentFilename`

https://forums.zotero.org/discussion/114025/pdf-files-renaming-casuing-syncing-issue
2024-04-28 07:51:25 -04:00
Dan Stillman
41726fef84 Fix error message trying to add related item in another library
https://forums.zotero.org/discussion/114027/zotero-7-beta-remove-other-libraries-from-the-add-related-window
2024-04-28 04:08:04 -04:00
Abe Jellinek
53f685ca76 Update reader submodule 2024-04-26 11:31:54 -04:00
Martynas Bagdonas
7afbdd2150 Render PDF annotation images using PDF worker
Fixes #3191
2024-04-26 11:17:57 +01:00
Abe Jellinek
a5393ca0e5 Merge: Keep external annotations on master, don't erase on other
PDFWorker only re-imports external annotations when the file changes on
disk. Keep annotation items corresponding to external annotations so
that they don't disappear after the merge (and then come back when the
file is edited).

Tweaks behavior introduced in 2aa34a6.

https://forums.zotero.org/discussion/113943/zotero-7-beta-merging-pdf-files-leaves-ghost-external-annotations
2024-04-25 16:35:09 -04:00
Abe Jellinek
1c05dafedd Update reader submodule 2024-04-25 11:11:51 -04:00
Abe Jellinek
f609578250 Remove more unused zotero.css styles 2024-04-25 06:25:20 -04:00
Abe Jellinek
627f840c4b Remove unused #zotero-progress-box styles 2024-04-25 06:25:20 -04:00
Abe Jellinek
3a7145f4d5 Fix progress queue dialog overflow 2024-04-25 06:25:20 -04:00
Bogdan Abaev
fbfe4b2dfa qf: fix prepending multiple inputs to the editor
Fixes: #4041
2024-04-24 08:31:03 +03:00
Abe Jellinek
12b6645a1f
CookieSandbox: Fix attachToInterfaceRequestor() for XHRs (#4043) 2024-04-23 18:53:46 -04:00
Bogdan Abaev
0077c3f07a post vpat 57: revert layout changes to locator
Locator type dropdown just has aria-label "Locator type".
The locator input is labelled by a hidden label with "Locator input"
string, as well as the locator type. That way both are announced
when it is focused.

Fixes: #4039
2024-04-23 16:36:33 +03:00
Adomas Venčkauskas
19f0e9369a Fix citation dialog reference list not being scrollable 2024-04-23 16:34:42 +03:00
Dan Stillman
60fd0829b0 fx-compat: Fix positioning and size of progress popups
In Firefox 115, overwriting `outerHeight` caused it to not report the
correct value later, and whatever issue were were working around seems
to have been resolved since Firefox 3.

https://forums.zotero.org/discussion/113633/zotero-7-beta-bug-report-the-progresswindow-shows-at-incorrect-position
2024-04-23 04:28:57 -04:00
Bogdan Abaev
784ccdd996 vpat 57/58: classic citation editor aria fixes
- vpat 57: remove tabindex values, set tabindex=0 on all focusable
fields. It allows mozilla to determine the best focus sequence
for keyboard navigation and fixes wrong order where some inputs would
go before the "Ok" and "Cancel" buttons and some - after
- vpat 58: added labels to all inputs to be announced when focused.
Added separate labels for locator menulist and for the locator input so
that the locator type has a proper label. It is also better to have
visible explicit labels when possible
2024-04-23 09:09:52 +03:00
Abe Jellinek
d815476a14 fx115: Scaffold: Fix Tests listbox sizing
- Remove splitter for now - no longer works with flex, so we'll need to
  rethink it
- Borrow selectItemsDialog richlistbox sizing fix via mixin
2024-04-22 15:02:30 -04:00
Abe Jellinek
fde33e7100 fx115: Scaffold: Center Open window (ex-sheet) 2024-04-22 15:02:30 -04:00
Abe Jellinek
5d760c9304 fx115: Scaffold: Fix window sizing 2024-04-22 15:02:30 -04:00
Tom Najdek
25b9c677e3
Import into current collection if not creating new collection. Resolve #2291 2024-04-22 19:24:44 +02:00
Dan Stillman
91054acfea Fix reversed shasum/sha256sum in dfaa0ce129 2024-04-22 07:04:42 -04:00
Dan Stillman
5d580f049a Merge new English strings 2024-04-22 06:51:42 -04:00
Dan Stillman
704d90cd83 Use startHTTPServer() in FeedReader test 2024-04-20 06:41:57 -04:00
Dan Stillman
9ffb430207 Return baseURL from startHTTPServer() test support function
Since it should almost always just be `http://localhost:${port}/`
2024-04-20 06:41:57 -04:00
Abe Jellinek
8b13f717b4 SAXXMLReader: Handle non-UTF-8 encodings (#3846) 2024-04-20 06:41:51 -04:00
Abe Jellinek
c9fc68658b
fx102: Hidden window: Bring back "Zotero" menuitem in Window menu (#4019)
Also:

- Make Zotero window opened via Window menu resizable
2024-04-20 04:52:06 -04:00
Abe Jellinek
e516fc8354
Add sorting options and column picker to View menu (#2543) 2024-04-20 04:43:48 -04:00
Dan Stillman
a7b5648733 Tweak Quick Format/Add Note instructions for screen readers
Mostly for brevity, but also:

- "Down Arrow" → "space bar" because down-arrow doesn't open the
  citation dialog with VoiceOver enabled -- it starts reading individual
  words.
- In some cases (selected/open items and notes), Tab takes you to search
  results without your needing to type something first.

Follow-up to #4002, #4004, #4005
2024-04-20 01:14:11 -04:00
abaevbog
ad1cfa7c98
vpat_29: aria labels for insert note dialog (#4005) 2024-04-19 17:31:46 +03:00
Dan Stillman
91104ebe46 Center saved-search dialog 2024-04-19 07:44:59 -04:00
windingwind
3e30ae1797
Fix dialog window titlebar on macOS (#4011)
After #4010
2024-04-19 07:32:50 -04:00
Dan Stillman
dfaa0ce129
Use custom XUL binary on macOS (#4010)
Backports the following Mozilla fixes:

https://bugzilla.mozilla.org/show_bug.cgi?id=1858409
(AutoFill/Services menus; fixes #3927)

https://bugzilla.mozilla.org/show_bug.cgi?id=1884631
(sheets → dialogs; fixes #3936)

https://bugzilla.mozilla.org/show_bug.cgi?id=148624
(ghost tooltips, because why not)
2024-04-19 07:04:42 -04:00
abaevbog
1dbbb708a7
vpat 26: quickformat more detailed instructions (#4004) 2024-04-19 09:11:31 +03:00
Abe Jellinek
76a9b58914 fx115: Hidden window: Fix missing/wrong data-l10n-ids
Follow-up from 4e912b84c003d6b38e106412358b05e137e63f18; fixes #4016
2024-04-18 13:38:33 -04:00
Abe Jellinek
6d93ab1e71 Zotero.openMainWindow(): Make window resizable
Fixes #4007
2024-04-18 13:25:15 -04:00
Abe Jellinek
5d263e2f4c Note Editor & Quick Copy: Don't use bidi control characters
Since Word can't handle FSI/PDI.

This affects dragging items into notes and dragging/copying annotations
in the reader. Citations inserted from within the note editor already
didn't include bidi control characters.

Fixes #4013
2024-04-18 11:41:46 -04:00
Abe Jellinek
07de63be35 Update reader submodule 2024-04-18 10:06:23 -04:00
Abe Jellinek
402538457e
Reader: Add hook for setting zoom on iframe element (#4003) 2024-04-18 10:05:18 -04:00
Dan Stillman
ff3c249b6d Remove elements from pane.persist that no longer persist anything 2024-04-18 08:35:32 -04:00
Dan Stillman
9d49d4623d Don't restore persisted attributes that are no longer valid 2024-04-18 08:35:32 -04:00
windingwind
5bef61b748 fx115: fix element width/height persist 2024-04-18 08:35:32 -04:00
Abe Jellinek
f7dc68c7f4
Render RSS description as HTML (#3956) 2024-04-18 06:39:17 -04:00
abaevbog
2835d6fe83
tag selector focus edits, fix windowing breakage (#3984)
* tag selector focus edits

- no tabstop on the tag selector scrollable area
- change tag selector's role from default "grid" to "group".
"grid" is not quite correct semantically and leads to
voiceover suggesting irrelevant commands.
- move all keyboard handling logic to tagSelectorList.jsx.
Tabbing through tag selector is now handled in ZoteroPane,
so the only logic left there is arrow navigation
between tags, and there's no reason to not have it
together with the tags list.
- a workaround to deal with focused tags when windowing
kicks in. When a tag is focused, record its index.
Each time tags are re-rendered, if the saved index is not
among rendered tags, refocus it, otherwise, move focus
to the tags list.
2024-04-18 08:39:36 +03:00
abaevbog
816aaca380
vpat 5: do not include separator in qf list count (#4001)
Screen readers announce the index of the selected item
from the list of citations in the panel. This removes
the separators from the count, since they are not focusable
and should be skipped.
2024-04-18 00:35:27 -04:00
windingwind
451cb8109a fx115: Hide default focus ring 2024-04-17 17:30:05 +08:00
windingwind
e2b72944be
Fix attachments section not updated when attachments are changed (#3992)
fix: #3989
2024-04-17 05:12:32 -04:00
abaevbog
80ac628d98
vpat 52: added aria label to quick search button (#3986)
Plus minor tweaks to get fluent to work in shadow doms
of the search textbox components
2024-04-17 04:15:47 -04:00
windingwind
e2970f242c
fx115: Fix popupset display (#3998)
fixes #3979
2024-04-17 03:34:02 -04:00
Dan Stillman
4fe0ebc63b Fix skipBundledFiles not being passed to Zotero.reinit() in tests
Making tests much slower

Regression from 2051f08b4c
2024-04-16 06:09:59 -04:00
Adomas Venčkauskas
c9561f1041 Prevent itemlist in classic cit and edit bibl dialogs from expanding
Also
- Cleanup the XUL of said dialogs
- Refactor, spearate and clarify custom CSS injection into FX XUL
  elements
2024-04-16 11:47:01 +03:00
Adomas Venčkauskas
76b7f4be4f Fix styling in the generate bibliography dialog 2024-04-16 11:47:01 +03:00
abaevbog
363f97325f
vpat 9: set aria properties on the sync button (#3988)
Set the aria-label on the sync button. On focus,
register the sync status and set the aria-description
to be the last sync status.
2024-04-16 04:12:51 -04:00
abaevbog
d4905854eb
vpat 18: added aria labels to inputs in settings (#3985) 2024-04-16 00:51:49 -04:00
windingwind
687ba53afd
Fix attachment preview of the first added attachment (#3980)
Fixes #3973
2024-04-16 00:47:00 -04:00
Dan Stillman
86ee56cfac Automatically focus collection name in New Collection window
https://forums.zotero.org/discussion/113706/zotero-beta-7-adding-new-collection
2024-04-15 23:49:13 -04:00
Adomas Venčkauskas
cdacc42fd2 Set a reasonable min-height for classic citation and edit bibl dialogs 2024-04-15 14:54:54 +03:00
windingwind
df014bfb0b fx115: Fix tabbox tab color on MacOS 2024-04-15 15:47:53 +08:00
Dan Stillman
c6e5850e1c Update utilities submodule
Includes capitalizeTitle() fix:

https://forums.zotero.org/discussion/113653/zotero-7-beta-incorrect-behaviour-applying-title-case-action-to-titles-with-rich-text-markup
2024-04-14 03:22:41 -04:00
abaevbog
c7c3784413
fix focus test breakage after zotero@6859614 (#3977)
- edits to zoteroPaneTest.js focus tests to expect the updated focus
sequence: selected tab -> tabs menu -> sync button -> collectionTree
toolbar -> collectionTree -> tags selector -> itemTree toolbar
- updated tags selector keydown handling to explicitly handle all
tab/shift-tab events using moveFocus. It is more readable and explicit
focus handling for all components is required for programmic tab/shiftTab
events dispatched in tests to actually move focus
Fixes: #3975
2024-04-14 02:16:16 -04:00
Dan Stillman
2e8073ab9d Disable failing tabbing tests
To be fixed in #3975
2024-04-13 03:54:58 -04:00
Abe Jellinek
fc648a949a
Set main window min-width/height dynamically (#3841)
Correctly calculates minimums when window is too small, so it grows
when the collection tree is made bigger.
2024-04-13 03:44:17 -04:00
Abe Jellinek
860e2ce7ca Import AppConstants globally, lazily 2024-04-13 01:07:00 -04:00
Abe Jellinek
210d815173 Prevent duplicate main window
Fixes #3964
2024-04-13 01:07:00 -04:00
Dan Stillman
c31c091cb0 Fix size of progress meter at startup
(Though it still doesn't animate, for some reason)

Addresses #3961
2024-04-13 00:32:36 -04:00
Dan Stillman
d236058351 Fix styling in Document Preferences window 2024-04-13 00:30:29 -04:00
Dan Stillman
45fbf8bb12 fx115: Fix Edit Bibliography dialog
https://forums.zotero.org/discussion/113647/zotero-7-beta-73-fails-to-open-add-edit-bibliography-window-in-word
2024-04-13 00:29:36 -04:00
Abe Jellinek
c031e1fbbd Scaffold: Disable sticky headers in Tests editor 2024-04-12 13:21:17 -07:00
Abe Jellinek
b029e561f3 fx115: Scaffold: Restore flex ratio in Tests tab 2024-04-12 13:18:52 -07:00
Abe Jellinek
ba32c764a2 Update monaco-editor
A bit faster and smoother, plus sticky headers.
2024-04-12 13:12:30 -07:00
Dan Stillman
b3b0f04214 fx-compat: Add OS.Path.split() to shim 2024-04-12 06:41:38 -04:00
Tom Najdek
b814d0f4c8
Use mixin to reduce theme-related code duplication 2024-04-12 12:33:26 +02:00
abaevbog
68596148b0
vpat: 4 change focus sequence in zotero pane (#3954)
From the sync button, tabbing will move focus in the following mannger:
collections toolbar -> collections -> tags selector -> itemTree toolbar
-> itemTree.
2024-04-12 06:32:02 -04:00
abaevbog
9421e09e84
vpat 3: consistent focus order in all directions (#3953)
On last tab in the itemPane/contextPane, focus will wrap around
to the selected tab to complete the loop. It ensures
that the focus order is consistent regardless of the
directions.

Also, minor tweaks to focusWrapAround in Zotero_Tabs
to properly move focus to the last focusable entry in
the contextPane.
2024-04-12 06:26:47 -04:00
abaevbog
4432f88f1d
vpat_11: add roles and states to tags in selector (#3967)
- set each tag's role as "checkbox"
- set "aria-checked" status depending on if the tag
is selected
- added aria-label to tag selector so it does not
default to "grid"
2024-04-12 06:22:16 -04:00
abaevbog
91bc1a3e2d
vpat 6: aria labels for buttons in item/context panes (#3957)
Added aria labels and button roles for buttons in the
item/Collection pane. This includes buttons in the header
as well as rows from notes, related, collections, and
attachments section that act as buttons. Also added
missing aria-labelledby for mini-itembox rows below
attachment preview to have filename, dateModified
and etc. properly labelled.

This also covers most of vpat 16.

This does not affect how tags/header/itemBox entries are announced.
There is a separate issue with NVDA and JAWS sometimes struggling
with announcing text inside of `editable-text` component,
so this will be handled separately.
2024-04-12 04:53:35 -04:00
Adomas Venčkauskas
7f573d7717 Replace UA rv to potentially fix bot detection avoidance 2024-04-12 10:34:39 +03:00
Adomas Venčkauskas
f7a3f80d43 Make sure the tree in advanced search is constrained to window height 2024-04-12 09:15:09 +03:00
abaevbog
117197e11d
vpat: 1 add role="link" to links components (#3952)
- added role="link" to "zotero-text-link" custom component,
using that instead of directly setting the class
wherever possible
- in all other cases, added role="link" directly to links
- added tooltiptext and "noClick" option to zotero-text-link
so that this component could be used in attachmentBox.js
- use "keyboard-clickable" class in zotero-text-link
instead of a separate listener to handle keypresses for brevity
2024-04-11 23:02:53 -04:00
Abe Jellinek
5263c79ea8 BlockingObserver: Re-enable in CI 2024-04-11 22:59:48 -04:00
Abe Jellinek
35f5b19ffd BlockingObserver: Remove platformMajorVersion check 2024-04-11 22:59:48 -04:00
Abe Jellinek
5099da355c BlockingObserver: Don't block when browserId is 0 2024-04-11 22:59:48 -04:00
Abe Jellinek
6ebb15778b
fx115: Fix Scaffold richlistboxes and load dialog sizing (#3968) 2024-04-11 22:53:59 -04:00
Tom Najdek
14586d72b0
Use theme colors in debug viewer 2024-04-11 20:08:10 +02:00
Adomas Venčkauskas
5681954f39 Fix bad basicViewer toolbar styling on Linux 2024-04-11 17:10:33 +03:00
Dan Stillman
b44757ad3c CI: Re-enable retractions tests
See #3962
2024-04-11 06:09:12 -04:00
Dan Stillman
80357b1938 CI: Proper disabling of BlockingObserver for #3962 2024-04-11 06:08:02 -04:00
Dan Stillman
bef389e110 CI: Temporarily disable BlockingObserver test due to #3962 2024-04-11 05:58:51 -04:00
Dan Stillman
df3b9fa425 CI: Temporarily disable BlockingObserver to fix HTTP request failures 2024-04-11 05:30:01 -04:00
Adomas Venčkauskas
70d999291b Fix Dictionary window missing a scrollbar. Closes #3960 2024-04-11 10:53:54 +03:00
Abe Jellinek
398454f85b
zotero://open handler: Decode CFI and selector (#3955) 2024-04-10 19:54:04 -04:00
Tom Najdek
878fc20cec
fx115: Migrate or remove -moz-box-flex which is no longer recognized
* feed settings: part of the grid, not needed
* progress queue: migrated to flex
* tab-bar-container: already fixed in scss
* zotero-lookup-multiline-progress: migrated to flex
* zotero-lookup-textbox: removed, does nothing
* #zotero-prefpane-advanced #data-dir-path: migrated to flex
* #zotero-prefpane-sync: migrated to flex on #storage-url, removed from #storage-password to fix layout
* .search-condition: migrated to flex
* updates.css: migrated to flex
2024-04-10 17:32:04 +02:00
Dan Stillman
7f492529a8 Fix Python warning in merge_mozilla_files 2024-04-10 07:33:46 -04:00
Dan Stillman
d21fc40115 Update Mozilla strings for fx115
(Or technically 125, but I don't think any strings we need were
removed)

This fixes the Edit and Window menu (except for some macOS Window
strings that seem to come from the system) in non-English locales.
2024-04-10 07:33:40 -04:00
Dan Stillman
914a8d8956 fx-compat: Fix width of read-only data directory field in Advanced prefs 2024-04-10 07:17:21 -04:00
Dan Stillman
02a48c5a84 Add test for importing BibTeX from the clipboard 2024-04-10 07:13:47 -04:00
Martynas Bagdonas
1951c95e6b Wait until annotation saving is finished before triggering another save 2024-04-10 11:38:28 +01:00
Tom Najdek
fcc366abe2
Fix narrow input fields in "Attach link to URI" dialog 2024-04-10 11:51:09 +02:00
Adomas Venčkauskas
61db9ff0cc Advanced search: do not run search on adding condition
https://forums.zotero.org/discussion/113522/zotero-7-beta-unresponsive-during-advanced-search
2024-04-10 12:29:29 +03:00
Adomas Venčkauskas
1811c77f85 Advanced search: Fix window size issues
- Set minimum dimensions
- Make sure adding/removing conditions only resizes the window
  by the appropriate vertical amount

https://forums.zotero.org/discussion/113523/zotero-7-beta-advanced-search-window-resized-when-pressing
2024-04-10 12:29:25 +03:00
Adomas Venčkauskas
b17d1429bf Add missing semicolon in scss that breaks css generation 2024-04-10 10:31:34 +03:00
Dan Stillman
128a540af6 Fix plugin updating
Fixes #3942
2024-04-09 19:02:27 -04:00
Dan Stillman
0da1702589 Revert "fx115: fix element width/height persist (#3944)"
This reverts commit ecea550a37.

It seems to be causing various UI issues, including the items list
sliding under the item pane when the collections pane is expanded
(though I can no longer reproduce that).
2024-04-09 18:22:52 -04:00
Martynas Bagdonas
81eb0b51bc Fix incorrect flex value that prevents showing reader content in window 2024-04-09 23:15:23 +01:00
windingwind
ecea550a37
fx115: fix element width/height persist (#3944) 2024-04-09 18:00:40 -04:00
windingwind
49923780ca
fx115: replace text/unicode with text/plain in clipboard code (#3945) 2024-04-09 17:47:40 -04:00
windingwind
8b37a9889a Hide item notes in reader
fix: #3941
2024-04-09 20:36:28 +08:00
Adomas Venčkauskas
03d0ea4366 Update Word for Windows submodule 2024-04-09 10:19:48 +03:00
Dan Stillman
d654daae28 Add try/catch when loading plugin bootstrap.js 2024-04-08 23:17:25 -04:00
Dan Stillman
56c3635214 Merge new English strings 2024-04-08 18:18:28 -04:00
Dan Stillman
591132a2d9 Add brand.ftl to update wizard 2024-04-08 05:23:41 -04:00
Dan Stillman
db19e52547 Use user-provided codesign script for Windows signing
The `app/win/codesign` script should take a path to a file and a
description (`/d` parameter to `signtool.exe`) and sign the file using
whatever process the certificate authority requires.
2024-04-08 10:12:58 +01:00
Dan Stillman
38dc364f57 CI: Temporarily disable retractions tests due to failure in fx115 2024-04-08 03:11:23 -04:00
Dan Stillman
b443508b2f Update Mocha 2024-04-08 03:09:46 -04:00
Tom Najdek
91cd9814e1
Improve error message in the Mendeley importer (#3900) 2024-04-08 01:46:59 -04:00
abaevbog
66fa9fdc51
do not trigger event causing autocomplete error (#3925)
DOMInputPasswordAdded event is triggered on autocomplete
submission which causes an error in LoginManager.
The error gets logged in the console, though the autocomplete does
work. This just removes the event from ActorManagerParent.

Fixes: #3883
2024-04-08 01:45:00 -04:00
windingwind
86bb8f06cb
Fix richlistitem cut-off with double-byte characters (#3931) 2024-04-08 01:38:38 -04:00
windingwind
8b30f08db8 Update warning of ItemPaneSectionElementBase
fix: #3905
2024-04-07 23:21:34 +08:00
Dan Stillman
13754fe32c Stop copying vcruntime140_1.dll in x64 build
Now bundled with Firefox in 115
2024-04-06 16:16:05 -04:00
Dan Stillman
b3d07a5ddf Remove initPDFToolsPath() call 2024-04-06 16:16:04 -04:00
Dan Stillman
a9e57541cf Update update_exe to extract updater from Firefox ZIP as well
We don't have to actually update updater.exe.tar.xz every time we update
the launcher, but we might as well stage it from the same script.
2024-04-06 09:57:36 +01:00
Dan Stillman
bcf8d72b0b Add Windows ARM build (#3112)
Unimplemented:

- ARM-native installer/uninstaller

Untested:

- Installer/uninstaller/updater
- Word integration DLL

Also updates the launcher and updater to 115.9.0esr for x64. win32 stays
on 115.4.0esr for the launcher and 102.11.0esr for the updater because I
can no longer build it.
2024-04-06 04:54:07 -04:00
Dan Stillman
78c0a3d050 Remove Zotero.platform and Zotero.oscpu and add Zotero.arch
`Zotero.arch` == `aarch64`, `x86_64`, `x86`
2024-04-06 04:41:04 -04:00
Dan Stillman
20d6cde85f Remove obsolete initPDFToolsPath() in tests 2024-04-06 04:38:33 -04:00
Dan Stillman
c6256402e4 Fix logged error when changing data directory 2024-04-05 07:39:53 -04:00
Adomas Venčkauskas
1201cc5eb6 Add a comment about injected/overriden mozzila element styles 2024-04-05 14:20:53 +03:00
Adomas Venčkauskas
77f3be2bda Fix titlebar button breakage on macOS (6f8a1095) 2024-04-05 14:18:38 +03:00
Tom Najdek
b9de90c485
Mendeley importer: Sniff for mime-type if octet-stream reported. #3454 2024-04-05 12:57:52 +02:00
windingwind
4d05367f1d
Fix progress window title bar on win and linux (#3915) 2024-04-05 06:41:33 -04:00
windingwind
808fe9b665 Fix ItemDetails notifier type key 2024-04-05 18:39:53 +08:00
Adomas Venčkauskas
6f8a109574 fx115: Fix menubar text colour and window control buttons on Linux
Window control buttons are a regression in c8d49e76
2024-04-05 13:30:24 +03:00
Tom Najdek
9e5831a0bf
Fix misaligned spinner and flickering button in sync pref pane. Fix #3923
Using timeout in credentialsChange caused button to become momentarily disabled
making it flicker. I've verified that the delay is no longer needed and that the
button becomes disabled when using backspace to clear the login/password input field.
2024-04-05 12:05:47 +02:00
abaevbog
5f076dfeea
fx115: Citation dialog fixes (#3889)
- css tweaks for proper sizing and minor cleanup
of unused classes and properties
- added flip="none" for the panels to not bounce
around window's edges
- removed dialog's marginBottom on macOS - it doesn't
seem needed anymore
- close and reopen panel when window's height changes
on all platforms. It used to only happen on windows
but now the panel remains at it's original location on
macOS as well, so we'll always reopen the panel so
that is is positioned close to the dialog
- try to postion the panel in the middle on windows
- fix progress meter not appearing

* improved qf window drag

- not using old windowDraggingUtils since it causes
issues on windows with the mouse outrunning the window.
- instead, set -moz-window-drag: drag on dialog when
the mouse is over the red border
- added chromeutils param to the window. These are required
for dragging to work on windows and their values are
important because wrong values will cause the window to
shrink and basically disappear. 0,0,15,0 seems to work
most reliably though the reason why other values (e.g.
0,2,2,2 as on the ZoteroPane window) break window is not
clear
- added margins around the dialog on windows. moz-window-drag
doesn't seem to properly work for mouse clicks very close
to the window's edge
- with fx115, the <panel> does not follow the window
when it is dragged, so we have to hide the panel during dragging.
Unfortunately, mouseup/down events don't fire on the dialog when
moz-window-drag: drag is set on windows. Without these events,
as a workaround, we check window's position periodically and
hide/display the reference panel based on that.
- removed initial window.resizeTo() right when the content is
loaded. It's not needed and sometimes causes rendering
issues when the dialog appears shrunk.

* fx115 linux css edits

- try to make the dialog look like dialogs on other platforms.
Red background, no chrome etc. The actual window's background can't seem
to be transparant, so no round borders
- minor edits to sizing on linux
2024-04-05 12:07:24 +03:00
Tom Najdek
09eb9b4e77
fx115: Fix a couple of long tag fixer window size issues 2024-04-04 18:15:49 +02:00
Adomas Venčkauskas
e8df3c29dd Fix word processor add-on installation window being tiny. Closes #3906 2024-04-04 15:24:53 +03:00
Adomas Venčkauskas
34d857d310 fx115: Generate bibliography and doc prefs dialog fixes
- Use min-width: 100vw on the <dialog> element to prevent
  window.sizeToContent() from expanding the dialog unnecessarily on
  style selection
- Set the window min-width since fx115 width attribute on the window is
  ignored
- Set ids to persist position and dimensions
2024-04-04 15:24:53 +03:00
Dan Stillman
9df39c941b Fix error when unlinking account and deleting data
Fixes #3919
2024-04-04 07:10:04 -04:00
Abe Jellinek
1f5aca9c31
Create Bibliography: Fix "Language:" label alignment (#3921) 2024-04-04 02:11:39 -04:00
Tom Najdek
124b64f3a2
Skip importing annotations for non-PDF attachments 2024-04-03 13:21:52 +02:00
Abe Jellinek
ad661e9c8d
Preferences: Fix overflow at small window sizes (#3916) 2024-04-02 16:16:05 -04:00
Tom Najdek
5242851421
fx115: Fix "libraries to sync" appears in a tiny window
Also increased the width of the icon column to avoid truncation
2024-04-02 17:56:03 +02:00
Tom Najdek
0f6cae891d
JS Build: Fix watch exits if omni update fails 2024-04-02 17:38:15 +02:00
Abe Jellinek
009f2a5607
Bring Check for Updates to front if re-triggered, unify functions (#3861) 2024-04-02 06:42:35 -04:00
Abe Jellinek
0b04a518e7
Open CSL tools as chrome and use native controls (#3908) 2024-04-02 06:39:17 -04:00
Dan Stillman
db5db03c9c HTTP.checkSecurity(): Only throw for state == 'broken' 2024-04-02 06:22:14 -04:00
Dan Stillman
423393c78b Include domain in insecure-connection error 2024-04-02 06:22:14 -04:00
Dan Stillman
35aaa013ed Move ZoteroPane.syncAlert() to Sync.Runner.alert()
And use for sync setup in prefs so that it includes the dialog header
from the sync error messages
2024-04-02 06:22:14 -04:00
Tom Najdek
c16f5d1524 fx115: Fix detecting insecure connection no longer works 2024-04-02 06:22:14 -04:00
Dan Stillman
38287cec07 Fix error trying to delete a profile in Profile Manager
Regression from 23da0d70b0 -- commonDialog.xhtml now pulls in
include.js, but that window can be opened via Services.prompt.confirm()
in the Profile Manager when deleting profiles, which caused it to try to
initialize Zotero without an active profile, which was bad.

https://forums.zotero.org/discussion/112751/zotero-7-beta-68-error-when-attempting-to-delete-zotero-profile
2024-04-02 01:14:00 -04:00
windingwind
29c0460930
Fix ZoteroPane#loadURI with zotero: URLs (#3904) 2024-04-01 16:58:55 -04:00
Abe Jellinek
a78d1c3876
Fix window shrinking on each launch (#3910) 2024-04-01 16:33:38 -04:00
Abe Jellinek
669574b484
subprocess(): Use isAbsolute instead of checking for slash (#3911) 2024-04-01 16:22:05 -04:00
Dan Stillman
ff28541245 Fix webExtensionsMinPlatformVersion for fx115 (and maybe in general) 2024-04-01 15:23:35 -04:00
Abe Jellinek
2a114cef9b Preferences: Restore subpane Back button
It was technically still there, just offscreen. The wrapper element
was display: block, and some block layout quirk caused the button to
grow to fill the wrapper, which then put it offscreen when rotated.

This removes the wrapper and replaces it with a margin. Also fixes an
incorrect margin in RTL locales.
2024-04-01 11:57:00 -04:00
windingwind
751457268b Fix ItemDetails pinned pane with custom sections 2024-04-01 12:41:08 +08:00
windingwind
ee6b9d7af7 Refactor ItemPaneSection#_handleDataChange
Remove unused _handleDataChange and rename it to _handleItemChange
2024-04-01 11:35:36 +08:00
Tom Najdek
db499fdf2b
fx115: Fix basic viewer wrong window size 2024-03-31 13:00:41 +02:00
Tom Najdek
7bf0aa4958
fx115: Fix wizards
* Fix wrong window dimensions
* Fix missing buttons in import wizard
* Fix tiny items selector in RTF Scan Wizard
2024-03-31 12:39:12 +02:00
Dan Stillman
8bf8bfe804 Fix fetch_xulrunner error on Linux after eeefd1cc0 2024-03-31 06:29:13 -04:00
Dan Stillman
eeefd1cc0d Fix fetch_xulrunner error on Windows after 982d08798 2024-03-31 06:25:47 -04:00
Dan Stillman
72168a27ec Add default value for args parameter in subprocess() 2024-03-31 05:26:12 -04:00
Dan Stillman
5d150958de Use absolute path when running sw_vers 2024-03-31 05:26:12 -04:00
Dan Stillman
982d087987 Ignore relative paths in PATH in Subprocess.pathSearch()
Used by Utilities.Internal.subprocess() if a bare command is given
2024-03-31 05:26:12 -04:00
Dan Stillman
95f6d2aa72 Update builds to Firefox 115.9.1esr
This fixes the Mac launcher, which had been ARM-only. (This launcher is
built from 115.9.0esr, because 115.9.1esr, a recent security fix,
doesn't seem to have a public tag yet.)

The Windows build seems to work without updating the launcher from
115.4.0esr.
2024-03-31 05:25:03 -04:00
Dan Stillman
e1411982b2 Set Safari extension LSMinimumSystemVersion to Mojave for betas 2024-03-31 05:22:21 -04:00
Dan Stillman
f86d1e1d07 Update Firefox patch and mozconfig for Firefox 115 2024-03-31 05:22:11 -04:00
Dan Stillman
a45be190ea Fix incorrect instance of PathUtils.join() instead of joinRelative() 2024-03-30 08:10:33 -04:00
Dan Stillman
b9aced95c3 Make IOUtils and PathUtils available in require() scope 2024-03-30 07:19:28 -04:00
Dan Stillman
26bfe3dbdc CI: Fix "invalid ELF header" error for libc.so in OS.File.unixSymLink() 2024-03-30 07:00:52 -04:00
Dan Stillman
38e4fea455 Change "Add-ons" to "Plugins" in Tools menu
Addresses #3354
2024-03-30 05:13:03 -04:00
Dan Stillman
0d9a34ba28 Better styling of plugin homepage links 2024-03-30 05:13:03 -04:00
Dan Stillman
4ece2fdd19 fx115: Fix build error due to change to plugin homepage links 2024-03-30 04:55:36 -04:00
Dan Stillman
1ae4d12a39 Tweak error text when registering custom item-pane sections 2024-03-30 04:44:32 -04:00
Dan Stillman
56e02b3cad head → header in ItemPaneManager.registerSection() 2024-03-30 04:44:20 -04:00
Dan Stillman
5b1f2f4f90 Revert "Build deployment ZIPs from fx115 branch"
No longer needed on main branch

This reverts commit 8cd2c41e25.
2024-03-30 01:11:52 -04:00
Abe Jellinek
4e912b84c0 fx-compat: Copy over fx115 Window menu changes (#3899) 2024-03-30 01:02:09 -04:00
Abe Jellinek
1b646fb6e2 fx-compat: Fix up Scaffold a bit
- Output pane no longer gets huge after load
- URL box grows
- Metadata grid fills available space (but still needs work re overflow)
- row-resize cursor on Tests splitter
2024-03-30 01:02:09 -04:00
Abe Jellinek
0f61646e26 fx-compat: Preferences: Fix content not growing with window 2024-03-30 01:02:09 -04:00
windingwind
4407c24329 Support tooltiptext on ItemPane custom section head buttons
Fix ItemPane custom section head button event listener
Update ItemPaneManager document
2024-03-30 01:02:08 -04:00
Dan Stillman
849ffe0133 Don't try to register command line handler if already registered
Avoids an error when reiniting during tests
2024-03-30 01:02:08 -04:00
Dan Stillman
2ec6c7c72e Ignore Firefox components folder during build
After the removal of zotero-service.js for fx115, we no longer have a
`components` folder, so we don't need to shuffle things around to merge
our folder with the one from Firefox.

This fixes a build failure we were getting in CI after #3894.
2024-03-30 01:02:08 -04:00
Dan Stillman
8cd2c41e25 Build deployment ZIPs from fx115 branch 2024-03-30 01:02:08 -04:00
abaevbog
89320a7ee4 fx115: fix tags autocomplete breakage (#3882)
With fx115, changes from 49fe2b98d9
made the autocomplete popup appear blank when the reader tab is opened.
Not re-creating the PopupAutoComplete in tagsBox makes the items from
autocomplete popup visible again. But it makes the autocomplete appear
below the "Add tags" popup for annotations (what 49fe2b98d9
originally fixed), and it also creates a duplicate <popupset>
with a new autocomplete panel at the bottom of the DOM every time autocomplete runs.
The duplicate <panel>s do not have an id.

Manually adding a <popupset> with a <panel> whose id="PopupAutoComplete"
does not create any duplicates and properly positions the popup.

Fixes: #3881
2024-03-30 01:02:08 -04:00
windingwind
98ed686212 fx115: fix the itemBox rows stretching on menu open (#3898) 2024-03-30 01:02:08 -04:00
windingwind
61ef16b9b7 fx115: avoid window dragging on non-selected tab deck (#3897) 2024-03-30 01:02:08 -04:00
abaevbog
2f4a232c41 fx115: fix tooltips for tabs, tabs menu and virtualized table (#3877)
Fix and improve tooltip logic

- fx115: move main html-tooltip outside of the deck, otherwise it only
shows up in the library tab.
- Zotero_Tooltip is not required in the tabs bar and the button of the
tag selector. Setting the tooltip attribute on the closest XUL parent
and adding title attribute makes the tooltip properly appear.
- Remove manual handling of the hover effect from tabs manu. The
hover effect doesn't stick around after drag-drop with fx115 anymore,
so it's not required. And then the usual title attribute works for the
tooltip.
- Set title instead of tooltiptext attribute in tagSelectorList
so that the tooltip appears

After zotero@8e2790e,
the pointer effects don't fire on the actual cells of the table
(only on the parent row), so the tooltips do not appear for the cells.
This is a (hopefully) temporary solution to handle mousemove events over the row
of the table, find the right cell that the mouse is over, and
use Zotero_Tooltip to manually display the tooltip.

Tweaked Zotero_Tooltip to create the fake tooltip and place it into
the DOM. Zotero_Tooltip is also imported by virtualized-table as a module
because one shouldn't have to load it in .xhtml file for every new window
where the virtualized-table is used.
2024-03-30 01:02:08 -04:00
Adomas Venčkauskas
a92358bdd1 Fix fluent string breakage (regression 7276b8c50d). Closes #3894 2024-03-30 01:01:43 -04:00
Adomas Venčkauskas
d56181622e fx115: Update word processor submodules 2024-03-30 00:59:49 -04:00
Adomas Venčkauskas
75aade6422 fx115: Fix word plugin installer not throwing on failure 2024-03-30 00:59:49 -04:00
Adomas Venčkauskas
dca7dcccab fx115: Changes for word processor plugin support 2024-03-30 00:58:58 -04:00
Adomas Venčkauskas
7276b8c50d fx115: Readd support for -file, -url and winword command line handlers 2024-03-30 00:58:58 -04:00
windingwind
d57df7b583 fx115: note editor layout 2024-03-30 00:58:58 -04:00
Tom Najdek
7ea2709116 fx115: Broken tab bar layout on macOS 2024-03-30 00:58:58 -04:00
windingwind
c133fcb8e4 fx115: fix linux titlebar dragging 2024-03-30 00:58:58 -04:00
windingwind
e51739e1d4 fx115: fix layout on Windows 2024-03-30 00:58:58 -04:00
windingwind
f7ac2a348f fx115: fix item message layout 2024-03-30 00:58:58 -04:00
windingwind
0e14c9b3b3 fx115: fix duplicates pane layout 2024-03-30 00:58:58 -04:00
windingwind
9d5a706344 fx115: fix toolbar dropmarker always visible 2024-03-30 00:58:58 -04:00
windingwind
a110e86cff fx115: fix main window element layout 2024-03-30 00:58:58 -04:00
windingwind
bda096a26f fx115: fix attachment box label overflow 2024-03-30 00:58:57 -04:00
windingwind
42724d13f7 fx115: fix context pane notes list layout 2024-03-30 00:58:57 -04:00
windingwind
64489b243f fx115: fix context pane sidenav render 2024-03-30 00:58:57 -04:00
windingwind
41acf4c737 Implement ItemPane custom section API
Unify properties as getter in ContextPane
Replace section `mode` with `editable`
Remove section `inTrash`
2024-03-30 00:58:57 -04:00
windingwind
b34859d882 CEify contextPane 2024-03-30 00:58:57 -04:00
windingwind
b2ad17d604 CEify itemPane 2024-03-30 00:58:57 -04:00
Dan Stillman
827bcd704d fx115: Fix "Check for Updates" window
Also:

- Tweak text to be less alarming (fixes #3074)
- Don't show "No updates found" if update was already downloaded
  (fixes #3148)

Download progress still isn't shown (#3130) but I'll fix that later
2024-03-30 00:58:57 -04:00
Dan Stillman
b42e412c4f Spaces to tabs in updates.js 2024-03-30 00:58:57 -04:00
Dan Stillman
cd3fda98d1 Fix broken tests due to protocol handler and autocomplete re-registration
For the protocol handler, unregister on reinit(). For autocomplete, just
skip registration if already registered.
2024-03-30 00:58:57 -04:00
abaevbog
349ae52b9c fx115: working autocomplete (#3789)
- autocomplete registration removed from chrome.manifest
- static registration happening in zotero.js
- tweaks to autocomplete methods to implement nsIAutoCompleteSearch based on
https://searchfox.org/mozilla-central/source/toolkit/components/autocomplete/tests/unit/test_378079.js#154
2024-03-30 00:58:57 -04:00
Abe Jellinek
8cb0c58b60 Restore old flags
Fixes reports!
2024-03-30 00:58:56 -04:00
Abe Jellinek
506482551d Register protocol handler dynamically
Fixes reader but not reports yet.
2024-03-30 00:58:56 -04:00
Dan Stillman
2f49999a0f Fix position of window controls after fx115 merge 2024-03-30 00:58:56 -04:00
Dan Stillman
07b2e1d310 fx115: Fix replace_line line for commonDialog.xhtml 2024-03-30 00:58:56 -04:00
Bogdan Abaev
1b12b66e48 fx115: classic citation dialog fixes
- have panes for item selection occupy all available space
- use Zotero ES module to fix simple editor

search in classic citation dialog seems broken
2024-03-30 00:58:56 -04:00
Bogdan Abaev
cd5a9852d5 fx115: fixed sizing of selected items dialog 2024-03-30 00:58:56 -04:00
Bogdan Abaev
9be7337112 fx115: center dropmarker vertically
display:block was pushing dropmarkers to the bottom of toolbarbuttons
2024-03-30 00:58:56 -04:00
Bogdan Abaev
2d3bc12ca0 fx115: lookup panel fixes
- do not resize based on scrollable content - it shrinks the panel
- add padding into the stylesheet
- remove onShowing, since it doesn't seem needed anymore
2024-03-30 00:58:56 -04:00
Bogdan Abaev
48858fe07f fx115: fix the itemBox rows stretching on hover
display: block on hidden toolbarbuttons ends up stretching the icon and
the row. Use display: revert instead.
2024-03-30 00:58:56 -04:00
Bogdan Abaev
5f37ae4ab1 fx115: fix tabs menu
Fixed visuals and working drag-drop again.

Fx115 made previously used toolbarbuttons act very strange wih drag-drop:
instead of dragging the actual button, the #text node would receive
dragstart event and a single letter would end up being dragged.
During troubleshooting, elements created via document.createXULElement
had this issues while being dragged (or acted oddly in other ways, e.g.
refusing to be dragged at all).

This includes a minor rewrite to use div-s instead of XUL components.
2024-03-30 00:58:56 -04:00
Bogdan Abaev
87297f8d29 fx115 fixes
A number of style changes to fix layout for fx115.

- Make panes occupy all width/height based on layout.
- Display the tag splitter on windows and mac.
- Fix to odd fx115 behavior that gives an un-collapsed pane the
initial width of min-width * 2.
- Ensure that whenever there is a width attribute on contextPane, it will
be present in the style as well.
- Set width = 0 on zotero pane when it is not selected because it kept
preventing the contextPane from properly expanding.
- Context pane has its height changed on splitter drag.
- Set height of the context pane in stacked mode to 0 to avoid
having a blank gap after collapse.
- Remove negative margin before the toolbar if the collection tree
is collapsed on mac.
- Tweaks splitter styles to have mouse target of more than 1px.
Added positive z-index to make sure splitters are not covered by panes.
Splitter styles are somewhat unified for all platforms.
- Fix lookup panel sizing
- Quicksearch margin edits to not squize the input field.
- Collection and quick search fields layout fixed
- Use flex properties to fix layout
- fix outline display for editable-text
- fix the contextpane width going out of bounds
- stacked itemPane is visible after layout change
- In stacked view, prevent itemPane from being dragged so high that
it covers itemTree and overlaps with toolbar
2024-03-30 00:58:56 -04:00
Abe Jellinek
f4a33cc2e1 Fx115: Hide trailing separator in Add-ons menu 2024-03-30 00:58:56 -04:00
windingwind
62e8e97e7c Fix windows menuseparator style 2024-03-30 00:58:55 -04:00
Dan Stillman
dd745ed1aa fx115: PathUtils.normalize() requires files to exist
Unlike OS.Path.normalize()
2024-03-30 00:58:55 -04:00
windingwind
28f4857592 Fix windows menu style 2024-03-30 00:58:55 -04:00
windingwind
c8d49e76e5 Fix title bar layout 2024-03-30 00:58:55 -04:00
Dan Stillman
d8919d29f7 fx115: Update Windows build to 115.5.0esr 2024-03-30 00:58:55 -04:00
Dan Stillman
fcb96c775e Add Firefox build script for Windows 2024-03-30 00:58:55 -04:00
Dan Stillman
990e740afb fx115: Update Linux build to 115.5.0esr 2024-03-30 00:58:55 -04:00
Abe Jellinek
6854ad814b fx115: Preferences: Make style manager scroll again 2024-03-30 00:58:55 -04:00
Abe Jellinek
5ca626c143 Don't resize window when Sync preferences are loaded 2024-03-30 00:58:55 -04:00
Abe Jellinek
de42dce16e Fix some preferences layout issues
- Replace -moz-box- properties with flex equivalents
- Remove some of the old useless CSS
- Replace non-RTL-aware text-aligns
2024-03-30 00:58:55 -04:00
Abe Jellinek
0c5479f033 Replace TEMP_ strings in hiddenWindow.xhtml
Restores correct menuitem labels and shortcuts.
2024-03-30 00:58:55 -04:00
Dan Stillman
5730bf690e fx115: Don't try to spy on IOUtils function in test
Since it doesn't work
2024-03-30 00:58:55 -04:00
Dan Stillman
03d414f3bd fz115: Update SingleFile tests to expect <html style>
Which I guess we get now instead of `<html>`?
2024-03-30 00:58:54 -04:00
Dan Stillman
32793b80ae fx115: Temporarily disable missing entities for localized keys 2024-03-30 00:58:54 -04:00
Dan Stillman
f38506bccb fx115: Remove dialogOverlay.dtd include 2024-03-30 00:58:54 -04:00
Dan Stillman
65a7bf7fc0 Fix doctype declaration in updates.xhtml 2024-03-30 00:58:54 -04:00
Dan Stillman
92dfca2dc9 fx115: Temporarily disable integration loading 2024-03-30 00:58:54 -04:00
Dan Stillman
b6a597a7f9 fx115: nsIPromptService → Services.prompt 2024-03-30 00:58:54 -04:00
Dan Stillman
ef75f59037 fx115: Remove support for OS.File instance from md5Async() 2024-03-30 00:58:54 -04:00
Dan Stillman
95caebde2b Remove some old connector code 2024-03-30 00:58:54 -04:00
Dan Stillman
920461cd9d fx115: Update lots of OS.File/OS.Path uses 2024-03-30 00:58:54 -04:00
Dan Stillman
5a8a7ebccc fx115: Bundle PluralForm.jsm from older Firefox 2024-03-30 00:58:54 -04:00
Dan Stillman
33db3c28fc fx115: Restore test runner 2024-03-30 00:58:53 -04:00
Dan Stillman
d026d9684f fx115: Comment out -moz-tree-image CSS rules
We used them for pie spinners for attachment downloads in the items
list, but I guess we lost that with the new tree, and now they just log
warnings because the property was removed. We should reimplement with
SVG.
2024-03-30 00:58:53 -04:00
Dan Stillman
f472ee6a4c fx115: Remove global.dtd includes and chromedir attribute
It only had `locale.dir`, which it looks like we can handle in different
ways now:

- CSS rules with `:-moz-locale-dir(ltr)`
- `let isLTR = document.documentElement.matches(":-moz-locale-dir(ltr)");`
2024-03-30 00:58:53 -04:00
Dan Stillman
13ab3bd87f fx115: Add command-line handling to Firefox command-line handler
XPCOM objects have to be statically registered now, so instead of
creating our own command-line handler, just stuff our code into the
Firefox one.

A few parameters require the Zotero object, which isn't available in the
Firefox CLH, so I've left those in zotero-service.js for now until we
decide how to deal with those.
2024-03-30 00:58:53 -04:00
Dan Stillman
e76c6c6a1a fx115: Update loadURI() calls to take nsIURI and remove loadURIWithFlags
https://bugzilla.mozilla.org/show_bug.cgi?id=1810141
https://bugzilla.mozilla.org/show_bug.cgi?id=1444760
2024-03-30 00:58:53 -04:00
Dan Stillman
c36f40735c fx115: Change FilePicker to Mozilla ESM style
var { FilePicker } = ChromeUtils.importESModule('chrome://zotero/content/modules/filePicker.mjs');
2024-03-30 00:58:53 -04:00
Dan Stillman
95d577beb6 fx115: Add shims for most of OS.File, OS.Path, and OS.Constants.Path
var { OS } = ChromeUtils.importESModule("chrome://zotero/content/osfile.mjs");
2024-03-30 00:58:53 -04:00
Dan Stillman
2051f08b4c fx115: Move Zotero object initialization to zotero.mjs 2024-03-30 00:58:53 -04:00
Dan Stillman
c0aab70e03 fx115: Update loader.jsm with shims for removed OS.File functions
And include ChromeUtils
2024-03-30 00:58:53 -04:00
Dan Stillman
676c1d85aa fx115: Change Mozilla filenames from .jsm to .mjs in fetch_xulrunner 2024-03-30 00:58:53 -04:00
Dan Stillman
1cd01e8dc0 fx115: Update macOS build to 115.4.0esr 2024-03-30 00:58:53 -04:00
Tom Najdek
45bd374530
Fix error when dealing with invalid certificates (#3893) 2024-03-29 07:44:40 -04:00
Bogdan Abaev
0f8dce630d qf: fix insertNote dialog breakage
Fix breakage in insert note dialog caused by missing icon container after 1eaff81
2024-03-29 09:59:26 +02:00
Abe Jellinek
37a6df4ccb
editable-text: Clean up render() (#3895) 2024-03-29 01:16:58 -04:00
Abe Jellinek
f9e25675f0 editable-text: Prevent dropping text into read-only field 2024-03-28 13:13:10 -04:00
Abe Jellinek
489cee6b24 FileHandlers: Throw error when handler is missing on Windows/Linux
Not awaiting exec() has the side effect that we no longer get errors
if the executable is missing / isn't actually executable. Extract those
checks to prevent problems of the sort fixed in 63f54d3 in the future.
2024-03-27 13:52:15 -04:00
Abe Jellinek
63f54d3184 FileHandlers: Fall back when _getSystemHandler() fails
Continue to Zotero.launchFile() as intended.

https://forums.zotero.org/discussion/113179/pdfs-will-not-open-in-system-reader-when-double-clicked
2024-03-27 13:23:54 -04:00
windingwind
54b9ff6e8a
Preferences: Dispatch showing on all children (#3876) 2024-03-26 23:05:05 -04:00
Abe Jellinek
4f0e9bb9bb Scaffold: Enable syntax highlighting/formatting in Test Input 2024-03-26 16:36:05 -04:00
Abe Jellinek
abeef79a29 Update reader submodule 2024-03-26 14:22:34 -04:00
Abe Jellinek
a7044db15e Scaffold: Remember cookies set in browser by default
Making this configurable - it's worth testing translators to make sure
that they *aren't* dependent on some specific cookie configuration,
apart from obvious cases like login-gated sites.
2024-03-26 14:22:08 -04:00
Abe Jellinek
37ac6f9058 Update translate submodule 2024-03-26 14:19:47 -04:00
Tom Najdek
a0658b5ada
Fix styles in CSL Preview window (#3873) 2024-03-24 05:56:23 -04:00
Abe Jellinek
65db66eb33 Add tests for shortTitle tag closing 2024-03-22 13:14:52 -04:00
Abe Jellinek
750f53aa53 Update translate submodule 2024-03-22 13:14:43 -04:00
Abe Jellinek
bef7ecd409 Scaffold: Print attachment URLs
Useful for debugging. This doesn't apply to tests.
2024-03-22 12:44:30 -04:00
Abe Jellinek
ff96de8723 Scaffold: Remove id field from returned items
Generates confusing diff output and isn't necessary.
2024-03-22 11:41:14 -04:00
Stefan Weil
054a7526d3
Update used GitHub actions (#3870)
This fixes the current build annotations caused by deprecated versions:

    Node.js 16 actions are deprecated.
    Please update the following actions to use Node.js 20:
    actions/checkout@v3, actions/setup-node@v3, actions/cache@v3.

For more information see
https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/.

Signed-off-by: Stefan Weil <sw@weilnetz.de>
2024-03-22 01:55:36 -04:00
Tom Najdek
19f4509075
Fix incorrectly colored icons in create collection dialog (#3872) 2024-03-22 01:23:31 -04:00
Adomas Venčkauskas
0419c33e3d Virtualized Table: Do not display the focused outline when row is selected 2024-03-21 09:19:42 +02:00
Abe Jellinek
51d77d5699
Update prepare_build for Python 3.12 (#3865) 2024-03-20 23:51:25 -04:00
Adomas Venčkauskas
4f5c1c90af Restore focused virtualized-table row display after redesign 2024-03-20 10:02:39 +02:00
Martynas Bagdonas
a50b7ef04a Finish dictionary installation even if file cleanup fails (on Windows) 2024-03-19 12:03:27 +02:00
Adomas Venčkauskas
aef07afd32 Update Word for Mac submodule 2024-03-19 11:11:41 +02:00
Abe Jellinek
0e087c8441 Update translate submodule 2024-03-18 15:50:30 -04:00
Abe Jellinek
cee1e3a596 Scaffold: Update copyright year automatically 2024-03-18 12:20:22 -04:00
Sebastian Karcher
6d02076a1c
Scaffold: Fix MARC template, update copyright (#3856) 2024-03-18 12:17:48 -04:00
abaevbog
1eaff8110c
Quick-format: do not hide reference panel (#3816)
Citation dialog: keep reference panel open without selection

- Reference panel remains opened while the focus is on an input
- The first item from the reference panel is no longer selected by default
to avoid unwanted items being added as a bubble
- The first item from the reference panel is selected only when the
dialog has no bubbles or when a search for a non-empty input has ran
- Shift-Enter from input or reference panel will accept the dialog's
state instead of creating a bubble
- Ensure that the reference panel reloads when a bubble is deleted
- Added button to accept the citation dialog

Some other changes:
- Z-icon and spinner/accept icon occupy the same amount
of space
- Ensure that window's width is 800px
- Set the editor's width dynamically when DOM is loaded
- Remove not used css classes and css adding margins to
z-icon.
- Do not accept/bubbleize while loading
2024-03-18 14:27:21 +02:00
Bogdan Abaev
3dc37183b4 qf: fix wrong references panel position on windows
- use dialog as the anchor, not the document element
- after the window is resized, the panel will remain
where it was, so if it's far away from the dialog,
if gets closed and re-opened to reposition it.
2024-03-18 13:00:17 +02:00
Tom Najdek
f144f3a725
Don't use link icon in tabs or open-tabs menu. Resolve #3837 2024-03-15 13:49:43 +01:00
abaevbog
e5dd25fbd5
Fix collections filter not hiding on windows (#3850)
On windows, if the cross icon from the collection filter
search-textbox is clicked, the 'blur' event fires before
the input is cleared, and the filter is never hidden.
To make sure that the search field ends up going away,
hide it if the field is empty and not focused in input
handler.

Fixes: #3840
2024-03-15 03:37:42 -04:00
Bogdan Abaev
eb2ef8a2d1 shortcuts of tab navigation capturing events
2 listeners handle shortcuts and hotkeys: bubbling ZoteroPane.handleKeyDown
and capturing Zoteropane.captureKeyDown.
We generally want shortcuts to be handled by the non-capturing listener
to avoid a conflict with lower level component that may want to handle the event
(e.g. we want to handle Escape keypress only if nothing else took care of it).
Tab navigation is an exception, since we want it to happen all the time.
For example, Ctrl+PageUp can be handled by itemTree but we want to override
it to make sure that it selects the tab regardless of other listeners.

This fixes regression after 5f0e3d5
where the tab selection logic was never reached because the event was handled
by itemTree.
2024-03-13 15:38:40 +02:00
Bogdan Abaev
e07ac555af fix collection highlight regression
- Bring back un-highlighting of collections on keydown if any other
control key besides Ctrl/Options is pressed (with better comments).
It fixes regression after 527fa5b12f
where if one presses, for example, Ctrl-Shift-A to copy an item,
collection highlighting would scroll the collection tree for no reason.

- To decrease the chance of collection highlighting being activated when
it is not intended, only highlight collections when the itemTree is focused
2024-03-13 15:38:40 +02:00
Tom Najdek
95cfc4be13
JS Build: Fix watch exits with error in some scenarios 2024-03-13 11:34:53 +01:00
Tom Najdek
f8d59d14bc
Move tags back to beginning of item rows #3781 (#3839)
To get the current behaviour (tags after title), set
pref `extensions.zotero.ui.tagsAfterTitle` to true.
2024-03-12 19:02:52 -04:00
abaevbog
8e5732cf9c
fix to "show in library" not focusing the itemTree (#3836)
- handle additional focusElementID options value in Zotero_Tabs.select to
focus a node with the specified ID, instead of what was recorded
as last focused element
- use that parameter in ZoteroPane.selectItems to make sure that
itemTree is focused after the tab is switched to zotero-pane
- removed redundant calls to Zotero_Tabs.select('zotero-pane') after
Zotero_Pane.selectItems
2024-03-12 18:57:48 -04:00
Tom Najdek
e7f899c09d
JS Build: Fix watch exits when encountering an error 2024-03-12 17:04:47 +01:00
Abe Jellinek
c31a40c749
editable-text: Make dropping text work when field is unfocused (#3730) 2024-03-12 01:38:00 -04:00
Abe Jellinek
5489b6cc4b
Scaffold: Show current Git branch in title (#3834) 2024-03-12 01:33:03 -04:00
abaevbog
844fd98c72
qf: fix suppress author checkbox click (#3832)
Use <checkbox> instead of <html:input type="checkbox"> for the
suppress author checkbox. <html:input> on mousedown on the actual box
looses focus, so the popover is immediately closed by focusout listener.
Fixes: #3830
2024-03-11 17:53:58 -04:00
windingwind
92a04fcffa
Revert editable text style on Windows (#3828) 2024-03-11 02:25:26 -04:00
windingwind
e08c34b497
Use system browser for plugin links (#3820) 2024-03-11 02:19:09 -04:00
windingwind
f0db826b72
Fix update.xhtml style on Windows (#3824) 2024-03-10 01:57:38 -05:00
windingwind
edb9a06910
Fix editable-text height on Windows (#3823) 2024-03-10 00:56:18 -05:00
windingwind
d2dc9dd3c0
Fix collapsible section summary overflow-wrap (#3819)
fix: #3818
2024-03-09 05:58:09 -05:00
Tom Najdek
16fa1ac893
Fix attachment icon remains after deleting attachment. Fix #3779 2024-03-08 15:22:15 +01:00
Dan Stillman
d0299a1acc Update reader submodule 2024-03-08 06:01:25 -05:00
Adomas Venčkauskas
633bee45af Fix Citation dialog not working on Windows with high refresh rates
Closes #3804
2024-03-08 12:24:01 +02:00
Dan Stillman
af1aab3f0a Don't log deletion of CSL locale support files during build 2024-03-08 01:29:44 -05:00
Tom Najdek
0478e66a47
Improve build process. Fix #3758 (#3809)
- Remove directories that should no longer be present in the build.
- Add watching for new files.
- Add debounce and batching to reduce verbosity and avoid needless cleanup and "add to omni" steps
  when entire directories are affected.
2024-03-08 01:26:24 -05:00
Bogdan Abaev
d688ebc10f qf: fix conflicts with windows input styles
Fix regression caused by 23da0d70b0 where
unwanted styles were applied to inputs inserted into quick format dialog
2024-03-07 20:12:31 +02:00
Abe Jellinek
ac196a5944
Preferences: Don't reopen to subpane (#3802) 2024-03-07 03:09:30 -05:00
Abe Jellinek
1ca23fedb2 FileHandlers: Don't await long-running exec() on Windows/Linux
We can await /usr/bin/open on macOS because it returns as soon as the
application has begun launching, but we can't await when we exec a
program directly on other platforms.

Fixes #3799
2024-03-06 14:03:17 -05:00
Abe Jellinek
ba86e9b4c9 Preferences: Catch l10n failure and print a more helpful error 2024-03-04 11:24:32 -05:00
windingwind
23da0d70b0
Implement Windows redesign for native elements (#3727) 2024-03-02 02:51:55 -05:00
windingwind
337f54ac03
Fix attachmetsBox inTrash? (#3780) 2024-03-01 17:11:11 -05:00
abaevbog
b047f3d903
itemBox: ensure the grippy is hidden if <2 authors (#3735)
When contextmenu closes, it clears visibility style from all components.
It is added temporarily so that the options buttons do not
disappear if the mouse leaves the row. The visibility setting for
the grippy for items with only one author should be in
a separate class so that grippy is not displayed by accident.

Fixes: zotero#3732
2024-03-01 00:46:09 -05:00
Abe Jellinek
ea63780600 FileHandlers tests: Wait for notifier instead of _setState() call
_setState() doesn't await setAttachmentLastPageIndex(), so the setting
sometimes won't be updated in the cache by the time we call
getAttachmentLastPageIndex() below. Notifier event should work every
time (and is a lot simpler).
2024-02-29 11:05:12 -08:00
Abe Jellinek
9e78957c72 Preferences: Fix freeze/double dialog when setting data directory
Addresses #3767
2024-02-29 10:45:52 -08:00
Abe Jellinek
19b12b613b Preferences: Dispatch synctopreference *before* setting preference
Matches pre-fx102 behavior.
2024-02-29 10:44:05 -08:00
Abe Jellinek
ae441c6db1 FileHandlers: Fix Acrobat and PDF Expert not opening on macOS
Fixes #3771
2024-02-29 09:24:11 -08:00
Abe Jellinek
352f71e32e
Fix zotero://open/ and FileHandlers regressions (#3761) 2024-02-29 05:08:33 -05:00
abaevbog
55c5fd2783
do not change input's colors in dark mode (#3769)
Hardcode transparent background and black text color for inputs.
Otherwise, the inputs end up with dark background and white text
which does not work with the rest of the dialog that always has white
background.
This is temporary until the rest of the dialog works with the dark mode.

Fixes: #3768
2024-02-29 00:12:42 -05:00
Abe Jellinek
5e10e627c3
Replace calls to keepParents() with keepTopLevel() (#3766) 2024-02-28 19:13:20 -05:00
yexingsha
b8fa54ecce
Increase image icon contrast (#3762) 2024-02-28 17:03:14 -05:00
Dan Stillman
8f8c0d0795 Update note-editor and reader submodules 2024-02-28 04:10:12 -05:00
Abe Jellinek
cbe75f1de4
New Collection dialog: Widen (#3733) 2024-02-28 01:53:32 -05:00
abaevbog
1a48e4d3f6
quick-format: post-accessibility update edits (#3753)
- Backspace from the very beginning of the input will delete the previous
bubble, as opposed to removing the input itself. If it makes it so that
two inputs are next to each other, they are merged.
- When a new input is created via a mouse click, and the current input
is empty, manually delete it right away. Waiting for the blur handler
to remove it makes it so that the bubbles shift back and forth for a moment
when a new input is added and the old input is not removed.
- Minor tweak to make sure that even if there's a 'br' before an input,
clicking before it will not make a new input and just refocus it.

Fixes: zotero#3749
2024-02-28 00:20:54 -05:00
Abe Jellinek
368e94fbb1
Locate menu: Don't show "New Tab" when external, fix bugs (#3755)
- Run label update logic once instead of repeating on every item
- Show plural attachment type when multiple attachments of same type
  are selected (instead of "Attachments")
- Fix incorrect icon and label showing when openReaderInNewWindow = true
2024-02-28 00:13:07 -05:00
Abe Jellinek
e1538d9f10
Use HTTPS when opening DOIs via Locate menu and double-click (#3757) 2024-02-27 17:42:08 -05:00
Abe Jellinek
50331b9a04 editable-text: Accurately set height limits from min/max-lines
2ex wasn't quite right, so let's use the actual line-height when
possible.
2024-02-27 11:34:02 -08:00
Abe Jellinek
ea1b18881c zotero://open/: Use openReaderInNewWindow pref
Fixes #3541
2024-02-27 08:39:19 -08:00
Abe Jellinek
59fbdf6048
Set max-height on note-editor Tags/Related and allow to scroll (#3692) 2024-02-27 07:50:56 -05:00
Dan Stillman
6327e55599 Include multilocale.txt in xulrunner hash 2024-02-27 07:42:24 -05:00
Dan Stillman
31fc4dc950 Add delays when downloading Mozilla dictionaries 2024-02-27 07:01:49 -05:00
Dan Stillman
98fc32a65e Add Tamil locale from Transifex
Contributed by @TamilNeram
2024-02-27 07:01:49 -05:00
Adomas Venčkauskas
f7cb5f89a7 Update LibreOffice submodule 2024-02-27 13:27:04 +02:00
Adomas Venčkauskas
3b30c5821a Allow the word plugin installer to be async 2024-02-27 13:23:29 +02:00
abaevbog
5f0e3d550b
make shortcuts keypress listener non-capturing (#3743)
- ZoteroPane.handleKeyDown does not capture events. It is not strictly
necessary now but it helps to avoid future issues such as one solved in
b15fb36f1b. One benefit from this now is
if one tabs onto a toolbarbutton that opens a menu in contextPane (e.g.
an options button in itemBox), clicks space to open the menu and then
escape to close it, this will keep focus where it was, while the capturing
listener would immediately shift the focus to the reader.
- Removed shift-tab specific case from the handler. It looks like it
was handling the shift-tab in the following scenarios:
from notes search bar (can just be handled by Tab),
from "Return to notes list button" in note editor toolbar (it's no longer there),
from a child of zotero-view-item e.g. itembox. (does not apply,
since zotero-view-item itself is a focusable scrollable area)
- use reader.focus() instead of reader.focusFirst() in tab handler,
since focusFirst() focuses the <body> of the browser and it's not interactable.
2024-02-27 01:52:40 -05:00
Abe Jellinek
bbab56837e Set Abstract section summary to abstract 2024-02-27 01:50:40 -05:00
Abe Jellinek
cb420fb570 Add support for collapsible-section summaries 2024-02-27 01:50:40 -05:00
Dan Stillman
0ace47f742 Quick Format: "Return" → "Enter" for aria-describedBy on macOS 2024-02-27 01:39:26 -05:00
Dan Stillman
a443bc066f Quick Format: Tweak aria-describedBy text 2024-02-27 01:30:09 -05:00
abaevbog
0007d077cc
accessibility improvements for quick format dialog (#3464)
- removed all cursor-related logic. Instead, insert a new input component
each time the user wants to type. The input remain between bubbles
and focusing on one will open the reference panel. Leaving the input hides
the reference panel.
- during drag-drop reordering, lock the editor height so that it doesn't
get out of sync with the window.
- removed the iframe, since it was no longer needed.
- keyboard navigation: Home/End will place an input at the start/end
of the editor and focus it. Tab focuses the last active input if any, or
the input in the end otherwise. Shift-Tab from the editor focuses the
dropdown button if it is active. Tab from the input will focus the first
entry of the reference list. Tab from the reference list will focus the
active input. Shift-ArrowLeft/Right from focused bubble will swap the bubble
with its neighbor. ArrowDown/Up from bubble will open/close the citation dialog.
- when a reference item is selected, previously active input is re-focused.
- aria-properties to have voiceover, JAWS and NVDA read bubbles, inputs and
reference items, as well as announce hints about available keypresses.
- typing from bubble or the reference panel will refocus previously active
input
- different minor updates to make the functionality less janky
- refactoring of refreshing and resizing of the reference panel to
be more straightforward and to only do it when necessary.
E.g. clicking on a bubble and closing the
popover after will not rerun search and just display the old results.
- some throttling logic so that two escape keypresses one after another
when the itemPopover is open do not close the entire dialog
- renamed variables: qfb=dialog, qfe=editor, panel=itemPopover
- use short form of locator string for bubbles
2024-02-27 01:00:14 -05:00
Martynas Bagdonas
5dcaf65757 Don't show context pane toggle in standalone reader window 2024-02-26 20:43:20 +02:00
Tom Najdek
cffb5cdd4b
Fix best attachment type sometimes missing. Fix #3740 2024-02-26 13:14:27 +01:00
Abe Jellinek
52856ae696 Fully block all HTTP requests in the reader 2024-02-24 02:21:06 -05:00
Abe Jellinek
6095ee91ff Generalize RemoteResourceBlockingObserver -> BlockingObserver 2024-02-24 02:21:06 -05:00
Dan Stillman
965149fe0f Merge new English strings 2024-02-23 16:59:24 -05:00
Abe Jellinek
a7d59a90d3
Unify attachment opening code and support EPUB/snapshot note links (#3705) 2024-02-23 06:38:11 -05:00
Tom Najdek
b1333d0e9d
More attachment type icons in the item tree (#3645) 2024-02-23 06:11:40 -05:00
windingwind
ae8cbdf3b7
Support keyboard navigation in attachment preview (#3739) 2024-02-23 05:58:09 -05:00
Abe Jellinek
93536a1592 Fix autocomplete issues caused by stopping 'change' propagation
Only stop propagation when the window is inactive, and don't fire the
synthetic event on blur. Does the same thing as efd7ec6 was intended to
do, but in a less heavy-handed way.

Fixes #3734
2024-02-22 16:39:20 -05:00
Abe Jellinek
efd7ec6dc2 Fix title/abstract saving when window becomes inactive
We weren't stopping 'change' from propagating upwards when the change hadn't
actually been committed yet, and the pane-header and abstract-box CEs
listen to that event instead of 'blur'.
2024-02-22 09:56:28 -05:00
abaevbog
26fd57398c
do not focus contextPane after it's opened (#3728)
When contextPane is toggled open, keep the focused element unchanged

Fixes: #3716
2024-02-22 02:36:51 -05:00
Abe Jellinek
b15fb36f1b editable-text: Don't put 'null'/'undefined' in the field
In case something deleted dataset.initialValue after focus and before we
received this keypress.

Addresses #3725. Might still want to rework that listener, but this
change made sense regardless, since the same kind of race condition
could be triggered elsewhere.
2024-02-21 16:07:02 -05:00
Abe Jellinek
07296b4506 Merge: Count last word when calculating most frequent words
Not that it really matters.
2024-02-21 15:12:14 -05:00
Abe Jellinek
69d9b01b6e Preferences: Exclude HTML hidden="" elements from search 2024-02-21 14:58:49 -05:00
Abe Jellinek
71a85e4d06 Preferences: Delete menulist observer after disconnecting 2024-02-21 12:47:03 -05:00
Martynas Bagdonas
38a42d3c91 Properly trigger shifted annotation sync after deleting PDF pages 2024-02-21 15:04:24 +02:00
Abe Jellinek
64b8c7b250
SingleFile actor: Skip cross-origin frames to fix error (#3721) 2024-02-21 06:43:45 -05:00
Abe Jellinek
130a72af1b
Fix empty Quick Copy locale dropdown (without a freeze) (#3720) 2024-02-21 06:42:59 -05:00
yexingsha
35a324b65b
Replace tag icons and update scss (#3722) 2024-02-21 06:39:12 -05:00
Martynas Bagdonas
2918e5d1a4 Don't use sortable property when inserting a citation inside note editor
Fixes #3723
2024-02-21 09:12:49 +02:00
windingwind
c9b639b311 Fix window titlebar background color 2024-02-20 14:07:40 +02:00
Dan Stillman
91e1c6ca30 Update reader submodule 2024-02-19 05:12:57 -05:00
Abe Jellinek
1f599283df
Fix indexing files with text content types that Firefox won't display (#3708) 2024-02-19 05:11:16 -05:00
Tom Najdek
24cb38cfc8
Fix attachment column icon flickering upon selection (#3695) 2024-02-19 05:04:28 -05:00
abaevbog
826774b1f7
keyboard navigation for tag selector (#3615)
- Tab from the tags list or shift-tab from the tags filter field
focuses the first non-disabled tag. If there are none, the tags are
skipped and the focus moves directly to the input field or the tags list.
- Arrow Right/Left move focus between tags skipping over disabled tags
- Space/Enter clicks on the selected tag
- Space/Enter click on the search button when focused
2024-02-19 04:57:03 -05:00
Tom Najdek
1b751d675b
Trim spaces from values in getFileBaseNameFromItem (#3711) 2024-02-19 04:43:19 -05:00
abaevbog
61d3c5c85c
revision of focus management through the reader (#3687)
- brought back escape behavior that just focuses the reader whenever
a reader tab is opened, wherever it comes from (unless it's from an
element that is .open - like an item type menu, in which case just
let it get closed)
- removed moving focus from contextPane title to sync button on shift-tab
- using new reader methods onIframeTab, onToolbarShiftTab to move focus
to the contextPane on tab from reader iframe or to the sync button
on shift-tab from the toolbar

So now, the focus path is: tab bar -> tabs menu -> sync button -> reader
toolbar -> reader sidebar -> reader scrollable area -> contextPane title
(if visible) or tab bar
2024-02-19 04:03:00 -05:00
windingwind
294835b995
Fix csl editor style in dark theme (#3702) 2024-02-19 03:35:57 -05:00
Dan Stillman
5940b63908 Revert "Fix empty Quick Copy locale dropdown"
This reverts commit 0dfe276d9b.

Causing a hang when some people mouse over the Export tab:

https://forums.zotero.org/discussion/111956/zotero-7-beta-freezes-in-the-settings-panel
2024-02-19 03:32:53 -05:00
Martynas Bagdonas
009a2ca38a Properly trigger note image attachment sync and display it when finished 2024-02-16 14:38:17 +02:00
Martynas Bagdonas
d47ed5f747 Hide unnecessary menu separators in Tools menu 2024-02-16 12:31:58 +02:00
Tom Najdek
abe8def0f1
Trim leading/trailing space in filename format string. Fix #3701 2024-02-16 10:17:03 +01:00
Adomas Venčkauskas
f548efde15 Citation dialog: Allow citing the same item multiple times
Removed as part of #3544 but it turns out there's good uses for it:
https://forums.zotero.org/discussion/111831/multiple-citations-of-the-same-source

The same item still won't appear multiple times in the Open Documents
section, but you can look for it in your Library or Cited section
2024-02-15 08:47:57 +02:00
Abe Jellinek
fbc82f687d updateLocaleList: Append menuitem to menupopup, not parent menulist
Appending to the menulist sort of worked - the text of the added
menuitem appeared in the menulist label, albeit off to the right -
but the item didn't actually show in the menu and didn't get removed
on subsequent calls.
2024-02-14 16:38:54 -05:00
Abe Jellinek
ba5d34876e Don't fire syncfrompreference when value hasn't changed
Except during initialization. Fixes an infinite loop when the Quick Copy
locale is set to a custom value.
2024-02-14 16:36:22 -05:00
Abe Jellinek
0dfe276d9b Fix empty Quick Copy locale dropdown
Closes #3254
2024-02-14 16:09:06 -05:00
Abe Jellinek
43d9d604a6 Fix blockRemoteResources passed to wrong method
After OOPification of HiddenBrowser.jsm. The constructor accepts
blockRemoteResources, the load() method ignores it.
2024-02-14 11:25:44 -05:00
Adomas Venčkauskas
6dae7037e1 Restore GTK-informed widget styling for menupopups on linux
Firefox restyled Linux menupopups at some point to no longer conform to
the DE defined styles for GTK widgets. This removes that custom firefox
styling and uses DE defined values instead. This is especially apparent
on Linux Unity where menupopups are dark in both light and dark themes
by default for apps.
2024-02-14 06:24:00 -05:00
Adomas Venčkauskas
beb7b51cb3 Adjust the titlebar/menubar xml and styling.
Reasoning:
- Different Linux DEs specify different titlebar button (min, max,
close) locations which we did not and could not support before.
- Previous approach copied from Firefox depended on custom offsets
specified in CSS instead of allowing the browser engine to place
elements

Changes:
- Titlebar and menubar no longer collapsed into each other with a
negative margin, instead just a single flexbox (on macOS the titlebar
is still collapsed into the tab bar)
- Support for -moz-gtk-csd-reversed-placement to correctly place the
titlebar buttons on Linux
- Removed/changed some code copied from Firefox that does not apply or
uses the wrong selectors
- Fixed the display of Linux Unity DE buttons with icons appearing outside
of button borders
- Removed the Z in the titlebar on Linux since only a few DEs use that.
- Aligned the tabbar on Linux and Windows to the left margin of the
window.
2024-02-14 06:24:00 -05:00
Adomas Venčkauskas
34b389d118 Fix the startup missing data directory picker not working 2024-02-14 13:22:41 +02:00
Abe Jellinek
f729172bdd Fix error after setting custom file handler 2024-02-13 13:58:49 -05:00
Abe Jellinek
872e7b2427 Item/attachment box: Prevent default label focus/blur behavior
Since ceb1dd7da3 added a tabindex on
#zotero-view-item, clicking anywhere outside a field in the pane will
blur the active field. That's an improvement, but it conflicted with our
custom label behavior - when an active field's label is clicked, we want
to blur it and keep it blurred, but the default behavior is to re-focus
it on mouseup.

Fix by preventing the default focus behavior on mousedown/click.
2024-02-09 14:38:56 -05:00
Abe Jellinek
6a39980a97 Save Abstract edits when switching items
Since itemPane.js sets mode before item, the editable-text's value would
get reset before save() ran.

Not touching the header since we're replacing that with an item-box
field (which does not have this bug) soon anyway.

Fixes #3679
2024-02-09 12:21:56 -05:00
Adomas Venčkauskas
0aea17581e Citation Dialog: Show selected notes in the Add Note dialog
Closes #3642
2024-02-09 14:24:05 +02:00
Adomas Venčkauskas
d852185950 Citation Dialog: Fix open documents being matched multiple times.
Closes #3690
2024-02-09 14:17:43 +02:00
Abe Jellinek
4a91df1b1d
Add test for SandboxItem#setExtra() (#3572) 2024-02-09 09:34:47 +02:00
Adomas Venčkauskas
90282b3739 Clear item tree pivot after switching collections. Closes #3551
After switching collections and shift-clicking on the item tree
will no longer group-select from the pivot of the previous selection
2024-02-08 15:03:02 +02:00
Bogdan Abaev
527fa5b12f linux: collection highlight on control
On Linux, trigger collection highlighting on Control instead of Alt
to not interfere with the menubar.

Addresses: #3683
2024-02-08 10:07:36 +02:00
Abe Jellinek
bf17e5162e Advanced Search: Remove dropmarker hover/active/open background
Fixes #3661
2024-02-07 14:51:38 -05:00
Adomas Venčkauskas
88482bd776 Do not register the menu access key handlers multiple times 2024-02-07 17:18:56 +02:00
Bogdan Abaev
fc5aa1a6ba win: no collection highlight if input is focused
So that collections do not randomly get highlighted when one clicks
Ctrl-C/Ctrl-V to copy-paste something in the itemPane
2024-02-06 15:20:43 -05:00
Bogdan Abaev
579106c3af new accent-highlight color for virt table
Added accent-highlight color for highlighted virtualized table rows
2024-02-06 15:20:43 -05:00
Dan Stillman
2665090aa9 Update reader submodule 2024-02-06 13:57:59 -05:00
abaevbog
ceb1dd7da3
additions to keyboard nav for toolbar buttons and reader (#3602)
- handle space and enter in zotero pane to always click on toolbarbutton.
It ensures consistent behavior across all components to avoid Enter
triggering click on some buttons but not others.
- address the issue of focus not being able to leave the reader once it
gets there. On Escape, when reader is opened, instead of re-focusing the reader,
focus the selected tab. From there, Enter will focus the reader, and tabbing
allows you to reach the itemPane.
- Tab/Shift-tab moves focus between Sync button and itemPane when
reader is opened
2024-02-06 12:51:06 -05:00
Bogdan Abaev
e69ce9b86c avoid ztabindex overlap when new creator is added
Increated the ztabindex offset for non-creator rows, so that when a new
creator is added but not saved yet, there is no two elements with
the same ztabindex which would break tab-based navigation

Fixes: #3666
2024-02-06 12:44:29 -05:00
Bogdan Abaev
15d5dcaaee itemBox creator names fixes
- Instead of setting default name as the value of the field when a
creator name is empty, set the default names as a placeholder so that
it shows up only when the field is empty.
- Have the creator options show up before the creator is saved so that
the mode can be switches before saving the creator.
- Re-do of capitalizeCreatorName to not break when one of the names is focused.

Fixes: #3610
2024-02-06 12:44:29 -05:00
hrdl
147ed028df
Enable wayland backend when available. (#3655)
This will become obsolete with firefox >= 121.
2024-02-06 11:28:28 -05:00
Dan Stillman
5f5ceb9d87 Update Word for Windows submodule 2024-02-06 11:24:21 -05:00
abaevbog
4b3f61d8ca
Fix to tagsbox test timeout in CI (#3665)
Activate the window only when the document does not have focus.
Some platforms (macOS) require the window to be brought to the front,
while others (Linux) place it at the front from the start, and activation
should be skipped.
2024-02-06 02:30:29 -05:00
abaevbog
3a2cd70684
update tab when collection row is updated (#3673)
When saved search, collection or feed is renamed, update the zotero-pane
tab so that it has the new title.

Fixes: #3664
2024-02-06 02:23:09 -05:00
Abe Jellinek
42a994cce1 Update reader submodule 2024-02-05 17:11:42 -05:00
Abe Jellinek
de89e82e75 Make Tags/Related sections functional in note windows
Fixes #3581
2024-02-05 17:11:42 -05:00
Dan Stillman
f29f87ad5b Fix missing "Edit Saved Search" label
Regression from f8108aca45

https://forums.zotero.org/discussion/111486/zotero-7-beta-edit-saved-search-from-right-click-on-a-saved-search-collection
2024-02-04 06:22:50 -05:00
Abe Jellinek
6486c509ad Fix customElements.js error when editing saved search
Fixes #3672
2024-02-02 15:32:55 -05:00
windingwind
3acef799f5
Fix custom elements import (#3639)
Fixes #3600
2024-02-02 04:02:08 -05:00
abaevbog
a74c86d948
collection search tooltiptext and placeholder cleanup (#3632)
Fluent tooltiptext for collection search button and placeholder
for collection search input
2024-02-02 03:58:27 -05:00
abaevbog
4a3a80b4f8
editable-text min/max-lines attributes (#3649)
- min/max-lines attribute on editable-text determines how tall the field
can/has to be
- if max-lines is not specified (or is below 1), the textarea will expand
as much as needed without overflow
- removed hardcoded height and variables from css, substituted them with
usage of these attributes for consistency
- No fields have any max-lines at this point, so all fields will expand as
needed
2024-02-02 03:53:23 -05:00
Abe Jellinek
c10dabcbba Ignore editable-text blurs caused by window becoming inactive
Fixes #3588
2024-02-02 03:39:55 -05:00
Abe Jellinek
6b1940cebb Add generic menu for all unfocused editable-texts 2024-02-02 03:39:55 -05:00
Abe Jellinek
af79e9c405 Ignore base-mapped fields more robustly 2024-02-02 03:39:55 -05:00
Abe Jellinek
b8c1b7c139 Fix DOI View Online/Copy as URL regression
Was opening/copying the bare DOI, not the URL.
2024-02-02 03:39:55 -05:00
Abe Jellinek
fa6e6f9458 Make existing edit context menus more context-aware
- Don't show the default text editing context menu when right-clicking
  an unfocused editable-text
- In item box/header context menus, only show Copy and Paste (plus
  field-specific transform options) when unfocused

Fixes #3619
2024-02-02 03:39:35 -05:00
Sebastian Fleer
a33603d496
build.sh: copy additional Linux icons (#3628) 2024-02-02 03:21:19 -05:00
yexingsha
7344b8bb46
Reduce contrast of alternating row colors (#3667)
Closes #3635
2024-02-02 03:20:47 -05:00
abaevbog
9823b1199a
no extra arrows from scrollable components on win (#3634)
Somehow `scrollbar-width: thin` removes unnecessary arrows from
editable-text textarea and itemPane on windows

Addresses: #3633
2024-02-02 03:05:59 -05:00
Tom Najdek
41ccbc90a0
Fix missing variable value in import wizard localization. Fix #3471 2024-02-01 15:41:23 +01:00
Tom Najdek
6efbf4c2ec
Fix tab content misaligned in RTL mode. Fix #3658 2024-02-01 15:41:23 +01:00
Abe Jellinek
aee38791a7
Put the Advanced Search mode dropmarker back on the left (#3629) 2024-02-01 04:35:04 -05:00
abaevbog
8bcf1d446a
url/doi/options icon does not occupy space unless hovered (#3631)
url/doi/options do not occupy space unless the row is focused or hovered.
This does not apply to options icons after multiline fields because
it would shrink textarea on hover and shift text in an awkward way.

Fixes: #3612
2024-02-01 04:27:32 -05:00
abaevbog
0985362829
no focus-ring for readonly editable-text (#3656) 2024-02-01 03:01:19 -05:00
Martynas Bagdonas
8a9df4a1b3 Move context pane toggle into reader toolbar
Related #3648
2024-02-01 14:49:59 +08:00
Martynas Bagdonas
3adc0ef814 Update reader and note-editor submodules 2024-02-01 14:47:17 +08:00
Dan Stillman
ebd3d7a988 Fix wrong tab being selected after Reopen Closed Tab
Fixes #3651
2024-02-01 00:55:02 -05:00
Dan Stillman
7094945dff Add missing await in advanced-search test 2024-02-01 00:55:02 -05:00
Tom Najdek
493c3add8a
Fix a memory leak in file renaming preferences pane (#3654) 2024-02-01 00:44:22 -05:00
Dan Stillman
f8108aca45 Move "Rename Collection" and "Edit Saved Search" to Fluent
Without ellipses

And remove unused "Edit Feed…", which is in zotero.dtd too
2024-02-01 00:42:14 -05:00
Abe Jellinek
a4c09ed701 Trigger inline editing from Rename Collection... 2024-02-01 00:42:14 -05:00
Abe Jellinek
ab5def98a7 Move item type menu CSS override to SCSS 2024-01-31 14:48:59 -05:00
Abe Jellinek
0e251b4975 Scaffold: Fix tests losing defer: true on update 2024-01-31 14:30:34 -05:00
Abe Jellinek
7944253bed Scaffold: Update HiddenBrowser to use object-oriented API
Fixes updating tests.
2024-01-31 14:27:21 -05:00
Abe Jellinek
3f348e3340 Use actual placeholder attribute for editable-texts
As far as I can tell, the Abstract field was the only editable-text
using a placeholder set by Fluent.

https://github.com/zotero/zotero/pull/3632#issuecomment-1919619813
2024-01-31 13:06:57 -05:00
Abe Jellinek
a4c75df182 Don't allow pinning Item Notes and All Notes
Fixes #3626
2024-01-31 12:52:56 -05:00
Abe Jellinek
a23b5310e6 Fix nonfunctional Advanced Search menu item in dialogs 2024-01-30 11:43:56 -05:00
windingwind
1375de4ba2
Fix quick format background (#3638) 2024-01-30 01:58:50 -05:00
Martynas Bagdonas
a12c032ab9 Fix not updating reader "Add to Note" button regression 2024-01-30 09:30:28 +08:00
Tom Najdek
b3cf2ac67e
Switch to mask-image for fade-off effect in tabs 2024-01-30 00:45:16 +01:00
Tom Najdek
83491c14bb
Fix descenders cut-off in tab titles on Windows 2024-01-29 19:59:01 +01:00
Martynas Bagdonas
9edfcba9a9 Hide item notes list section in context pane for parentless attachments 2024-01-29 16:06:52 +08:00
abaevbog
e68b9b80ad
opened tabs menu visibility improvements (#3620)
- Added tooltip to display the entire title of the tab on hover
- Ellipsize the text of the tab title to display as much of the last
word as possible

Fixes: #3609
2024-01-29 02:40:09 -05:00
Tom Najdek
41294e0ff7
Fix a bug where first column is clipped if it has fixed or static width (#3605)
Also:

* Fix issues with notes and attachment columns
* Tweak first-column attachment column alignment
2024-01-29 02:37:46 -05:00
Dan Stillman
418ec5cfc0 Move "Print" to zotero.ftl
Follow-up to d606644a78
2024-01-29 02:31:55 -05:00
Martynas Bagdonas
b534639d4e Update reader and pdf-worker submodules 2024-01-29 15:18:38 +08:00
Martynas Bagdonas
630eccf72f Fix context pane note back button regression
Fixes #3616
2024-01-29 15:18:37 +08:00
Martynas Bagdonas
3a3a81b0ed Add missing "Use Dark Mode for Content" to reader window menu
Fixes #3592
2024-01-29 15:18:37 +08:00
Martynas Bagdonas
d606644a78 Localize "Print" and "Save As" in reader tab/window File menu 2024-01-29 15:18:37 +08:00
Martynas Bagdonas
5eb0ed109b Fix broken Fluent localization in reader window menu 2024-01-29 15:18:37 +08:00
Dan Stillman
0045cd1b7a Fix search bar in classic citation dialog and Related Items dialog
Fixes #3599
2024-01-29 02:13:05 -05:00
Adomas Venčkauskas
452ee3a55b Fix citation dialog open documents not working when a standalone pdf is open
Closes #3621
2024-01-29 09:11:12 +02:00
Dan Stillman
ee9e11a3eb Add 32px and 64px icons for Linux 2024-01-28 03:03:31 -05:00
Dan Stillman
6eebbe32f4 Fix app.update.auto on Windows
On Windows, `app.update.auto` is now a per-installation pref stored in
C:\ProgramData\Zotero\Updates\[id]\update-config.json so that it can be
used by the background update service. We don't have a background update
service, so we force it to continue using the profile pref.
2024-01-28 01:58:49 -05:00
Dan Stillman
8275970df9 Use newer red in Z SVG 2024-01-28 01:58:33 -05:00
Abe Jellinek
7f993167b4 Fix regression that broke Date field tooltip
Field inputs are XUL in Z6, HTML in pre-redesign Z7, and XUL again in
post-redesign Z7. We switched to the title attribute for HTML but didn't
switch back to tooltipText when going back to XUL.
2024-01-26 13:40:16 -05:00
Abe Jellinek
00ca99ae86 Item box: Fix Short Title rendering as multiline
Also, rerender editable-text when noWrap changes.
2024-01-26 13:38:29 -05:00
Dan Stillman
1cc5c1ce2e Disable automatic safe mode for now
Until we can figure out why some shutdowns are counting as crashes

https://github.com/zotero/zotero/issues/3196
2024-01-26 07:35:09 -05:00
Abe Jellinek
25d9524c6a
Fix editable-text expansion with non-overlay scrollbars on macOS (#3589) 2024-01-26 02:13:16 -05:00
windingwind
c21c5632c2
Fix attachment row annotation button bug (#3577) 2024-01-26 00:51:27 -05:00
Dan Stillman
9151fb3558 Force white background in quick-format dialog for now
To avoid unpleasantness in dark mode
2024-01-25 00:20:50 -05:00
Dan Stillman
f7fe38b94b Prevent overriding of quick-format selection background color for now 2024-01-25 00:08:35 -05:00
Dan Stillman
d116d8d0b7 Disable item-tags-box test for now
Failing in CI only
2024-01-25 00:00:25 -05:00
Dan Stillman
eb0988537e Update reader submodule 2024-01-24 23:32:24 -05:00
windingwind
63c532398b Fix sidenav default buttons display bug 2024-01-24 23:32:24 -05:00
windingwind
665f812bd1 Fix sidenav button visibilities update bugs 2024-01-24 23:32:24 -05:00
windingwind
7fe01d6c03 Clicking filename label should focus/blur field in attachment box 2024-01-24 23:32:24 -05:00
abaevbog
f990cb3f4b tabs menu updates
- CMD-F will focus the input field
- ArrowLeft/Right keypresses are ignored
- Reset focus index on the focus of the input field
2024-01-24 23:32:24 -05:00
Dan Stillman
69054bea4a Merge new English strings 2024-01-24 23:32:24 -05:00
abaevbog
1a82ae5c3b collection filter sizing tweaks
- ensure filter field is hidden if the pane is collapsed
- JS-based max-width setting to prevent overflow outside of collection pane
2024-01-24 23:32:24 -05:00
Abe Jellinek
608b732fbb Open tabs menu: Move margin/padding to SCSS 2024-01-24 23:32:24 -05:00
Abe Jellinek
873c87956c Open tabs menu: Escape regex special characters
So we don't throw an error/match inappropriately when the filter
contains backslashes, periods, pluses, and so on.
2024-01-24 23:32:24 -05:00
Abe Jellinek
a1134255ee Always rerender sidenav, even if item doesn't change
Feeds issue remains.
2024-01-24 23:32:23 -05:00
Abe Jellinek
2b50536775 Tweak method name 2024-01-24 23:32:23 -05:00
Dan Stillman
c2cc5e1935 Separate lines for extension-change confirmation into two strings 2024-01-24 23:32:23 -05:00
windingwind
4f73ea0cfa Fix attachment box rename 2024-01-24 23:32:23 -05:00
Abe Jellinek
3472d6cabe Prevent window overflow in Standard mode 2024-01-24 23:32:23 -05:00
Dan Stillman
613a907f3e Change pref from reader.useDarkModeForContent to reader.contentDarkMode 2024-01-24 23:32:23 -05:00
abaevbog
620b35ab78 minor focus tweaks
- after an item is added via "Add item by identifier" panel, end
focus to that item in itemTree.
- restored default behavior when the focus remains visible around an
element when all menupopups open, except for the item type menu in itemBox.
- opening item type menu will still hide the focus-ring
2024-01-24 23:32:23 -05:00
abaevbog
ed8e3f142b itempane keyboard navigation
- right/left arrows on section header expand/collapse the sections
- space/enter on section header toggle section collapsed/expanded
- tab from the header goes through the header's buttons and then
tabs into the section if that's opened
- arrow up/down on the header jumps to the previous/next header
- space/enter on clickable elements simulate a click
- if there is a pinned section, tab from the title will focus its header
2024-01-24 23:32:23 -05:00
Dan Stillman
580d1df086 Use red Z for 16x16 icon in Windows .ico 2024-01-24 23:32:23 -05:00
windingwind
3bdcf34a89 Fix stacked mode layout when toggle item pane 2024-01-24 23:32:23 -05:00
windingwind
8aa77fd5c8 Fix item pane splitter style 2024-01-24 23:32:23 -05:00
windingwind
7f58873e0b Fix item pane size when switching to note in stacked mode 2024-01-24 23:32:23 -05:00
Abe Jellinek
f59ee25fd7 Remove extra textarea padding on all platforms 2024-01-24 23:32:22 -05:00
Abe Jellinek
d375b1c78b editable-text: Use minimal scrollbars everywhere 2024-01-24 23:32:22 -05:00
Abe Jellinek
1159f9b54c Update reader submodule 2024-01-24 23:32:22 -05:00
Dan Stillman
1d8baa635a New app icons 2024-01-24 23:32:22 -05:00
Tom Najdek
ccfc3127ba Tweak padding in the tag selector list 2024-01-24 23:32:22 -05:00
Dan Stillman
61cca0fc69 Use Fluent instead of DTD for "Use Dark Mode for Content" string 2024-01-24 23:32:22 -05:00
abaevbog
11fc1ebd8e remove "Go to this item online" tooltip from url field in itembox
Also:

- set the .tooltiptext for options button in fluent file, so that text
shows up on hover
- added tooltiptext to creator + and - buttons
2024-01-24 23:32:22 -05:00
Abe Jellinek
b8f2aaafa9 Attachment preview: Fix cut-off snapshots
Also:
- Prevent selecting any text within the snapshot
2024-01-24 23:32:22 -05:00
Abe Jellinek
832a6f3eff Fix right-click -> Merge Items... 2024-01-24 23:32:22 -05:00
Abe Jellinek
0d0aee559b Update reader submodule 2024-01-24 23:32:22 -05:00
Dan Stillman
db4d7d5838 Fix recognizeDocument test failures
Wait for all progress-queue rows to be done processing before moving on
to the next test. Without this, preview rendering or other operations
can cause test failures by delaying the `ZoteroPane.selectItems()` call
for the new parent item in `_processItem()` until the middle of a
following test (due to the await for file renaming [1]). If it's delayed
until after the next attachment has been created, the previous parent
item will be selected after the new attachment and `recognizeSelected()`
in the test won't work. This is most pronounced with the reader, but it
was apparently happening previously due to something else, hence the
explicit item selection (now removed) in one test.

[1] 21e50add60/chrome/content/zotero/xpcom/recognizeDocument.js (L289-L301)
2024-01-24 23:32:22 -05:00
windingwind
0cd7a52dc0 Fix attachment preview retry and error catch 2024-01-24 23:32:21 -05:00
windingwind
1c343ee820 Fix viewItem unnecessary scroll 2024-01-24 23:32:21 -05:00
windingwind
86947d7154 Remove attachment-preview-box 2024-01-24 23:32:21 -05:00
windingwind
6ac35a580f Fix attachment info indexed label padding 2024-01-24 23:32:21 -05:00
Abe Jellinek
3ac8f803c9 Fix duplicate creator context menus, extract utility function 2024-01-24 23:32:21 -05:00
Abe Jellinek
a0ab7783ee Remove explicit delay in tag update test 2024-01-24 23:32:21 -05:00
Abe Jellinek
b9deeb1b15 Fix tooltip coloring 2024-01-24 23:32:21 -05:00
Abe Jellinek
f468245caf Attachments box: Don't set this._item to non-regular item
Fixes occasional errors due to `getAttachments()` being called on a
non-regular item in `updateCount()`.
2024-01-24 23:32:21 -05:00
Martynas Bagdonas
c208325aeb Add menu option to toggle dark mode for reader content 2024-01-24 23:32:21 -05:00
Abe Jellinek
c549a96834 Restore notes-box add button 2024-01-24 23:32:21 -05:00
Tom Najdek
03be35426c Couple of small fixes to the tag selector
* Add bottom padding
* Increase padding for macOS 0-width scrollbars
2024-01-24 23:32:21 -05:00
Tom Najdek
71d6e219bd Switch to .svg spinner icon for the PDF metadata retrieval 2024-01-24 23:32:21 -05:00
windingwind
ee514f2fd5 Fix window control buttons on KDE 2024-01-24 23:32:20 -05:00
Dan Stillman
a8916b797e Fix quick-search test 2024-01-24 23:32:20 -05:00
Dan Stillman
29bfbbf4f1 Merge new English strings 2024-01-24 23:32:20 -05:00
Dan Stillman
174e5cb5c9 Update translators 2024-01-24 23:32:20 -05:00
windingwind
6f466b25bd Fix Item pane "should refresh on file rename" test 2024-01-24 23:32:20 -05:00
abaevbog
91876e4185 updated collection filter collapsed rows test
It should ensure that all rows that were collapsed before filtering
are collapsed once the filter is cleared.
2024-01-24 23:32:20 -05:00
Dan Stillman
f084b8c8ad Move density options to separate submenu in View 2024-01-24 23:32:20 -05:00
abaevbog
ac7cc34485 updated tagsbox test to work with the new design 2024-01-24 23:32:20 -05:00
Dan Stillman
b66ac0d493 Remove tags-box tests in note editor tests
Will be moved to separate tags-box tests
2024-01-24 23:32:20 -05:00
abaevbog
4a096665a0 refresh collectionTree rowMap after row is added
It prevents the trash row from getting wrong offset and overlapping
with the row above it
2024-01-24 23:32:20 -05:00
Abe Jellinek
be3d7c95f9 Match Reset Sync with "Sync Reset Options"
Only adding warning2 because that's really the only relevant, searchable part of the warning.
2024-01-24 23:32:20 -05:00
Abe Jellinek
afcbc24362 Remove border from preferences navigation
Added to all listboxes in c0ab7bbacbcae3628c8a6f5feabf7be7f09fa54e
2024-01-24 23:32:19 -05:00
Abe Jellinek
05747f050a Fix undefined errors in feed settings window 2024-01-24 23:32:19 -05:00
Dan Stillman
074f8b1c69 Update reader submodule 2024-01-24 23:32:19 -05:00
windingwind
982289b484 Fix dialog background 2024-01-24 23:32:19 -05:00
Tom Najdek
2f9a12c2da Improve "Run JavaScript" dialog 2024-01-24 23:32:19 -05:00
Tom Najdek
a54ed665bf Improve style editor dialog 2024-01-24 23:32:19 -05:00
Tom Najdek
c514f92f9b Update csl editor theme based on system color scheme 2024-01-24 23:32:19 -05:00
Tom Najdek
d99ad84d4c Improve long tag fixer dialog 2024-01-24 23:32:19 -05:00
Tom Najdek
f0de6d0d57 Tweak spacing in select items dialog 2024-01-24 23:32:19 -05:00
Tom Najdek
0734808774 Fix invalid colors for collection tree in dialogs 2024-01-24 23:32:19 -05:00
Tom Najdek
7497226de2 Fix table header doesn't cover the entire width of the table
This affected every virtualized table with a header, except the main items table.
2024-01-24 23:32:19 -05:00
Tom Najdek
701c76aa3f Redesign RTF Scan wizard 2024-01-24 23:32:19 -05:00
Tom Najdek
b30e975379 Inject custom styles into <wizard>
<wizard> is a custom element built-in in FF. This commit monkey-patches
attachShadow to inject custom styles into the shadow root of <wizard>.
2024-01-24 23:32:19 -05:00
Abe Jellinek
37d2b41778 Make clicky item icons match line height 2024-01-24 23:32:18 -05:00
Abe Jellinek
40cc55757b Don't set static line-height on clicky items 2024-01-24 23:32:18 -05:00
Abe Jellinek
63e492261d Fix splitter misalignment on some displays 2024-01-24 23:32:18 -05:00
Abe Jellinek
1d662b9fef Preferences: Fix and improve search 2024-01-24 23:32:18 -05:00
Abe Jellinek
6e651271e8 Use two decimal points in default fontSize pref 2024-01-24 23:32:18 -05:00
Abe Jellinek
fbbe9625fc Focus new tag when popup is opened 2024-01-24 23:32:18 -05:00
Abe Jellinek
6948252e32 Prevent collapsing / hide twisty in tags popup 2024-01-24 23:32:18 -05:00
Abe Jellinek
8e3abd8706 Add padding to reader tags popup
And move styles to SCSS.
2024-01-24 23:32:18 -05:00
Abe Jellinek
482e436203 Import SCSS in reader windows
Fixes unstyled tags popup.
2024-01-24 23:32:18 -05:00
Abe Jellinek
b24d7d8f44 Fix tags box tests 2024-01-24 23:32:18 -05:00
Abe Jellinek
b391b6ca21 Tags box: Fix tag being saved every time autocomplete popup hides 2024-01-24 23:32:18 -05:00
Dan Stillman
f2bf40a314 Don't default existing users to Compact 2024-01-24 23:32:18 -05:00
Abe Jellinek
fbd8db3c8e Fix New Collection test 2024-01-24 23:32:17 -05:00
Abe Jellinek
99b0411857 Return created collection from newCollection()
Regression from fd0664bfb06409118ecaff73e064ab9c3103d823
2024-01-24 23:32:17 -05:00
Abe Jellinek
301058cf9d Fix notes pane tests 2024-01-24 23:32:17 -05:00
Abe Jellinek
57a1214eaa Remove reader pointerdown listener on close
Avoids a memory leak.
2024-01-24 23:32:17 -05:00
Abe Jellinek
2624770cea Remove debug from collapsible-section 2024-01-24 23:32:17 -05:00
Abe Jellinek
49fe2b98d9 Restore tag autocomplete popup
Regression from 275ea6f because of a duplicate element ID. Now we only create
one popup, even if there are multiple tags-boxes.
2024-01-24 23:32:17 -05:00
Abe Jellinek
ac2a4d0ee3 Preferences: Don't show horizontal scrollbar 2024-01-24 23:32:17 -05:00
windingwind
e1f026b037 Fix attachment row gap 2024-01-24 23:32:17 -05:00
windingwind
b2ce3d4a5c Fix sidenav button default status 2024-01-24 23:32:17 -05:00
windingwind
365e97ba1e Fix quick search does not re-run when changing mode 2024-01-24 23:32:17 -05:00
Dan Stillman
3e489b5f00 Update reader submodule 2024-01-24 23:32:17 -05:00
Dan Stillman
0c089efd8a More attachment box fixes
- Only try to show preview or check file existence for file attachments
- Use fileExists() for file check
- Show Accessed for linked-URL attachments
2024-01-24 23:32:17 -05:00
windingwind
61a5704dd4 Fix attachment box bugs 2024-01-24 23:32:17 -05:00
Dan Stillman
b34d0d2acc Fix regression in Zotero.FullText.canReindex() 2024-01-24 23:32:16 -05:00
Dan Stillman
3b9afcc500 Add Zotero.FullText.canIndex()
Currently identical to canReindex(), but in theory attachments aren't
supposed to be reindexable if they're already fully indexed
2024-01-24 23:32:16 -05:00
Bogdan Abaev
3338b4b285 new item focus handling tweaks
- properly re-focus previously focused item type menu in itemBox
- fix strange behavior of re-emerging item type menu popup caused by
itemBox.focusFirstField
- force the focus-ring to be around the itemType menu
2024-01-24 23:32:16 -05:00
Bogdan Abaev
b6d5a52417 additional focus management for popups
When a menupopup is opened, the active element does not change, so
their focus-ring will be hidden until the menupopup closes for it to be
less distracting.

When a panel popup is opened, the focus will be moved inside
of the panel, so we keep track of whichever element was previously
focused, and re-focus it when the panel goes away.

Minor reorganization of focus-ring mixin to use variables instead
of parameters to make hiding of focus-ring easier.
2024-01-24 23:32:16 -05:00
Dan Stillman
1427e3e324 Open item pane if closed on New Item 2024-01-24 23:32:16 -05:00
Bogdan Abaev
8e4fd75f1d passing newItem tests 2024-01-24 23:32:16 -05:00
windingwind
3073137d39 Fix title bar height on Linux 2024-01-24 23:32:16 -05:00
Bogdan Abaev
99ab42a674 Prevent trash row from receiving focus on Enter in filter box
Prevent trash/duplicated/unfiled/etc. rows from getting focused on Enter
if it is the currently selected collection row that technically
passes the filter and Enter is pressed.
2024-01-24 23:32:16 -05:00
Bogdan Abaev
2c97a7a03e avoid blinking of focused collection row on escape
Make sure that on escape, the focus is moved to collectionTree strictly
once all filtered rows are rendered. Minor refactoring to achieve
it, since setFilter is async.
2024-01-24 23:32:16 -05:00
Bogdan Abaev
0f0badea27 restore collection scroll position after filter
Before filtering starts, save the selected row, scroll position, and
which rows were collapsed before filering, and restore them once the
filtering is over if a row was focused during filtering.
2024-01-24 23:32:16 -05:00
Dan Stillman
6cb50c3ca4 First item row should not be gray 2024-01-24 23:32:16 -05:00
Dan Stillman
e6dc493b27 Update note-editor and reader submodules 2024-01-24 23:32:15 -05:00
yexingsha
c5346d08b9 fixed some spacing in item pane 2024-01-24 23:32:15 -05:00
yexingsha
6e7c80d97b changed all font-weight: bold/590 to 600 2024-01-24 23:32:15 -05:00
yexingsha
a81f0884ed fix focus ring color 2024-01-24 23:32:15 -05:00
Abe Jellinek
ee5106939c Potentially fix Linux popup positioning issue 2024-01-24 23:32:15 -05:00
windingwind
f039124312 Use html label in info table 2024-01-24 23:32:15 -05:00
windingwind
d00fc7ca22 Fix attachment box info table layout 2024-01-24 23:32:15 -05:00
windingwind
3603254d35 Fix attachment row rendering bug with web attachment 2024-01-24 23:32:15 -05:00
windingwind
607f9814a0 Fix uncaught errors on item.save() coming from attachmentBox 2024-01-24 23:32:15 -05:00
Dan Stillman
034dd40eea Update note-editor submodule 2024-01-24 23:32:15 -05:00
windingwind
6af4605bd0 Implement attachment preview
- Implement attachment preview
- Implement attachment-box redesign
- Make filename editable
- Use new reindex icon
- Update attachment note layout
- Fix reader.js eslint errors
- Add fallback attachment icon and use redesign
- Use attachment preview for regular items
- Fix pinned pane not exists error
- Double click preview to open to page
- Fix itemPane pin bug
- Preload preview iframe
- Fix item pane scroll
- Add media preview support
- Fix item pane scroll bar on macos
- Fix reader sidebar with standalone attachment
- Fix attributeChangedCallback
- Add attachmentBox _updateAttachmentIDs
- Make attachment notes readonly and simplify note window script
- Implement convert attachment note to new note
- Support preview dragging
- Annotations box redesign
- Support custom buttons in the collapsible-section
- Add preview toggle button
- Fix collapsible section attribute listener
- Make attachment box notify sync to fix errors in test
2024-01-24 23:32:15 -05:00
windingwind
2a5d713f98 Move drag handler into utilities_internal 2024-01-24 23:32:14 -05:00
Abe Jellinek
9a0a15abbe Don't show string "PLACEHOLDER" in menu while localization runs
Ideally we should cache these/not recreate the menuitems every time, or
something like that, so that localization pop-in doesn't happen at all. But a
brief flash of an empty menuitem is better than a brief flash of placeholder
text.
2024-01-24 23:32:14 -05:00
Abe Jellinek
f44cc548f9 Locate menu: Get selected item(s) from current tab 2024-01-24 23:32:14 -05:00
windingwind
424afb9af6 Fix splitter style 2024-01-24 23:32:14 -05:00
yexingsha
13acfe8c05 fixed spacing in tag-selector-filter 2024-01-24 23:32:14 -05:00
yexingsha
cf241447ab fixed some spacing in collectionTree and itemTree 2024-01-24 23:32:14 -05:00
yexingsha
fc7f8b199e update some item-type icons 2024-01-24 23:32:14 -05:00
yexingsha
d06ad5c14a update toolbar, tabbar, and paneheader 2024-01-24 23:32:14 -05:00
yexingsha
786a48c995 update tag colors 2024-01-24 23:32:14 -05:00
Bogdan Abaev
30b4577283 pinned panes for reader contextPane
When tab selection changes, scroll to the pinned pane if there is one.
2024-01-24 23:32:14 -05:00
Bogdan Abaev
6ac6c2582d do not reopen collapsed itemPane on item change
To preserve the proper scroll behavior to top pane/pinned pane on item
change, remember which pane needs to be scrolled to when itemPane is
collapsed, and scroll to it when the itemPane is expanded.
2024-01-24 23:32:14 -05:00
Abe Jellinek
2963b86176 Bidi: Allow switching text direction & add control for bidi pref 2024-01-24 23:32:14 -05:00
Martynas Bagdonas
aa10c71dba Update note-editor submodule 2024-01-24 23:32:13 -05:00
Abe Jellinek
58958d26f4 Decrease max visible lines in non-multiline fields 2024-01-24 23:32:13 -05:00
Abe Jellinek
6836bde339 Fix RTL layout issues in item tree 2024-01-24 23:32:13 -05:00
abaevbog
5ae6f88b15 editable-text better text match to textarea
- Remove margins and add a border to the pseudo-element.
It improves how the text of the pseudo-component matches the text from
textarea and should prevent the scrollbar from appearing due to mismatch.
- Swap explicit width setting for editable-text in itemBox for
min-width: 0. It still allows the editable-text to be shrunk when the
itemBox is narrow but does not cause mismatches between pseudo elements
and the textarea.
2024-01-24 23:32:13 -05:00
Abe Jellinek
f4d3ef94e7 New Collection dialog: Apply macOS non-native menu fixes 2024-01-24 23:32:13 -05:00
Abe Jellinek
2ab1bf6e11 RTL: Put creator commas on left, use locale character 2024-01-24 23:32:13 -05:00
Abe Jellinek
ef1f64058e RTL: Reverse sidebar collapse toggle 2024-01-24 23:32:13 -05:00
Abe Jellinek
4490da93ca RTL: Flip Locate icon (by making it a zotero-tb-button) 2024-01-24 23:32:13 -05:00
Abe Jellinek
9960483527 RTL: Use much simpler approach to flip toolbar icons & preserve padding
We don't have to deal with background images attached to various parts of the
button like we did on macOS before, so we can just flip the icon and be done
with it.
2024-01-24 23:32:13 -05:00
Abe Jellinek
667ea83f4b RTL: Flip Sync button
Sync isn't inside #zotero-pane anymore, so match on :root:-moz-locale-dir(rtl)
instead.
2024-01-24 23:32:13 -05:00
Abe Jellinek
e4837168b9 RTL: Fix toolbarbutton margins 2024-01-24 23:32:13 -05:00
Abe Jellinek
761c8a1bd4 RTL: Flip search icons 2024-01-24 23:32:13 -05:00
Abe Jellinek
9a5a8cf107 RTL: Apply Quick Search fixes to other search fields 2024-01-24 23:32:12 -05:00
Abe Jellinek
f938445271 Prevent error when itemsView hasn't been initialized 2024-01-24 23:32:12 -05:00
Abe Jellinek
64b8068504 Focus item tree on Escape in empty Quick Search textbox 2024-01-24 23:32:12 -05:00
Abe Jellinek
0d37d2752c Item tree: RTL: Fix misaligned backgrounds on first/last column 2024-01-24 23:32:12 -05:00
Abe Jellinek
ba19324723 Quick Search textbox: Fix RTL issues 2024-01-24 23:32:12 -05:00
Dan Stillman
5167ac2d6f Restore Dev/Troubleshooting Mode warning after redesign
Show label after tabs menu, and adjust Troubleshooting Mode color for
dark mode
2024-01-24 23:32:12 -05:00
Abe Jellinek
0f4a9e1482 Prevent dblclick inside collection name input from reactivating row 2024-01-24 23:32:12 -05:00
Abe Jellinek
ecf1595998 Don't gray out collection tree row when editing name 2024-01-24 23:32:12 -05:00
abaevbog
b2e4c9bdeb include last space counting creator name width 2024-01-24 23:32:12 -05:00
abaevbog
1e793a37a8 fix collection tree test breakage
Save the child collection after removing its parent in toJSON() collectionTest.
Otherwise, getDescendents throws an error if the parent collection
tries to access the deleted child in later tests.
2024-01-24 23:32:12 -05:00
Abe Jellinek
d44b869420 Implement new New Collection dialog with parent menu 2024-01-24 23:32:12 -05:00
abaevbog
5b1fd4b628 refresh row map after collection deletion
It refreshes customRowHeights which is used by windowed list to
calculate the right offsets.
Without this, customRowHeights remains same as before deletion, so windowed
list picks the offset based on stale data, which makes it use smaller
offset that makes headers overlap with other rows.
2024-01-24 23:32:12 -05:00
windingwind
cae1bf3ab0 Fix macos tab bar safe-area-start when maximized 2024-01-24 23:32:11 -05:00
windingwind
af97b3e66f Fix macos tab bar safe-area-start when fullscreen 2024-01-24 23:32:11 -05:00
Abe Jellinek
d128329cfb fixup: editable-text: Prevent a tiny vertical overflow 2024-01-24 23:32:11 -05:00
Abe Jellinek
bfec26f3cf editable-text: Correctly match ::after to text position
Fixes a rare mismatch that adds an extra line when that one pixel counts.
2024-01-24 23:32:11 -05:00
abaevbog
1f3c65a504 fix to textarea extra line at the bottom on win 2024-01-24 23:32:11 -05:00
abaevbog
741ed9b98c minor collection search improvements
- always scroll to selected row on empty filter
- fixed a bug that would interfere with focusing on the selected collection
on Enter if there are capital letters in the filter field
2024-01-24 23:32:11 -05:00
abaevbog
7d68f75d03 improve itemBox creator names visibility
- do not display creator buttons until hovered
- make last name have flex-grow priority over first name
- removed inline margins of rows
- removed extra padding from icons

This makes it more likely that the creator name will be displayed
fully without ellipsis until it is hovered. When the buttons are
displayed on focus or hover, the last name tries to remain
unellipsized as long as the first name is still visible after buttons
appear. If the first name is too short, both names will be ellipsized.
2024-01-24 23:32:11 -05:00
Abe Jellinek
75b1747d1d Remove existing <h1>s from built-in prefpanes 2024-01-24 23:32:11 -05:00
Abe Jellinek
784f877fbd Add automatic <h1> to prefpanes 2024-01-24 23:32:11 -05:00
abaevbog
15cfdb8317 use textContent instead of innerText in table cell render 2024-01-24 23:32:11 -05:00
Tom Najdek
6a855f5c8f Fix issues with item tree row drag image
* Attachment icon being cut off due to box-sizing issue
* Twisty icon incorrect using color
* Dragged image being slightly wider than the item in the tree
2024-01-24 23:32:11 -05:00
Dan Stillman
8888fa6dcb Move Interface prefs to top of General pane
Now that light/dark mode is there, it should be prominent.
2024-01-24 23:32:11 -05:00
windingwind
318de52dc5 Fix ESLint in utilities_internal.js 2024-01-24 23:32:10 -05:00
Tom Najdek
7df21ed14c Check for scrollbar presence when calculating table widths 2024-01-24 23:32:10 -05:00
Tom Najdek
a9eb79a45b Extend hover/drag color to the edges of the items header 2024-01-24 23:32:10 -05:00
abaevbog
d8a00610da added library tab to tabs menu, minor refactoring
- library tab appears in the tabs menu without the close button
and no drag functionality
- minor refactoring to simplify how the tabs icons are fetched for
items with item.getItemTypeIconName()
- added focus-ring to tabs and filter field via @focus-ring mixin
so that the focus outline looks the same for the input field and buttons
- removed default margin from the <description> component of the tab
titles that moved titles up by a bit
2024-01-24 23:32:10 -05:00
windingwind
ef062b9a8d Fix addon.id is undefined error 2024-01-24 23:32:10 -05:00
Martynas Bagdonas
8573cd785f Update note-editor submodule 2024-01-24 23:32:10 -05:00
abaevbog
7d1f58ce5e fixed to keyboard tab navigation regressions
- make sure the visible zotero-pane tab is selected to focus on
- make sure lastFocusedElement is not set to be another tab or
<window> to not move focus on them when Enter is pressed on zotero-pane
tab
- refocus the lastFocusedElement from zoteroPane after a timeout
to make sure focus does not stay on the actual tab after mouse click
- save lastFocusedElement before closing and reopening and unloaded reader
tab so that if we move from zoteroPane to a reader tab that will be loaded
and then go back, the orignially focused element is refocused
2024-01-24 23:32:10 -05:00
abaevbog
32bfc267a7 itembox value fields and editable-text tweaks
- fixed creator names text selection glitch (hide the comma instead
of not displaying it + removed redundant value update that's no longer
needed)
- set selection direction in editableText on tab to not scroll to the
end of input
- added autocomplete to observedAttributes of editable-text to
properly add autocomplete even if autocomplete params are set after
the element has been rendered (which is needed for creator names). This
fixes wrong Esc behavior that erases autocomplete fields instead of
resetting to previous value.
- fixed creator names autocomplete and type switch regression after
the comma was removed
2024-01-24 23:32:10 -05:00
windingwind
56cef1d504 Fix advancedSearch menu 2024-01-24 23:32:10 -05:00
Abe Jellinek
90b3c2206b Animate Abstract open completely, simplify
(And remove the unused 'toggle' event.)
2024-01-24 23:32:10 -05:00
Abe Jellinek
a9d30b7e8a Fix static height remaining after _runWithTransitionsDisabled() 2024-01-24 23:32:10 -05:00
Abe Jellinek
743597bc47 Let window chrome shrink
Now it's no worse than it was pre-redesign. But there's still
room for improvement, either by preventing the window from shrinking to the
point that the sidebars overflow or by making the sidebars horizontally
scrollable at very small window sizes.
2024-01-24 23:32:01 -05:00
abaevbog
8c0116d1db tabs menu update and minor refactoring
- tabs menu button is disabled when no reader tabs are opened
- tabs menu popup will be hidden if all tabs are closed
- keypress event handling moved from tabBar.jsx to zoteroPane.js
because all other keyboard navigation events are handled there
and it already has the functionality to skip disabled or hidden components
(e.g. tabs menu button, sync error)
- minor tweaks to tests to wait for collection search bar to hide
to get keyboard navigation tests passing
2024-01-24 23:32:01 -05:00
Abe Jellinek
a2e8294389 Add highlight to show whether notes or item pane is active 2024-01-24 23:32:00 -05:00
Abe Jellinek
87d344e5f8 Bring back default virtualized-table background color 2024-01-24 23:32:00 -05:00
Tom Najdek
bdc5f71990 Fix unselectable tree item elements
The previous workaround to ensure the twisty animation plays caused an issue
where, in some cases, tree item entries became unselectable.

Instead of skipping the rendering of the entire row (when it has been marked as
just toggled), we are now forcing the toggle animation to play after the row has
been re-rendered.

Additionally, one case where the just-toggled state wasn't cleared was fixed.
2024-01-24 23:32:00 -05:00
Martynas Bagdonas
7507e24998 Add "Eraser" string 2024-01-24 23:32:00 -05:00
Martynas Bagdonas
7325642aa0 Update reader submodule 2024-01-24 23:32:00 -05:00
Abe Jellinek
9f8e3f1521 Use borders with color-*-on-*, not outlines
Since outlines don't take up space in the layout, but borders do.
2024-01-24 23:32:00 -05:00
Abe Jellinek
691e5d8cc1 Tags box: Fix multiline editing after editable-text changes 2024-01-24 23:32:00 -05:00
Abe Jellinek
fca87eff9c Tags box: Add new tag before editor when Enter is pressed
Previously, when you clicked the Add button, typed a tag, and pressed Enter, the
new tag would be added *after* the now-empty editor field, putting the editor at
the top rather than the bottom.
2024-01-24 23:32:00 -05:00
Abe Jellinek
ccdd6c08ba Libraries & Collections: Add sibling after *all* children
Not only direct children
2024-01-24 23:31:53 -05:00
Abe Jellinek
f0c9e42a8e Show menu when adding from attachments-box 2024-01-24 23:31:53 -05:00
Abe Jellinek
9a07c8cb2e Prevent error when switching from reader to library 2024-01-24 23:31:52 -05:00
Abe Jellinek
9892601153 Update tags-box count when empty row is removed 2024-01-24 23:31:52 -05:00
Abe Jellinek
d62c9e217b Don't show sidenav Expand/Collapse button in library view 2024-01-24 23:31:52 -05:00
Dan Stillman
0facc521b2 Restore menus for attachment/note toolbar buttons and update File menu
We previously switched to just Add File and New Note buttons, but people
are going to want to create child attachments/notes via the toolbar.
This adds menus for those two buttons with clearer wording.

Also:

- Update the File menu with options that correspond to each of the four
  items pane toolbar buttons (including a new menu option for Add by
  Identifier)
- Update the order and wording of the Add Attachment submenu in the
  items list context menu
- Remove File menu options from the reader view that were added
  accidentally during the toolbar redesign
2024-01-24 23:31:52 -05:00
Dan Stillman
b15313fc3e Fix "Manage Attachments" menu being disabled incorrectly
We were originally going to put it in the File menu, and its disabled
state was only being updated when the File menu was opened after
selecting an item instead of the Tools menu. But we shouldn't actually
disable it anyway, only its contents (which we're doing elsewhere), so
just take this out.
2024-01-24 23:31:52 -05:00
Dan Stillman
0f60207287 Fix "Attachments" and "Notes" labels in columnpicker
Regression from new item pane, since we were using the tab labels for
the column labels. The real fix here is to support Fluent strings for
tree columns, but that's more complicated.
2024-01-24 23:31:52 -05:00
windingwind
1b9f7424eb Fix itemPane.js eslint errors 2024-01-24 23:31:52 -05:00
Dan Stillman
d85f04a408 Migrate creator-move strings to Fluent
(Extracted from itemBox redesign commit)
2024-01-24 23:31:52 -05:00
Bogdan Abaev
13de06cd52 itemBox redesign
- Table structure rewrite to use grid layout instead
of the <table> component so that screen readers can see the content
- Added icons to mirror right-click actions
- Moved creator actions to the options menu
- Drag-drop to reorder creators
- Using editable-text instead of clicky component
- Consolidated autocomplete logic in one function
- Added @focus-ring to all components of the itemBox
- Fields are focusable and navigatable via keyboard in non-edit modes
- General refactoring to consolidate stylesheets across platforms
and remove code that's not more used (mainly related to handling old
clicky text component).
- Retractions panel background set for --material-background instead
of light pink in dark mode.
2024-01-24 23:31:52 -05:00
Bogdan Abaev
553d1f6b3c editable-text updates
- Added nowrap attribute to not add the stretching aspect
of the editable-text and to not have any text wrapping. To be used in cases when
the input is a single line and it's width is stretched with flexbox, for
example tags or itemBox value fields.
- Added 'tight' attribute to set lower padding values on editable-text.
To be applied on fields that are not as prominent as abstract or header
as it makes the actual editable-text component smaller.
- Minor style changes to not shift layout on focus on windows (using
transparent border instead of 0 margin).
- No overflow of textarea to avoid longer-than-needed textareas on
windows.
- Keep track if the component was focused on via mouse click or not.
If the focus happened without prior mouse click, select all text.
- Reset cursor and selection on blur.
- Make sure the .input is always re-added if it disappears after drag-drop.
- Added sizeToContent function to set max-width based on the width
of the input.
- Allow the browser to break up words more freely with overflow-wrap: anywhere
to avoid stretching the itemBox with extra long header without spaces.

-  Apply 'nowrap' and 'tight' to tags so that a long tag does not stretch
the itemBox or make the editable-text extra tall.
2024-01-24 23:31:52 -05:00
Bogdan Abaev
55b97cd397 focus-ring mixin
@focus-ring adds an accent color box-shadow around the component
on :focus-visible.
2024-01-24 23:31:52 -05:00
Abe Jellinek
527c30b8c1 Initial implementation of Libraries and Collections box 2024-01-24 23:31:51 -05:00
windingwind
a3dec4be45 Fix Scaffold for redesign 2024-01-24 23:31:51 -05:00
windingwind
b649a1a953 Fix context pane return button and background
* Fix context pane return button and background
* Remove unused code
* Fix tab notes container background
* Fix context pane sections background
2024-01-24 23:31:51 -05:00
abaevbog
133fb3ad23 improve collection search filter expansion
- Speed up transition to 0.2s
- Focus once the transition is fully done
- The actual input field is hidden and the button is displayed 50 milliseconds
after the field starts shrinking to not have the magnifying glass
appear to the right of the input field right before the input is
hidden.
2024-01-24 23:31:51 -05:00
Dan Stillman
d021433979 Update note-editor submodule 2024-01-24 23:31:51 -05:00
Abe Jellinek
583c6328a0 Unify context pane into new item pane/sidenav design 2024-01-24 23:31:51 -05:00
Martynas Bagdonas
beaf03197e Update note-editor submodule 2024-01-24 23:31:51 -05:00
windingwind
f9a2f2f3e0 Fix Linux UI bugs 2024-01-24 23:31:51 -05:00
abaevbog
fb26921e11 Opened tabs menu with a search bar
- Matching substrings from tab's title are bolded.
- Drag-and-drop functionality to reorder tabs.
- ArrowUp/ArrowDown navigate the tab's titles. Tab/Shift-Tab move
across both titles and close buttons. Enter from filter field focuses
the first tab's title. Home/PageUp focuses the filter field. End/PageDown
focuses the last tab's title. ArrowUp/ArrowDown from the filter focus
the last/first tab's title respectively. ArrowUp from the first tab or
ArrowDown from the last tab focus the filter.
2024-01-24 23:31:51 -05:00
windingwind
843d23bbd2 Preferences redesign 2024-01-24 23:31:51 -05:00
windingwind
c6505d3e39 Fix submenu animation 2024-01-24 23:31:51 -05:00
Abe Jellinek
0b81fef457 Show sidenav in feeds 2024-01-24 23:31:51 -05:00
windingwind
e7e477fcdb About window redesign 2024-01-24 23:31:50 -05:00
windingwind
1ce70262e1 Fix splitter theme 2024-01-24 23:31:50 -05:00
windingwind
695e7f7975 Fix css naming 2024-01-24 23:31:50 -05:00
windingwind
91ec79401d Add window inactive opacity to toolbar and tabs 2024-01-24 23:31:50 -05:00
windingwind
8b5047f992 Decrease opacity of tab's background when window is inactive 2024-01-24 23:31:50 -05:00
Dan Stillman
16f66227bd Tweak padding for test-build warning 2024-01-24 23:31:50 -05:00
windingwind
b18a47b0d2 Remove stop sync button 2024-01-24 23:31:50 -05:00
Tom Najdek
df80c7573a Animate chevron when opening collection/item 2024-01-24 23:31:50 -05:00
windingwind
db5863fa0a Use redesign loading icon for sync spinner 2024-01-24 23:31:50 -05:00
Abe Jellinek
55415607bb Fix partially unstyled menuitem showing when moving between items 2024-01-24 23:31:50 -05:00
Tom Najdek
472593c400 Ensure column text lines up with column header 2024-01-24 23:31:50 -05:00
Tom Najdek
c40807909d Fix column header separator vanishes on scroll 2024-01-24 23:31:50 -05:00
Dan Stillman
c8c3856214 Adjust font-size increments
- Align with integer px values
- Add more granular resizing for common sizes
- Allow sizes smaller than the default (now 13px)
2024-01-24 23:31:49 -05:00
windingwind
a8016b1b2f Fix MacOS non-native checkbox menu options should be indented even if no checkbox 2024-01-24 23:31:46 -05:00
Dan Stillman
7ca6a7a37b Use 13px instead of 12px for the base font size 2024-01-24 04:03:40 -05:00
windingwind
687a6c5091 Fix exiting a submenu flashes the entire menu closed 2024-01-24 04:03:40 -05:00
windingwind
f5f475f738 Fix closing and reopening a *native* menu too quickly causes it to be closed again 2024-01-24 04:03:40 -05:00
windingwind
2a16c3c161 Fix library lookup icon 2024-01-24 04:03:40 -05:00
Abe Jellinek
16cadf1de7 Prevent dragging library tab 2024-01-24 04:03:36 -05:00
Abe Jellinek
ba0475810c Scaffold: Implement new toolbar
New icons and new scaffold.scss go into chrome://zotero/skin. The separate root
for Scaffold is mostly a historical relic, and adding special cases to build
scripts, SCSS mixins, and so on would just make things complicated.
2024-01-24 04:03:36 -05:00
windingwind
360f65e8c2 Fix toolbar dragging 2024-01-24 04:03:36 -05:00
windingwind
df0c2e2fd2 Toolbar redesign 2024-01-24 04:03:36 -05:00
Tom Najdek
bd067df4f6 Tabs redesign 2024-01-24 04:03:36 -05:00
abaevbog
a2e034c921 collection search not focusing group on Enter fix
While looking for the first matching row to select, stop looking
and move focus to the tree only after the selection succeeded.
Some matching rows, like groups header, are not selectable. If it's the
first matching row, it will now be skipped.
2024-01-24 04:03:36 -05:00
Tom Najdek
f454e110ec Fix missing icon regression
* After 02b864d icon next to the filter icon in the tab selector has
gone missing. This is because the chevron-6 has been moved to a new
location
* Tweaked CSS for this and other universal icons to use new location
* Removed duplicate icons in the old location
2024-01-24 04:03:36 -05:00
Abe Jellinek
632870683b Fix regression that broke section opening animation 2024-01-24 04:03:36 -05:00
Abe Jellinek
e04ef87929 Scaffold: Initial redesign changes
- Space between Min. Version and Priority
- Fix white-on-white tabs
2024-01-24 04:03:35 -05:00
windingwind
44ff2b1764 Fix library lookup icon 2024-01-24 04:03:35 -05:00
Dan Stillman
ce1bdba37a Sort tests case-insensitively and without "Test.js"
So HiddenBrowserTest.js doesn't run before advancedSearchTest.js and
zoteroPaneTest.js doesn't run before zoteroTest.js
2024-01-24 04:03:35 -05:00
Dan Stillman
51b615c54c Fix relatedbox tests after redesign 2024-01-24 04:03:35 -05:00
Abe Jellinek
524560799f Fix references to numbered --accent-blue colors 2024-01-24 04:03:35 -05:00
Abe Jellinek
6724ff8378 Annotation rows: Make transparent border visible
Only works with outline instead of border for some reason.
2024-01-24 04:03:35 -05:00
Abe Jellinek
c78739bf2f Update and improve attachment-row initialization
- Actually show un-deleted rows as context rows within trash
- Add all rows, hide ones that shouldn't be shown
- Check whether attachment is file before calling getAnnotations()
  - Fixes errors on update and new link attachments being shown as empty rows
2024-01-24 04:03:35 -05:00
Abe Jellinek
e4b329bffc Only scroll/pin section on left-click
To prevent a right-click on the Info section (which has no context menu) from
scrolling to it, along with other weirdness.
2024-01-24 04:03:35 -05:00
Abe Jellinek
c16a2d4b05 Resize editable-text after Esc pressed 2024-01-24 04:03:35 -05:00
Abe Jellinek
b2eed77914 Limit editable-text height
Current values are kind of arbitrary and could be made configurable.
2024-01-24 04:03:31 -05:00
Abe Jellinek
c50a3a8615 Use system color for Debug Output background 2024-01-24 04:03:28 -05:00
Abe Jellinek
dacfe68a28 Fix overscroll growing the item pane on Windows 11 2024-01-24 04:03:26 -05:00
Abe Jellinek
ef608c094a Remove Windows .zotero-view-item style overrides 2024-01-24 04:03:23 -05:00
Abe Jellinek
9b80d9def5 Always pad clicky-item .icon/.label as in design 2024-01-24 04:03:21 -05:00
Abe Jellinek
4a15b2633a Remove section title highlight on sidenav click 2024-01-24 04:03:18 -05:00
Tom Najdek
a8a1b8fe06 Reduce gap between tags in the tag selector 2024-01-24 04:03:17 -05:00
Abe Jellinek
19b78e2b20 Implement new pane selection algorithm, remove bottom padding 2024-01-24 04:03:17 -05:00
abaevbog
cc9d58e6be adjust spacing within tag selector
1. Decrease the gap after colored tags.
2. In compact mode, decrease the splitter height.
2024-01-24 04:03:17 -05:00
windingwind
97996310ea Show accessKey when press alt 2024-01-24 04:03:14 -05:00
Abe Jellinek
663c1e62fd editable-text: Set overflow-wrap on ::after and input
There really are too many different wrapping properties
2024-01-24 04:03:13 -05:00
Tom Najdek
f67efc90f1 Fix: Tags now have a proper drop target size 2024-01-24 04:03:13 -05:00
Tom Najdek
8627e92cb4 Fix items table potentially not rendering after merge
In d4f8c7c an entry has been removed from zotero.properties that is still being
used in items table. If `numNotes` column is visible, items table would not
render.

Instead of re-adding to zotero.properties, I've migrated this string to
zotero.ftl to fix this problem.
2024-01-24 04:03:13 -05:00
windingwind
cec0592e14 Use SelectedItem color on non-Windows 2024-01-24 04:03:13 -05:00
windingwind
82a9aee21c Unify item tree & v-table style on Windows & Linux 2024-01-24 04:03:13 -05:00
Tom Najdek
f5be1b26f4 Remove cell padding from the first-column 2024-01-24 04:03:13 -05:00
Tom Najdek
60dedf7d95 Fix items table header bottom border 2024-01-24 04:03:13 -05:00
Abe Jellinek
bf72c9d828 Notes/Tags/Related redesign 2024-01-24 04:03:13 -05:00
Tom Najdek
374b5337d8 Items table redesign 2024-01-24 04:03:13 -05:00
windingwind
d16abb1a15 Remove duplications of chevron-12.svg 2024-01-24 04:03:13 -05:00
windingwind
077214a327 Add menu icons and unify Open PDF/EPUB/Snapshot options 2024-01-24 04:03:13 -05:00
Bogdan Abaev
a7fe2130ce no override of arrow up/down actions in toolbar search fields 2024-01-24 04:03:12 -05:00
Bogdan Abaev
f8a6b82c63 collection search 2024-01-24 04:03:12 -05:00
windingwind
7da00957ef Unify tab bar on Windows/Linux 2024-01-24 04:03:12 -05:00
Tom Najdek
464c37e66f Don't use color for background of emoji tags 2024-01-24 04:03:12 -05:00
Tom Najdek
7fe5f0145d Restyle tags splitter 2024-01-24 04:03:12 -05:00
Tom Najdek
9ff76d2dd9 Restyle Tag Selector
* Render a colored dot for colored tags
* Improve spacing and positioning, especially on 2x screens
* Add scss map for tag colors in light/dark scheme
* Add support for compact/comfortable in tag selector
* Restyle filter box, add a placeholder and a new icon
2024-01-24 04:03:12 -05:00
Tom Najdek
ff115b0873 Tweak search component to accept data-/aria- props 2024-01-24 04:03:12 -05:00
Tom Najdek
ce64147aa8 Add "pick" and "omit" utils
Helpful when dealing with props in react components
2024-01-24 04:03:12 -05:00
Tom Najdek
54ce9e8b3c Add color-scheme mixin 2024-01-24 04:03:12 -05:00
Tom Najdek
a68424658a Fix a bug in the build process
Fixes TypeError: Cannot read properties of undefined (reading 'toFixed')
2024-01-24 04:03:12 -05:00
Abe Jellinek
fe6fdd3ff6 Ensure require() is available to CEs 2024-01-24 04:03:08 -05:00
abaevbog
71af85adb3 minor fixes to keyboard navigation
1. Swap focus direction for ArrowUp and ArrowDown events when applicable.
ArrowUp = Shift-Tab, ArrowDown - Tab.
2. Remove ArrowLeft, ArrowRight event listeners from quicksearch menus
to not prevent cursor navigation within the actual text field.
3. Tweaks to fix advanced search mode from quicksearch when " is typed.
2024-01-24 04:03:02 -05:00
Abe Jellinek
6bc97a6af6 Extract field transform menu and use for title header
And extract edit context menu building code into a separate function in
`editMenuOverlay.js` so we can build menus on top of it.
2024-01-24 03:42:43 -05:00
Abe Jellinek
17f758d0cf Use Zotero.isMac in customElements CE patch
AppConstants is occasionally undefined - not sure why.
2024-01-24 03:42:43 -05:00
Abe Jellinek
810402c9c7 Implement pane header, non-tabbed layout, collapsible sections, and new abstract box 2024-01-24 03:42:43 -05:00
Abe Jellinek
d2694bfba7 Add attachmentEPUB[Link] to getImageSrc() 2024-01-24 03:42:43 -05:00
Abe Jellinek
a2f259d14c Use item type CSS icons in more places
.icon-item-type is now global, with extra styling to handle row selection when
it's inside the item tree.

getImageSrc() is still used for progress windows, which is probably OK for now
because those don't stay on screen for very long. I've updated it to return SVGs
based on the current UI color scheme.

Other code uses treeitem-* images directly; getting rid of those references will
cause a lot of conflicts and be a bit more involved than this initial pass, so
I'll put that in a separate PR.
2024-01-24 03:42:43 -05:00
abaevbog
200e1d7564 toolbar and keyboard navigation updates
1. Toolbarbuttons changes:
	1. “New Library” moved from toolbar to File menu
	2. “New note” on click makes a standalone note
	3. “New attachment” on click adds stored copy of a file
	4. Menuitems from old note or attachment menus moved to the File menu
	5. “Advanced search” removed. Sync and Locate buttons moved to the top-right corner (Locate - temporarily)
	6. Added “Opened tabs” toolbarbutton
	7. Updated tooltips
2. Added a toolbarbutton that reveals collection search field on click. Search field is hidden on blur if empty. Keyboard accessibility via tab/shift-tab.
3. Tab based navigation restructuring. For each component, create a mapping of target ids with desired focus destination for each relevant keyboard event and use that to determine where to move focus next. Fixed bugs with focus wraparound not working when a note or attachment is opened in contextMenu.
4. Make quick-search dropmarker a sibling of the textfield. QuickSearchTextbox does not extend search-textfield anymore. It serves as a container to house dropmarker and textfield as siblings. This is needed to remove focus ring from quick search textbook when focus moves onto the dropmarker.
5. Separate toolbars for item and collection trees. Removed unused code manually setting the width of toolbar section
6. Focusable tabs + keyboard navigation:
	1. Shift-tab from opened tabs menu moves focus to the currently opened tab
	2. When a tab has focus, use left/right arrows to select tabs, or CMD/Ctrl + arrows to move focus between tabs
	3. Enter or Space on a focused tab will select it if needed and move focus to the contentPane of the reader of this tab
	4. Shift-tab from tabs wraps focus around to itemTree or itemPane
7. “New collection” creates collection contextually within currently selected library or collection.
8. Items pane minimum width increase to avoid quicksearch from being squashed
9. Do not move focus to title field of itemBox after itemTypeMenu is closed with ESC.
10. Display all itemTypes without "Show more" submenu in "New Item" meunu. Removed "Store Copy of File" and "Link to File" from "New Item" menu.
2024-01-24 03:42:42 -05:00
Tom Najdek
3f91729141 collections tree redesign
- new icons
- new twisty (also for items tree)
- new mixin focus-states that can be re-used for less boilerplate
- dark/white compatible with tweaks for when tree is focused (these changes also affect items tree)
- removed macOS specific behaviour (blue-ish background, gradient for selected row)
- border-radius on highlight + spacing tweaks
- tweaked colors and fonts
- Support for "compact"/"comfortable"
2024-01-24 03:42:42 -05:00
Tom Najdek
78d82d22cc Fix item type icons broken on 2x screens
Icons preloading introduced in 247755c5 overrides entire background
property, not just background-image. On 2x screens (and anywhere else
where svg icons need to be scaled) icons need property `background-size:
contain` to be displayed correctly. This previously came from
`.icon-css` class but have been overriden by code generated in
`svgicon`, so to fix this, these properties need to be added to the
`svgicon`.
2024-01-24 03:42:42 -05:00
Abe Jellinek
8b9d8b1be5 Add compact/comfortable utility mixins 2024-01-24 03:42:38 -05:00
Abe Jellinek
c6ad31ca0a Preload variants of item type SVG icons 2024-01-24 03:42:34 -05:00
Tom Najdek
c7286194f8 Convert theme to css variables
* Opt-in for light and dark color schemes
* Convert scss variables in _light.scss to css variables
* Add _dark.scss for dark color scheme
* Remove unused, theme-related variables
2024-01-24 03:42:29 -05:00
Tom Najdek
03d10f7de7 Switch to new svg icons for item types 2024-01-24 03:39:09 -05:00
Tom Najdek
61f9d65552 Add utils for css-based icons 2024-01-24 03:39:09 -05:00
Abe Jellinek
1dd3812e00 Deprecate setFontSize(), replace with new Zotero.UIProperties
This new XPCOM module handles font size and UI density and automatically keeps
registered roots up to date when prefs change. Roots receive a
UIPropertiesChanged event after their properties are updated.
2024-01-24 03:39:09 -05:00
Abe Jellinek
d6e5da403c Add uiDensity pref and menu controls 2024-01-24 03:39:08 -05:00
abaevbog
be4ecb31bc separator after colored tags 2024-01-24 03:39:08 -05:00
Abe Jellinek
c3d45a8a29 Set auto dark mode by default, add pref control 2024-01-24 03:39:08 -05:00
abaevbog
5c337808ab show advanced search menuitem in quicksearch menu
In quicksearch menu, display a menuitem after a separator that
opens the advanced search window.
2024-01-24 03:39:08 -05:00
Abe Jellinek
a37dd2462a Disable error reporting in Scaffold 2024-01-23 12:06:40 -05:00
Adomas Ven
ac7eb87632
Add an "Open Documents" section to the citation dialog. Closes #3332 (#3544)
- Sort the Open Documents section by reverse-open order and further by
  reverse tab order (if unopened in this session).
- If Library is selected in the Zotero window, automatically show and
  filter at the top selected items
2024-01-21 01:34:09 -05:00
Abe Jellinek
21e50add60
Rename Safe Mode to Troubleshooting Mode (#3563) 2024-01-13 04:33:19 -05:00
Adomas Venčkauskas
7811d78cb0 Fix quick search item tree issues when moving attachments into/out of parents
Closes #3561
2024-01-12 10:31:00 +02:00
Abe Jellinek
4d7ad51593 Update reader submodule 2024-01-09 20:44:55 -05:00
Adomas Venčkauskas
9a6b35b962 Ensure the captcha clearing window is activated upon open on macOS 2024-01-08 12:27:20 +02:00
Adomas Venčkauskas
b03dbee3e8 Fix Hidden Browser logged error when debugging is enabled
Regression 8b77c96
2024-01-08 12:19:14 +02:00
Abe Jellinek
8b7c0433e8 Preferences: Fix missing LABD icon when path contains a space 2024-01-04 13:46:04 -08:00
Abe Jellinek
80abafbe5b Update reader submodule 2024-01-02 14:31:07 -08:00
Dan Stillman
6b996d4f99 Update translators 2023-12-27 05:29:46 -05:00
Abe Jellinek
071bf06995
Scaffold: Use standard ESLint options (#3498) 2023-12-27 05:29:12 -05:00
Dan Stillman
03432718e3 Update translate submodule 2023-12-27 04:44:47 -05:00
Adomas Ven
8b77c96e97
Displays a browser window to clear captcha when saving attachments. (#3526)
- Currently enabled only for ScienceDirect. Can be enabled via a whitelist
- Matches the HiddenBrowser loaded HTML page for a captcha element. If
  the captcha element class changes, this will break (but the
  alternative is potentially displaying a captcha clearing window when
  something else that is not a captcha guard is loaded).
- Captcha clear timeout for 60s.
- Doesn't automatically switch focus back to the browser which intiated
  the item save via the Connector.
- Stores the cookies used to clear the captcha for future saves from the
  same domain. Discards Connector supplied User Agent, since CF bot
  detector checks UA header against actual UA behavior like TLS handshake
  and if the UA acts different to what it's supposed to, the bot
  challenge is not cleared.

Other changes:
- Adjusted the cookie sandbox to allow multiple cookie sandboxes to be
  active (and simplified some legacy code that was meant to cover a bug
  in old FX codebase).
- HiddenBrowser API changed to be Object oriented, translator tester
  in the translate repo will need to be updated after a merge (have the
  change ready).
- Improved Connector Server attachment progress handling
2023-12-27 04:43:50 -05:00
Abe Jellinek
c9b4daf152
Add Help -> Restart in Safe Mode... and a toolbar indicator (#3209) 2023-12-23 00:05:36 -05:00
Adomas Venčkauskas
5536f8d2bd Citation dialog: match year-ranges (e.g. 1992-2002) for search
Instead of as page locators
2023-12-20 12:52:21 +02:00
Martynas Bagdonas
b31f66ddbd Fix related-box error in not yet connected element 2023-12-14 18:22:30 +02:00
Martynas Bagdonas
3cb12a2ad3 Avoid content loss when immediately leaving item note in context pane
Fixes #3532
2023-12-14 17:59:28 +02:00
Adomas Venčkauskas
32ba987c28 Fix failing Advanced Search test (regression 172fe371) 2023-12-12 18:14:19 +02:00
Adomas Venčkauskas
8243553260 Remove old xul tree column prefs 2023-12-12 08:36:38 +02:00
Adomas Venčkauskas
172fe371dd Allow a column picker and persist columns in advanced search. Closes #1118 2023-12-12 08:35:19 +02:00
Adomas Venčkauskas
f4284a3579 Returns the translators hash on Connector ping.
Part of zotero/zotero-connectors#452
2023-12-11 13:44:26 +02:00
Martynas Bagdonas
969031a374 Update reader submodule 2023-12-09 20:30:03 +02:00
Adomas Venčkauskas
9971f15e61 Use url of the page if no title available in /connector/saveSnapshot 2023-12-07 13:38:56 +02:00
Adomas Venčkauskas
5a0f369f0b Do not activate item on twisty dblclick. Closes #3507 2023-12-07 11:15:08 +02:00
Dan Stillman
8a66fc02fe Add cloud-storage warning for "BaiduSyncdisk"
https://forums.zotero.org/discussion/109845/
2023-12-01 02:34:35 -05:00
Abe Jellinek
0f447c87dc Fix ZP View -> Reset Zoom
Fixes #3510
2023-11-30 15:58:52 -05:00
Dan Stillman
8a620c3a7c Remove "Create Timeline" from Tools menu
Addresses #3463 and, well, fixes #3462
2023-11-30 06:52:18 -05:00
Dan Stillman
2f8e536f2b Update translators 2023-11-30 02:50:17 -05:00
Dan Stillman
daa98de2cc Update reader submodule 2023-11-30 02:49:37 -05:00
Dan Stillman
6254c3fbdd Fix too-large and cut-off progress icon when setting up syncing 2023-11-30 02:48:08 -05:00
Dan Stillman
04b87e4db7 Fix NS_ERROR_MALFORMED_URI if WebDAV URL has leading or trailing space 2023-11-30 02:47:36 -05:00
Martynas Bagdonas
52c219c8b9 Switch to Library tab when dragging over EPUB or HTML files as well 2023-11-28 11:05:13 +00:00
Martynas Bagdonas
3eb1c3fb4f Fix reader PDF view iframes not receiving mouseup event 2023-11-28 08:44:25 +00:00
Martynas Bagdonas
58c6bdf504 Fix overflowing context pane
Fixes #3491
2023-11-23 11:32:05 +00:00
abaevbog
436b19d64c
Fix inconsistent ESC behavior on text edit when reader is opened (#3417)
This is needed to let itemBox, tagBox, etc. to handle ESC
events to revent any edits made to textfields. Only applied
if the currently focused element is input or textarea.

Fixes: #3246
2023-11-21 07:42:33 -05:00
Adomas Venčkauskas
9d710ea135 Be less aggressive about sending Zotero to back after http integration commands
Report https://forums.zotero.org/discussion/109479/bug-after-adding-citation-main-window-is-hidden-76
2023-11-21 10:34:36 +02:00
Dan Stillman
7027c08f1a Update locales from Transifex and merge new English strings 2023-11-18 04:08:07 -05:00
Dan Stillman
2c50749ab3 Add "GoogleDrive" as cloud storage path 2023-11-18 01:34:41 -05:00
Martynas Bagdonas
de9abdae39 Add localized string for black color 2023-11-17 18:33:41 +00:00
Martynas Bagdonas
6f6b4152f3 Update reader submodule 2023-11-17 18:31:58 +00:00
Martynas Bagdonas
94070e1b7c Fix navigation to specific annotation when using zotero://open-pdf
Fixes #3487
2023-11-15 21:54:59 +00:00
abaevbog
7c5600913b
fix to collections highlight bugs (#3412)
1. Trigger ZoteroPane.handleBlur on focusout instead of blur
to remove highlight when itemTree entries loose focus
even if ctrl/alt is still being held.
2. Prevent default event on Alt click on linux to avoid moving
focus to menubar
3. Avoid re-triggering focus multiple times
when ctrl is being held on windows to prevent highlight from becoming
stuck and not going away.

Fixes: zotero#3410
2023-11-10 19:17:01 -05:00
Abe Jellinek
cdc59e6a29 Remove debug logging from search routine
Way too slow and noisy.
2023-11-10 16:40:12 -05:00
Abe Jellinek
835542bb6f Preferences search: Match Fluent strings 2023-11-10 16:40:12 -05:00
Dan Stillman
feac973ec2 Update LibreOffice submodule 2023-11-10 16:33:49 -05:00
Dan Stillman
38081fa4b8 Fix files without extensions not opening in reader
Broken by 2b41b0127c

https://forums.zotero.org/discussion/109332/pdf-files-dont-show-after-update-zotero-7-beta
2023-11-10 16:30:42 -05:00
Dan Stillman
b6d8571860 Update Z.File.getSample() signature to match getBinaryContentsAsync()
Not updated with 2b41b0127c
2023-11-10 16:30:10 -05:00
Dan Stillman
f1373652e6 Fix file:// URI handling in getBinaryContentsAsync() 2023-11-10 15:58:53 -05:00
Dan Stillman
8239d04d5e Update reader submodule 2023-11-09 04:03:08 -05:00
Adomas Venčkauskas
5efd181e5b Fix Zotero 2.1 and earlier citation upgrade code 2023-11-08 09:53:39 +02:00
Martynas Bagdonas
1bb6722c4c Update note-editor submodule 2023-11-06 11:05:39 +00:00
Dan Stillman
0cab24fb89 Update translators and styles 2023-11-02 17:51:30 -04:00
Dan Stillman
52a394374f Update reader submodule 2023-11-02 17:50:58 -04:00
Dan Stillman
bf478392ce Block most resource loading in reports 2023-11-02 17:50:16 -04:00
Dan Stillman
f1203f0fb3 Disable libvpx decoding/encoding 2023-11-02 17:50:16 -04:00
Dan Stillman
47e55286f7 Add Baidu Netdisk and MEGA to cloud-storage-folder checks
Closes #3465
2023-10-31 05:31:06 -04:00
Martynas Bagdonas
4266df4d3a Propagate annotation deletion between reader instances of the same file
Fixes #3375
Fixes #3241
2023-10-27 18:28:43 +01:00
Dan Stillman
ec464a048a Update reader, pdf-worker, and translators submodules 2023-10-27 03:22:55 -04:00
Adomas Venčkauskas
b71012689f Updates translate submodule. Fixes #3182 2023-10-26 13:03:00 +03:00
Adomas Venčkauskas
fe752fd937 Adjust failing item tree tests for #3460 2023-10-24 14:34:57 +03:00
Adomas Venčkauskas
011dabd372 Fix corner case after #3460. Closes #3461 2023-10-24 14:24:38 +03:00
Adomas Ven
3b9d0ac1bb
Allow the collection tree rows to have custom row heights (#3460)
- The underlying changes are in windowed-list, which the item tree and
  all virtualized tables are based on, so if there are bugs they might
  show up outside of the collection tree.
- The expensive operation is adding/removing rows, since row offsets
  have to be recalculated (this includes collapsing/expanding rows).
- The cost on further drawing while scrolling is constant and shouldn't
  affect performance much.
2023-10-24 03:56:07 -04:00
Dan Stillman
f012a348af Update Word for Mac submodule 2023-10-23 05:40:57 -04:00
Dan Stillman
f94d6da876 Update reader submodule 2023-10-23 05:36:33 -04:00
Martynas Bagdonas
7e82cc5ffd Fix recursion error when toggling/resizing sidebar in reader window
Fixes #3379
2023-10-19 18:15:51 +01:00
Martynas Bagdonas
c27bac2ad6 Update reader submodule 2023-10-13 12:59:30 +01:00
Dan Stillman
fc088bc1f3 Update utilities submodule
Includes https://github.com/zotero/utilities/pull/30
2023-10-06 06:58:50 -04:00
Dan Stillman
a1f6821fe1 Fix attachment-title renaming bug on Windows
https://forums.zotero.org/discussion/comment/444399/#Comment_444399
2023-10-06 04:56:19 -04:00
Dan Stillman
64a78412c9 Update reader and pdf-worker submodules 2023-10-03 23:34:14 -04:00
Adomas Venčkauskas
195ea69b19 Fix tiny Quick Format dialog before text entry. Closes #3443 2023-10-03 10:24:20 +03:00
Dan Stillman
5e634f57f0 Update Windows build to Firefox 102.15.1esr 2023-09-30 07:05:13 +01:00
Dan Stillman
03fcba3b71 Include Safari extension in test builds 2023-09-30 01:55:39 -04:00
Dan Stillman
f803c0cc4e Update Mac build to 102.15.1esr 2023-09-29 18:20:46 -04:00
Dan Stillman
918b1645aa Update Linux build to Firefox 102.15.1esr 2023-09-29 20:44:59 +00:00
Dan Stillman
e3c64fb047 Don't migrate prefs in new profile 2023-09-29 04:06:04 -04:00
Adomas Venčkauskas
2db19ad4ca Fix http word integration word path unicode issues. 2023-09-27 12:19:38 +03:00
Dan Stillman
aef49da233 Fix nsIZipReader.close error after invalid ZIP file download 2023-09-26 05:09:40 -04:00
abaevbog
bbfc6ed817
activate collection tree row only if it's focused (#3431)
Fixes: #3426
2023-09-24 05:34:00 -04:00
Abe Jellinek
79ef266f2f
Detect more EPUBs in viewAttachment() content type fixer (#3433) 2023-09-23 03:09:23 -04:00
Abe Jellinek
c45405190a importFromFile: Remove duplicate and unused declarations
Apparently a var doesn't shadow a parameter with the same name, but that wasn't
obvious.
2023-09-22 12:20:12 -04:00
abaevbog
399baf0d73
disable "Find available PDF" if files not editable (#3430)
For example, in a public group files are not editable,
so this menu item is disabled.

Fixes: #3428
2023-09-22 09:13:36 -04:00
Abe Jellinek
f28873382d Preferences: Highlight parent of selected pane in navigation
Also, fix help and back buttons not hiding when starting a search.

Closes #3425
2023-09-21 13:39:06 -04:00
Abe Jellinek
9779c70915 Reports: Don't strip valid surrogate pairs
Without the /u (Unicode) flag, [\ud800-\udfff] matches *all* surrogate pair code
points, even when they're in a valid position in the string.

Fixes #3421
2023-09-21 13:19:22 -04:00
Adomas Venčkauskas
220eba8c63 Fix bibliography editor dialog (regression c89590c7) 2023-09-21 10:34:11 +03:00
Adomas Venčkauskas
a8ccab78f5 Fix classic citation and bibliography dialogs not persisting dimensions
The persisting logic doesn't work without an id on the root element
2023-09-21 10:34:11 +03:00
Adomas Venčkauskas
f8c3a3a31e Fix citation dialog being moved to the wrong location sometimes 2023-09-21 10:34:11 +03:00
Dan Stillman
98c1a6ca1b Fix "Export PDFs…" stopping if attachment file isn't found 2023-09-21 02:47:48 -04:00
Abe Jellinek
540a174dab TranslationChild: Make "interactive" count as readyEnough
Some pages (notably the first DOI.js test case) never get to "complete". I don't
know why! But for practically all translators that don't use defer: true,
"interactive" is ready enough.
2023-09-20 12:56:02 -04:00
Abe Jellinek
309e56df06 Add a test for 6740b264 2023-09-20 12:41:24 -04:00
Abe Jellinek
6740b2644d Make relevant prefs available in RemoteTranslate 2023-09-20 12:09:37 -04:00
Dan Stillman
24ae341045 Fix test breakage from f68818387 2023-09-18 16:47:55 -04:00
Dan Stillman
0b583cc644 Update note-editor, reader, styles, and translators submodules 2023-09-18 15:41:31 -04:00
Abe Jellinek
189df44ec6 Update reader submodule 2023-09-15 13:06:31 -04:00
Abe Jellinek
667f940a6c Reader: Use url (was baseURI) for all reader types 2023-09-15 12:33:53 -04:00
Martynas Bagdonas
1b23838d37 Load PDF file from URI to avoid keeping extra file copy in memory 2023-09-15 11:05:31 +02:00
Abe Jellinek
0e5359d43e Update reader submodule 2023-09-14 10:10:27 -04:00
Abe Jellinek
8d825f641a
Fix segfault when hyphenating text in main process (#3388) 2023-09-14 02:48:50 -04:00
windingwind
78fe68164f Remove reader events when plugin is disabled 2023-09-14 07:54:29 +02:00
Martynas Bagdonas
96652ea9e8 Enable plugins adding custom content to reader UI and context menus
#3373
2023-09-13 14:16:28 +02:00
Abe Jellinek
40b30f2b63 Update package-lock.json
After ad676adbbb
2023-09-07 13:39:52 -04:00
Abe Jellinek
87286ca776 Remove tab content immediately
Amends 30c70a6ecd.
On some machines, the callback added in that change would never actually run, so
memory usage would grow quickly when switching between tabs. By wrapping in
setTimeout() instead of requestIdleCallback(), we keep the performance gains
from removing once the element is no longer visible (so we can avoid repaints,
rebuilding the layout tree, etc.), but we make sure that the callback gets
called nearly immediately.

#3321
2023-09-07 13:38:55 -04:00
Dan Stillman
8d93fd4c8c Fix test breakage after f68818387 2023-09-06 07:38:14 -04:00
Dan Stillman
f688183878 Fix keyboard accessibility in conflict-resolution dialog
It's now possible to tab through the panes and the buttons, and
left/right-arrow also change the selection, so you can use Left/Right +
Return to move through multiple conflicts.

Fixes #3395
2023-09-06 06:40:59 -04:00
Pomelo Orange
ad676adbbb
fix: symlink has no referent: "xxx/zotero/build/resource/pako.js" (#3397) 2023-09-06 03:21:11 -04:00
windingwind
b91ae86079 Mark ItemTreeColumnOptions.renderCell as optional 2023-09-06 14:02:18 +08:00
Dan Stillman
e1def9971c Remove unnecessary mktemp alias on macOS
https://github.com/zotero/zotero/pull/3397/files#r1315697046
2023-09-05 06:47:17 -04:00
Dan Stillman
ecba25be0f Update reader submodule 2023-09-03 22:25:19 -04:00
Dan Stillman
647e45c115 Use mixed-case DOI in retraction tests
https://forums.zotero.org/discussion/comment/442114/#Comment_442114 is
being fixed on the server, but test it here.
2023-09-03 18:51:50 -04:00
Dan Stillman
b4c3c0c7f9 Don't require unused date field in retractions list 2023-09-03 18:43:44 -04:00
Dan Stillman
b918ad2892 Fix error closing ZIP reader during file sync on Windows
In Z7 on Windows 10 (but not 11 for me), nsIZipReader doesn't properly
close the file after `findEntries()` is called (as discovered by
@abaevbog), so a `remove()` on the downloaded ZIP file during file
syncing triggers an access-denied error. Setting the zip-reader variable
to null and forcing garbage collection seems to fix it. Doing this
everywhere we use nsIZipReader just to be safe.

I found the `forceGC()` in only one test file in fx102, but setting the
reader to null is done more widely, so maybe they just don't try to
delete ZIP files before GC happens and manage to avoid this bug.

Fixes #3369
2023-08-31 06:17:18 -04:00
windingwind
794e89d307
Add itemTree render cell option (#3342) 2023-08-30 00:11:25 -04:00
Martynas Bagdonas
b72894d874 Fix still broken reader view focusing after tab switch 2023-08-29 13:47:11 +03:00
abaevbog
ae1c8bd059
set opened reader tab index on state restore (#3357)
Fixes: #3353
2023-08-28 23:29:41 -04:00
Abe Jellinek
85cade3fb2
Make preferences less janky, preload panes on hover, allow panes to delay visibility until promise resolves (#3363)
Prevents flashes of unlocalized labels and controls without values set.
Makes switching panes feel speedier overall because of preloading.

I thought there was an issue for the flashes of uninitialized content but can't
find it now.
2023-08-26 05:57:38 -04:00
Dan Stillman
b79e0b3d71 Update reader submodule 2023-08-25 01:13:42 -04:00
Abe Jellinek
6cd44f19fe Fix more Z6/Z7 inconsistencies in Advanced Search
- Prevent row height from changing when switching between text input conditions
  and menulist conditions
   - Replace some of (far from all of) the XUL layout with flexbox
- Restore groupbox appearance
   - A little retro? We probably want some kind of border like we used to have
- Replace some duplicate IDs with classes for styling
2023-08-24 11:14:59 -04:00
Dan Stillman
075457be45 Use REPLACE instead of INSERT for ebook schema changes
Follow-up to bdea760 (#3360), which I changed incorrectly
2023-08-24 05:13:42 -04:00
Dan Stillman
e3a6508134 Merge new English strings 2023-08-24 04:16:43 -04:00
Abe Jellinek
bdea76024b
Add EPUB to Attachment File Type in Advanced Search (#3360) 2023-08-24 03:06:33 -04:00
Dan Stillman
1aa25964ba Update reader submodule 2023-08-24 02:58:17 -04:00
Abe Jellinek
8f4cb5002a
Fix progress queue segfault (#3359) 2023-08-23 04:56:21 -04:00
Dan Stillman
8125b62108 Update reader submodule 2023-08-23 04:31:00 -04:00
Abe Jellinek
fe10897bda Update reader submodule 2023-08-22 09:57:22 -04:00
Abe Jellinek
17aedbc5af Update reader submodule 2023-08-21 12:21:04 -04:00
Abe Jellinek
30c70a6ecd Defer removing tab content
Improves EPUB close performance.

By wrapping with requestIdleCallback(), we ensure:

  1. remove() won't be called right away, so the DOM elements being removed
     won't be visible and won't trigger a relayout.
  2. remove() won't be called while there are pending UI events, so it
     shouldn't cause the UI to hang/lag/stutter.

Combined, these two improvements make the UI hang when closing a large EPUB
mostly imperceptible on my machine.

Addresses #3321; doesn't completely fix it because there's likely more to be
done on the reader side to optimize the DOM.
2023-08-21 12:20:57 -04:00
Dan Stillman
38d0750dd3 Don't include parent title in tab title for secondary attachments
As suggested in https://github.com/zotero/zotero/issues/2731#issuecomment-1201382522
2023-08-20 02:26:58 -04:00
Tom Najdek
4f19b1d13e
Improve file renaming preview in preferences (#3343) 2023-08-19 05:06:08 -04:00
Dan Stillman
4dbd52782c Better fixing of tab-title logic
Follow-up to 3eef4284d1, which wasn't totally correct, and adds the
attachment title before the parent metadata for secondary attachments.

https://forums.zotero.org/discussion/comment/441362/#Comment_441362
2023-08-19 04:51:04 -04:00
Dan Stillman
3eef4284d1 Fix "Filename" tab title option
https://forums.zotero.org/discussion/comment/441259/#Comment_441259
2023-08-19 04:00:49 -04:00
Martynas Bagdonas
b05ef8ed04 Properly focus reader iframe when opening a new reader instance 2023-08-18 18:33:52 +02:00
Dan Stillman
3ef1f09927 Update reader submodule 2023-08-17 01:47:38 -04:00
Dan Stillman
fb96cd595d Add startHTTPServer() support function
Centralize httpd creation and add automatic retry to try to deal with
NS_ERROR_SOCKET_ADDRESS_IN_USE errors in CI.
2023-08-16 01:16:49 -04:00
Abe Jellinek
17daf9fe8d Fix EPUB attachments with wrong MIME type on view
Fixes #3320
2023-08-15 17:54:37 -04:00
Abe Jellinek
7b26dab2f2 Show spread mode menu items in EPUB reader
Fixes #3318 (only odd spreads supported right now because of CSS grid
limitations)
2023-08-15 17:54:36 -04:00
Abe Jellinek
edcacfa92b Update reader submodule 2023-08-15 17:50:21 -04:00
Dan Stillman
367ecb66c3 Update reader submodule 2023-08-15 04:30:57 -04:00
Dan Stillman
437e2bd920 Update reader submodule 2023-08-11 07:23:19 -04:00
Northword
dcca56d6c3
preferenceOptions.helpurl should be string instead string[] (#3310) 2023-08-11 07:13:58 -04:00
Dan Stillman
9dd182e9ca Collection tree selection fixes
Fixes various logic around what gets selected when collections and
searches are moved to or restored from the trash (which has never been
exposed) or when they're erased
2023-08-11 04:16:42 -04:00
Dan Stillman
c4eb9df716 Update utilities submodule 2023-08-09 18:09:03 -04:00
Dan Stillman
69ba2310a2 Actually fix NS_ERROR_SOCKET_ADDRESS_IN_USE during tests 2023-08-09 08:05:30 -04:00
Dan Stillman
5e27a75010 Switch to better sentence-caser from zotero/utilities#26
Closes #293
2023-08-09 07:51:16 -04:00
Dan Stillman
3b04c012b3 Fix --openssl-legacy-provider issue when tests need to build reader 2023-08-09 07:27:22 -04:00
Dan Stillman
8f6af79280 Update reader submodule 2023-08-09 07:27:22 -04:00
Dan Stillman
e83a8dba0e Update reader submodule 2023-08-09 05:39:33 -04:00
Martynas Bagdonas
879109336a Rename pdf-reader paths to reader 2023-08-08 11:28:00 +03:00
Dan Stillman
838a3090fd Move pdf-reader submodule to reader 2023-08-08 01:40:24 -04:00
Dan Stillman
4ac3128b17 Use more ports for attachment tests
To try to avoid this stupid NS_ERROR_SOCKET_ADDRESS_IN_USE error
2023-08-07 17:36:19 -04:00
Dan Stillman
f0e1da23bc Update pdf-reader submodule 2023-08-07 17:29:26 -04:00
Dan Stillman
ae8ed58383 Disable PDF reader tests 2023-08-07 16:27:23 -04:00
Dan Stillman
1af3d702d3 Update pdf-reader submodule 2023-08-07 16:13:28 -04:00
Dan Stillman
5d2514b09f Update pdf-reader submodule URL 2023-08-07 16:12:04 -04:00
Dan Stillman
ed52c7d7ef Merge new English strings 2023-08-07 16:07:56 -04:00
Abe Jellinek
278f2de7bd Fix iframe load stopping if attachment resource channel aborts (#67) 2023-08-07 16:07:56 -04:00
Dan Stillman
827edccfbd Update pdf-reader submodule 2023-08-07 16:07:56 -04:00
Martynas Bagdonas
07e4d68760 Suppress noisy "dead object" error after each click inside reader tab 2023-08-07 16:07:56 -04:00
Martynas Bagdonas
a167b6932b Update reader, pdf-worker and note-editor submodules 2023-08-07 16:07:56 -04:00
Dan Stillman
7e481e3e5f Move Language to the bottom of the General prefpane 2023-08-07 16:07:55 -04:00
Dan Stillman
38b9457ea9 Move new string to Fluent 2023-08-07 16:07:55 -04:00
Dan Stillman
caee5f29ca Update reader prefs
- Move open-in prefs into reader prefs
- Move reader prefs up below File Handling
- Move new strings to Fluent
- Fix clicking on labels to focus open-in drop-downs
- Tweak text
2023-08-07 16:07:55 -04:00
Abe Jellinek
deb6acaab1 Add preferences for ebook & snapshot file handling 2023-08-07 16:07:55 -04:00
Abe Jellinek
2ef560f7d8 Extract ISBNs and DOIs from EPUB content (#64)
And move EPUB functionality to class.
2023-08-07 16:07:55 -04:00
Abe Jellinek
cab0fa93e7 Extend Retrieve Metadata to support EPUBs (#57) 2023-08-07 16:07:55 -04:00
Martynas Bagdonas
2869d5869b Update reader submodule 2023-08-07 16:07:55 -04:00
Martynas Bagdonas
80da0fbb56 Remove the unnecessary buf to Uint8Array conversion 2023-08-07 16:07:55 -04:00
Abe Jellinek
b0b11cfcf5 Use data option to initialize reader 2023-08-07 16:07:55 -04:00
Martynas Bagdonas
80e04ad4b1 Update reader submodule 2023-08-07 16:07:55 -04:00
Martynas Bagdonas
e031509966 Fix Reader 2.0 merge caused regressions 2023-08-07 16:07:55 -04:00
Martynas Bagdonas
c62ed29de9 Fix text annotation dragging error 2023-08-07 16:07:55 -04:00
Martynas Bagdonas
fed4749a46 Update reader submodule 2023-08-07 16:07:54 -04:00
Martynas Bagdonas
f18411c151 Properly trigger annotation position split if server says it's too long 2023-08-07 16:07:54 -04:00
Martynas Bagdonas
12fde2dd4a Fix reader error handling and properly display critical errors 2023-08-07 16:07:54 -04:00
Martynas Bagdonas
d575e3a71d Update reader submodule 2023-08-07 16:07:54 -04:00
Martynas Bagdonas
46d066394f Temporary fix for tab crashes caused by tab loading racing conditions 2023-08-07 16:07:54 -04:00
Martynas Bagdonas
7e28973f3a Fix reader focusing 2023-08-07 16:07:54 -04:00
Martynas Bagdonas
b8194129da Update pdf-worker submodule 2023-08-07 16:07:54 -04:00
Abe Jellinek
b408b43394 Support pre-SingleFile snapshots 2023-08-07 16:07:54 -04:00
Martynas Bagdonas
5d8dd7cdf4 Add missing strings needed for reader 2023-08-07 16:07:54 -04:00
Martynas Bagdonas
3c08604770 Fix PDF file printing 2023-08-07 16:07:54 -04:00
Martynas Bagdonas
17deb16779 Add partial underline annotation support for note-editor
(changes to note-editor have to be merged to have full support)
2023-08-07 16:07:54 -04:00
Abe Jellinek
e199f35006 Fix _getColorIcon(), update stroke color, use for selected menuitems
- Need to set width/height for macOS native menu
- CSS named grays are too light to show well on the background, so use #555
- type="checkbox" menuitems don't show their icons, so use the icon stroke
  instead
2023-08-07 16:07:54 -04:00
Abe Jellinek
3443d065a3 Use native context menus on macOS 2023-08-07 16:07:53 -04:00
Abe Jellinek
1740e5f1aa Call uninit() in close()
This properly unregisters pref observers and flushes the reader's state.
2023-08-07 16:07:53 -04:00
Abe Jellinek
0ee54b4a7e Use IOUtils instead of OS.File 2023-08-07 16:07:53 -04:00
Abe Jellinek
bdb444371f Debounce writing EPUB/snapshot state to disk 2023-08-07 16:07:53 -04:00
Abe Jellinek
6a4715c324 Enable "Add Note from Annotations" for EPUBs and snapshots 2023-08-07 16:07:53 -04:00
Abe Jellinek
db6ff88ad1 Add full-text indexer for EPUBs 2023-08-07 16:07:53 -04:00
Martynas Bagdonas
e8c5c22d05 Fix pdf-worker CMaps and standard fonts paths 2023-08-07 16:07:53 -04:00
Martynas Bagdonas
7fa05bc463 Properly handle reader window closing 2023-08-07 16:07:53 -04:00
Martynas Bagdonas
9d2d655039 Avoid memory leaks caused by never removed event listeners 2023-08-07 16:07:53 -04:00
Abe Jellinek
7791779289 Fix unloaded tab context menu actions
Show in Library and Move to New Window.

Will fix zotero/zotero#2685
2023-08-07 16:07:53 -04:00
Abe Jellinek
98fceea06d Update reader submodule 2023-08-07 16:07:53 -04:00
Abe Jellinek
52cbffbd79 Localize pdfReader.location 2023-08-07 16:07:53 -04:00
Martynas Bagdonas
674f91389a Update reader and pdf-worker submodules 2023-08-07 16:07:52 -04:00
Abe Jellinek
24ff98b88a Update reader submodule 2023-08-07 16:07:52 -04:00
Abe Jellinek
a729297f6b Add menu items to switch EPUB flow modes (paginated/scrolled) 2023-08-07 16:07:52 -04:00
Abe Jellinek
61f21f48e8 Fix browser-custom-element.js event handler error
Send real mouse/pointer events so that the CE can call, e.g.,
preventClickEvent().
2023-08-07 16:07:52 -04:00
Abe Jellinek
a7f1235fd1 Fix middle-mouse autoscroll in reader 2023-08-07 16:07:52 -04:00
Abe Jellinek
ba1b1b0639 Add EPUB format to Zotero.MIME 2023-08-07 16:07:52 -04:00
Abe Jellinek
d6547bab34 Update reader submodule 2023-08-07 16:07:52 -04:00
Abe Jellinek
1d89360765 Persist snapshot scroll position 2023-08-07 16:07:52 -04:00
Abe Jellinek
60f8d11c2d Persist EPUB CFI with setAttachmentLastPageIndex() 2023-08-07 16:07:52 -04:00
Martynas Bagdonas
d975450ae1 Update reader submodule 2023-08-07 16:07:52 -04:00
Martynas Bagdonas
52e698fdbc Add missing reader strings 2023-08-07 16:07:52 -04:00
Martynas Bagdonas
3105bb9ff3 Fix add to note 2023-08-07 16:07:52 -04:00
Martynas Bagdonas
110f29b766 Save reader state into .zotero-reader-state file 2023-08-07 16:07:52 -04:00
Martynas Bagdonas
572cd3655e Fix reader context menu positioning in RTL mode 2023-08-07 16:07:51 -04:00
Martynas Bagdonas
0134ebefc2 Update reader submodule 2023-08-07 16:07:51 -04:00
Abe Jellinek
f5381403c0 Add ebook font to preferences
Choose from a list of preset font stacks, or any font on your system.
2023-08-07 16:07:51 -04:00
Abe Jellinek
378277206a Add Reset Zoom to EPUB/snapshot reader View menu 2023-08-07 16:07:51 -04:00
Abe Jellinek
3be3d8ebef Zotero.Items: Support EPUB and snapshot annotations 2023-08-07 16:07:51 -04:00
Martynas Bagdonas
681cdd809f Reader 2.0 2023-08-07 16:07:51 -04:00
Tom Najdek
19382a061f
Remove unnecessary code in getFileBaseNameFromItem 2023-08-07 17:03:27 +02:00
Dan Stillman
88d39ec04a Update locales from Transifex 2023-08-06 18:31:05 -04:00
Dan Stillman
4e3977e9ce Update file-renaming prefs (#3228)
- Move file-renaming prefs to separate prefs section
- Fix template preview not updating on paste
- Update documentation URL
- Tweak text, styling, and ids
- Change "Automatically rename attachment files using parent metadata"
  to "Automatically rename locally added files" to reflect that
  downloaded files are always renamed, and add an intro saying so
2023-08-06 17:50:13 -04:00
Tom Najdek
d32b061c95 Add UI for editing attachment rename format pref (#3228) 2023-08-06 17:48:56 -04:00
Dan Stillman
af91173734 Look up PubMed IDs in batches of 200
https://forums.zotero.org/discussion/comment/440245/#Comment_440245
2023-08-05 00:01:55 -04:00
Dan Stillman
fcc68d6d80 Serialize lookup requests
These were switched to parallel in 86b77cc45, resulting in blocks:

https://forums.zotero.org/discussion/106658/limited-amount-of-articles-that-can-be-added-through-pmid
2023-08-04 23:21:35 -04:00
Abe Jellinek
251da0a148 Add SCSS styles to note.xhtml
Fixes #3193
2023-08-04 10:08:30 -04:00
Dan Stillman
3a43a98f10 Add IOUtils and PathUtils to plugin sandbox 2023-08-04 06:18:52 -04:00
Dan Stillman
9b0ce9558c
attachmentRenameFormatString → attachmentRenameTemplate (#3249) 2023-08-04 05:58:15 -04:00
windingwind
e44e3edef9
Fix itemBox.js eslint errors (#3244) 2023-08-04 04:15:08 -04:00
Dan Stillman
07309d7c25
Add Zotero.getMainWindows() 2023-08-03 05:11:26 -04:00
windingwind
1ca34261d3 Update ItemTreeManager.unregisterColumns example 2023-08-03 11:08:55 +08:00
Dan Stillman
9303b22661 Update eslint config to 1.0.8 2023-08-02 06:38:35 -04:00
Dan Stillman
fb4f55e809 Restore Word → LibreOffice order in Cite prefpane 2023-08-02 06:36:38 -04:00
Adomas Venčkauskas
b261d10b89 Fix Return not accepting citation dialog after pasting. Closes #3240 2023-08-01 09:47:42 +03:00
Adomas Venčkauskas
4b16269b7f Prefs: Add an event on pane switch
Fixes an issue with incomplete Style Manager tree rendering when
switching panes. Closes #3239
2023-08-01 09:18:30 +03:00
windingwind
836c8718b0 Fix itemTreeManager typo 2023-07-31 21:48:20 +08:00
windingwind
76c1db33e9 Fix itemTreeManager typo 2023-07-31 21:47:38 +08:00
Abe Jellinek
345bbcf50c Scaffold: Prompt to save before resetting
Now that Scaffold remembers and automatically loads the last edited translator
(65048fd624), it needs to be easier to create a
new translator without saving (and bumping the lastModified date on) the
translator you had open.
2023-07-31 09:44:20 -04:00
windingwind
ef7916b320
Add main window hooks for plugins (#3238) 2023-07-31 05:09:33 -04:00
Abe Jellinek
6dcc70f531 Zotero.PreferencePanes.register: Set default values for scripts/stylesheets
Without this, the calls to .map() below throw when one or both of those options
aren't set.
2023-07-29 22:28:10 -04:00
Abe Jellinek
8a7f3645bc
Item box: Add DOI menu listeners once, disable when DOI is invalid (#3237)
Fixes #3221

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2023-07-29 04:25:34 -04:00
Dan Stillman
02198b12fe Fix dragging to My Publications
Also:

  - Don't show file options if only linked files
  - Don't set Rights field to "All Rights Reserved" if no files
2023-07-29 02:22:20 -04:00
Dan Stillman
f01fe2801d Check for rsync in check_requirements 2023-07-28 16:14:00 -04:00
Abe Jellinek
cbece42fb9 Fix merge pane overflow behavior
The item box CE can't be the scroll container, so it needs a wrapper element.

Fixes #3233
2023-07-28 15:06:02 -04:00
Abe Jellinek
7036073ed1
Resolve plugin-provided URIs relative to rootURI (#3235) 2023-07-28 00:16:58 -04:00
Abe Jellinek
e271b4e494 copyToUnique: Fail if source contains destination
To prevent unbounded recursion as in 16547f64c2.
2023-07-27 12:24:51 -04:00
Abe Jellinek
16547f64c2 renameAttachmentFile: Check rename() return value
And actually return -1 if it returns false.

Before this fix, attempting to rename an attachment file to a name that already
exists on disk would never return -1 as the docs say it should. Instead:

1. rename() would fail and return false
2. newName would be set to false
3. renameAttachmentFile() would pass false as the second argument to
   OS.Path.join()
4. OS.Path.join() would ignore it because it was falsy and return the attachment
   directory path without any modification
5. relinkAttachmentFile() would be called with path set to the attachment
   directory
6. relinkAttachmentFile() would notice that path's dirname wasn't the attachment
   directory - it was the attachment directory's parent - and attempt to copy it
   and its contents, recursively, into itself, using copyToFollowingLinks()

...which created a directory structure on disk over 100 directories deep -
not deeper only because the OS started returning errors due to paths exceeding
32,767 characters (the limit on my filesystem).
2023-07-27 12:24:32 -04:00
Dan Stillman
00683732d8 Make XMLSerializer available in plugins
https://groups.google.com/g/zotero-dev/c/ZKoDSBniSXs/m/VDhPpjNqAAAJ
2023-07-26 23:01:23 -04:00
Dan Stillman
0d70925816 Fix error loading plugin scope after 6a2fcd6898
`AddonManager.getActiveAddons(["extension"])` doesn't return fully
loaded addon objects if `getAllAddons()` hasn't been called
2023-07-26 23:01:17 -04:00
Adomas Venčkauskas
987b7ea952 Update Word for Mac submodule 2023-07-26 16:10:58 +03:00
Dan Stillman
be1ab236c8 Better cycling through httpd.js ports to avoid CI failures 2023-07-26 07:25:22 -04:00
Dan Stillman
a376ad8762 Don't close and reopen window during WebDAV tests
With any luck this will fix the crashing we've been getting in CI.
2023-07-26 07:25:22 -04:00
Dan Stillman
6a2fcd6898 Remove loadExtensionDefaults() in prefs.js
We now handle this in prefs.js.
2023-07-26 07:25:21 -04:00
Dan Stillman
5c26fe15d8 Check for Node 18 or later 2023-07-26 06:49:00 -04:00
Dan Stillman
a1f49e11d5 Fix low-res webpage icon 2023-07-25 07:35:03 -04:00
Adomas Venčkauskas
d96afa4499 Fix split-menu-button dropmarker triggering the button click event
Regression in fa31956d
2023-07-25 14:23:34 +03:00
Dan Stillman
630c6d0d97 Fix tags not being saved in item tags box when pressing Enter
SyntaxError: Element.querySelector: '[ztabindex=1]' is not a valid selector

https://forums.zotero.org/discussion/106405/zotero-7-changes-to-item-tag-do-not-persist
2023-07-25 05:51:41 -04:00
Dan Stillman
fb59345637 Fix "Check for Update" buttons in error dialogs
Fixes #3213
2023-07-25 01:53:22 -04:00
Dan Stillman
ed2cae9236 Adjust attachment-title handling on Rename File from Parent Metadata
Don't change the attachment title on a manual rename from metadata if it
doesn't match the current filename, with or without the extension

Closes #3220
2023-07-25 01:48:23 -04:00
Dan Stillman
d95c10e06c Use NODE_OPTIONS=--openssl-legacy-provider in build_and_run 2023-07-25 00:52:54 -04:00
windingwind
c89590c7b7
Add ItemTree column API (#3186) 2023-07-25 00:47:12 -04:00
Abe Jellinek
676f820f87
Strip bidi control characters in filenames and elsewhere (#3208)
Passing unformatted = true to Item#getField() now returns a bidi control
character-less result, and we use that in Reader#updateTitle() and
getFileBaseNameFromItem() to prevent bidi control characters from showing up in
filenames and window titles (the former everywhere, the latter on Windows only).

We also strip bidi control characters in getValidFileName() to be extra safe.
2023-07-22 03:30:28 -04:00
Abe Jellinek
f8b4d186a8 Update pdf-worker submodule 2023-07-21 18:36:38 +03:00
Abe Jellinek
1217710234 PDFWorker manager: OS.File -> IOUtils 2023-07-21 18:36:38 +03:00
Abe Jellinek
5aaf368149 Use pdf-worker for hasEmbeddedAnnotations() 2023-07-21 18:36:38 +03:00
Dan Stillman
f4f9712bc9 Increase default title length limit to 100 in attachment filenames 2023-07-21 06:33:01 -04:00
Dan Stillman
2fad3d89ff Use getDisplayTitle() for titles in timelines
https://forums.zotero.org/discussion/106290/zotero-timeline-does-not-display-email-subject
2023-07-21 06:23:02 -04:00
windingwind
97235d2dea
Fix selectitems.xhtml persist bug (#3219)
See https://groups.google.com/g/zotero-dev/c/OscDKuO9Rao
2023-07-21 04:43:52 -04:00
Tom Najdek
0ba766f2e0
Customizable renaming rules #1413 (#2297) 2023-07-20 06:50:34 -04:00
Dan Stillman
96e2510165 Fix missing return in previous commit 2023-07-20 06:42:32 -04:00
Dan Stillman
590460cea4 Add Zotero.Prefs.prefHasUserValue(pref, global) 2023-07-20 06:41:23 -04:00
Dan Stillman
51c70eb925 Use system temp directory by default
Might help for something like
https://forums.zotero.org/discussion/106337/zotero-7-sync-error
2023-07-20 05:43:39 -04:00
Adomas Venčkauskas
75c46e1e5c Enable FAYT in document preferences. Closes #3214 2023-07-20 11:10:14 +03:00
Dan Stillman
d968e8ec33 Update locales from Transifex 2023-07-18 07:55:41 -04:00
Dan Stillman
d3502b22f2 Update Linux build to Firefox 102.13.0esr 2023-07-18 07:40:20 -04:00
Adomas Venčkauskas
1b30c8b2b5 Add a comment for bib style caching. Closes #3211 2023-07-18 10:58:12 +03:00
Adomas Venčkauskas
f61826281b Revert "Merge pull request #3195 from CommonLoon102/cl102/fix-bib-indent"
This reverts commit aca86967bf, reversing
changes made to 1a850d58c4.
2023-07-18 10:55:14 +03:00
abaevbog
9599d1712c
disable file > close for library if 1+ tabs open (#3210)
When there are multiple tabs opened, menuitem File > Close is disabled for the library tab.

Fixes: #3198
2023-07-18 03:40:19 -04:00
Martynas Bagdonas
e37eaac8d1 Fix panes overflowing in stacked view mode
Fixes #3180
2023-07-17 17:07:38 +03:00
Dan Stillman
c425f71ac4 fx-compat: Fix error passing cookieSandbox to Zotero.HTTP.request()
https://groups.google.com/g/zotero-dev/c/UgP_kZvrEjA/m/KjimYREGAgAJ

getInterface() seems to exist on XHR and nsIWBP without QIing to
nsIInterfaceRequestor, and XHR no longer has QueryInterface().
2023-07-17 06:42:14 -04:00
Dan Stillman
65fe50d11f Clear startup cache when uninstalling/upgrading plugins
https://groups.google.com/g/zotero-dev/c/0nfU-F2q1uI/m/1jBVmMZxBAAJ

Removed by Mozilla in
https://bugzilla.mozilla.org/show_bug.cgi?id=1445739, since
WebExtensions don't put anything in the startup cache
2023-07-15 18:39:59 -04:00
Dan Stillman
838152155e Log warning when not setting createdByUser/lastModifiedByUser
(I encountered this in a test when trying to set createdByUserID without
`Zotero.Users.setName()`.)
2023-07-14 05:48:48 -04:00
Dan Stillman
dc321ce643 Fix startup error on Windows
Regression from 8d3f874e64, which included this unfinished code by mistake.

Fixes #3196
2023-07-14 05:48:48 -04:00
abaevbog
0cd94555d5
prevent incorrect jumpback (#3204)
Fixes: #3152
2023-07-14 05:29:43 -04:00
Dan Stillman
d7449b4d78 Fix merging of group attachments with annotations created by another user
https://forums.zotero.org/discussion/106197/merge-in-group-library-fails-despite-having-edit-permissions
2023-07-13 19:58:47 -04:00
Adomas Venčkauskas
e5d25f3d66 Fix /connector/saveSnapshot still not including info about snapshots 2023-07-12 10:21:46 +03:00
Abe Jellinek
2aa34a6346 Merge: Remove spacing from annotation regex, delete external annotation items
- `/Subtype` isn't necessarily preceded or followed by a space
- Annotation items with `isExternal: true` are for display only and should be
  deleted on merge

https://forums.zotero.org/discussion/105960/external-annotations-ignored-when-merging
2023-07-11 11:12:58 -04:00
Adomas Venčkauskas
a0cdf11096 Fix failing test from 02ba9ca7 2023-07-11 15:57:35 +03:00
Adomas Venčkauskas
02ba9ca7f0 Include information about saved snapshots in /saveSnapshot 2023-07-11 15:45:51 +03:00
Martynas Bagdonas
5928147f26 Fix middle-click selecting tab that is being closed 2023-07-11 14:02:12 +03:00
Dan Stillman
0186e6330a Update note-editor 2023-07-11 06:12:39 -04:00
Dan Stillman
ae4587226c Update note-editor submodule 2023-07-11 05:37:32 -04:00
Dan Stillman
8d3f874e64 Remove all uses of Zotero.isStandalone
(View diff with -w)
2023-07-11 05:35:32 -04:00
Dan Stillman
4b7a1e8607 Get rid of some console warnings
And some other unused CSS
2023-07-11 05:35:32 -04:00
Dan Stillman
b98efe0b67 Remove ZoteroPane.updateTagsBoxSize()
Disabled several years ago in bb5075e8b8
2023-07-11 05:35:32 -04:00
Dan Stillman
071162f914 Remove styled-textbox XBL binding 2023-07-11 05:35:32 -04:00
Dan Stillman
af892e5cbd Make annotation sortIndex more flexible 2023-07-11 05:35:32 -04:00
Abe Jellinek
b6d0ad3e05 Accept non-integer attachmentLastPageIndex 2023-07-11 05:35:32 -04:00
Martynas Bagdonas
89adf56eed Add support for text annotations 2023-07-11 05:35:32 -04:00
Martynas Bagdonas
cb14034c46 Add support for underline annotations 2023-07-11 05:35:32 -04:00
Dan Stillman
81ec8287f8 Disable attachmentContentType check to prevent sync errors 2023-07-11 05:35:32 -04:00
Dan Stillman
4a8935eefd Guidance panel fixes
- Fix missing styling in Quick Format dialog
- Fix Book Section panel being immediately hidden
- Remove low-res Zotero icon
- Increase font size and tweak padding
2023-07-11 05:35:32 -04:00
Dan Stillman
94cd2f6e92 Update Windows build to Firefox 102.13.0esr 2023-07-09 10:42:39 +01:00
Dan Stillman
21c05bb8d7 Cycle through httpd.js ports to prevent CI failures in ZoteroPane tests
And remove unused XHR mock
2023-07-06 19:22:05 -04:00
Dan Stillman
fb3466b392 Fix Ctrl-Q on Linux
Fixes #3199
2023-07-06 19:21:52 -04:00
Dan Stillman
cb5ef83f0a Skip 32-bit Linux build on x86_64 for dir_build without -p
And build_and_run doesn't set -p, so build_and_run will now skip
unnecessary 32-bit builds
2023-07-06 19:02:09 -04:00
Dan Stillman
7c25ab536f Skip 32-bit Linux build if SKIP_32 env variable is set 2023-07-06 18:46:38 -04:00
windingwind
a2e8be2af5
Fix extremely slow binary to base64 (#3201) 2023-07-06 01:56:38 -04:00
Martynas Bagdonas
8017b2ab1b Fix extremely slow note editor image ArrayBuffer to data URL conversion 2023-07-05 19:41:32 +03:00
Adomas Venčkauskas
2db13c2494 Update Word for Mac submodule 2023-07-05 15:11:10 +03:00
Adomas Venčkauskas
49eda8861e Improve build scripts to work in pathnames with spaces 2023-07-05 15:01:41 +03:00
abaevbog
04496fadcd
only save username to prefs on successful login (#3192)
Failing to login does not update the username in prefs.

Fixes #2901
2023-07-05 04:11:56 -04:00
abaevbog
13571f9fd2
making toolbar accessible to the keyboard - initial conversion (#3188)
Port of d866a10a2b

Fixes #3001
2023-07-05 03:17:07 -04:00
Adomas Ven
aca86967bf
Merge pull request #3195 from CommonLoon102/cl102/fix-bib-indent
Fix indentation in bibliography
2023-07-03 15:19:01 +03:00
Adomas Venčkauskas
1a850d58c4 Fix the column picker not working outside of zotero pane. Closes #3162 2023-07-03 14:54:50 +03:00
CommonLoon102
b60fb28313
Fix indentation in bibliography
Fix indentation in bibliography when a new item is added and therefore the recalculation of indents are needed.

https://forums.zotero.org/discussion/23689/bibliography-indentation
2023-07-01 13:15:44 +02:00
Dan Stillman
1766f8bb53 Plugin lifecycle fixes
- Call `shutdown()`/`uninstall()` with `ADDON_UPGRADE`/`ADDON_DOWNGRADE`
  during plugin upgrade/downgrade
- Actually call new version's bootstrap.js, not cached old version
- Create new scope for new version
- Don't call `shutdown()` on uninstall if not active

Fixes #3159
2023-07-01 06:19:04 -04:00
Martynas Bagdonas
fcb30b5e5d Fix not working context menu options to create note from annotations 2023-06-30 10:54:52 +03:00
Dan Stillman
f447a4953a Fix intermittently missing title bar on Windows
https://forums.zotero.org/discussion/comment/437636/#Comment_437636
2023-06-28 07:41:01 -04:00
Adomas Venčkauskas
1274f5f602 Fix citation reordering by dragging in the citation dialog. Closes #3183 2023-06-28 13:36:38 +03:00
Martynas Bagdonas
abfe96fcaa Temporary fix for context-pane item deck selection when closing a tab
Fixes #3175
Related to bb85e11a
2023-06-27 18:34:15 +03:00
Abe Jellinek
65048fd624 Scaffold: Automatically load last opened translator 2023-06-24 15:00:57 -07:00
Abe Jellinek
9b6d6c109c RemoteTranslate: Support cross-origin XMLHttpRequest
By creating our Sandbox under the system principal and giving it privileged XHR.
Bonus: no more `wrappedJSObject` required because sandbox code and actor code
are at the same privilege level now.

Fixes #3176
2023-06-23 22:19:46 -07:00
Dan Stillman
3454c321e7 Fix sw_vers call on older macOS versions
Apparently it didn't used to allow two hyphens before flags
2023-06-23 02:01:27 -04:00
Dan Stillman
f8d8fb5e11 Fix item-type-menu breakage after canceling item-type change on Windows
https://forums.zotero.org/discussion/105739/zotero-7-beta-bug-changing-item-type
2023-06-22 14:18:23 -04:00
Dan Stillman
4b581ad07b Don't call plugin startup() on upgrade if disabled
Fixes #3177

https://forums.zotero.org/discussion/105692/z7-beta-disabled-add-on-suddenly-active
2023-06-22 05:05:05 -04:00
Dan Stillman
14f7d3acad Cycle through httpd ports to prevent CI failures
We didn't seem to be doing this anymore, even though we had a comment
for it, and some tests were failing with NS_ERROR_SOCKET_ADDRESS_IN_USE.
2023-06-19 06:54:19 -04:00
Dan Stillman
00651d670d Switch to notarytool for Mac build notarization 2023-06-19 06:39:39 -04:00
Dan Stillman
f1003a1d1e Ignore .DS_Store and other files in localizer script 2023-06-19 04:34:29 -04:00
Dan Stillman
d868143fc9 Update locales from Transifex and merge new English strings 2023-06-19 04:34:29 -04:00
Dan Stillman
f62cef9c12 Remove DOMLocalization from plugin sandbox
That can just be retrieved directly from document.l10n on the
appropriate window, and Mozilla doesn't use it directly.
2023-06-18 16:55:30 -04:00
Dan Stillman
c7304b9fb0 Fix plugin localization handling
Pass Localization and DOMLocalization to plugins and fix locale
registration so that it occurs before startup() is called.
2023-06-18 16:50:04 -04:00
Dan Stillman
a49b58ba87 Cancel in-progress CI runs if another one starts 2023-06-17 02:45:31 -04:00
Abe Jellinek
0a94e8fdf0
fx-compat: Make color picker CE accessible via keyboard and VoiceOver (#2933) 2023-06-17 02:43:24 -04:00
Dan Stillman
ffdfc73d47 Fix python executable name in 2xize 2023-06-17 02:34:31 -04:00
Abe Jellinek
b7626a1baa Remove min-width/height rules
Not actually necessary to get the sizing right in the dialog.
2023-06-17 02:33:59 -04:00
Abe Jellinek
c37e327330 Fix clicky sizing and appearance
- Set min-width and min-height to width and height so buttons never shrink
- Remove defunct .zotero-clicky-* styles from 2x block in zotero.css
- Include zotero-platform/content/zotero.css in searchDialog.xhtml
   - It seems only the defunct 2x styles from zotero.css were being applied, so
     the buttons would have been unstyled on a non-hiDPI display
2023-06-17 02:33:59 -04:00
Abe Jellinek
1a2950ae34 Automatically adjust height of multiline/long fields in edit mode
Fixes #3170
2023-06-16 12:17:29 -07:00
Adomas Venčkauskas
885ef28a0d Update SingleFile submodule 2023-06-16 16:45:43 +03:00
Dan Stillman
2277c73891 Update Word for Mac submodule 2023-06-16 06:26:13 -04:00
Adomas Venčkauskas
9668270017 Fix the integration template check for unknown agents 2023-06-16 12:40:13 +03:00
Adomas Venčkauskas
6efa55ffdf Update Word for Mac submodule. Update template version check 2023-06-16 03:24:03 -04:00
Adomas Venčkauskas
e3e607a6d4 Add support for macWord transaction initialization via HTTP 2023-06-16 03:24:03 -04:00
Abe Jellinek
c124ca9738 Scaffold: Fix test creation
Fixes #3167
2023-06-15 16:18:57 -07:00
Dan Stillman
4273448b5d Add preferences.ftl files for all locales 2023-06-15 06:07:29 -04:00
Dan Stillman
1c9ca88280 Update Word for Mac submodule
Fixes permissions prompt
2023-06-14 05:33:13 -04:00
Abe Jellinek
2639981dda
Block remote content when indexing HTML file (#3157) 2023-06-12 23:43:18 -04:00
Abe Jellinek
30624c6aba Preferences: Remove extraDTD pane option
Include FTL localizations directly in your pane XHTML fragment:

    <linkset>
        <html:link rel="localization" href="make-it-red.ftl"/>
    </linkset>

Fixes #3161
2023-06-12 13:25:20 -04:00
Abe Jellinek
75df7bcbdd Item Pane: Allow "long" fields to wrap
Aligns with Z6 behavior.

Fixes #3163
2023-06-12 12:38:30 -04:00
Dan Stillman
ffd6a988e1 Await plugin bootstrap methods 2023-06-12 01:39:57 -04:00
Dan Stillman
027060ba86 Log reason when calling bootstrap methods 2023-06-07 01:58:18 -04:00
Abe Jellinek
6106e379c9 Plugins: Uninstall immediately but allow undo
When you uninstall a plugin through the UI, XPIInstall:
1. Sets the plugin's `pendingUninstall` to true
2. Calls our onUninstalling() method
3. Waits for the Add-ons window to be closed
4. Actually uninstalls the plugin
5. Calls our onUninstalled() method

If you undo the uninstallation between steps 2 and 3, the remaining steps
instead look like:
3. Sets the plugin's `pendingUninstall` to false
4. Calls our onOperationCancelled() method

This commit changes our implementation of the bootstrapped plugin lifecycle so
that the shutdown and uninstall hooks are called from onUninstalling() (step 2).
If you close the Add-ons window without undoing, nothing more happens. The
plugin remains uninstalled. If you undo before closing, though, we call the
plugin's lifestyle hooks just as if it had been newly installed (unless it was
disabled before uninstallation, in which case we call install but not startup).

This mirrors the behavior of Firefox WebExtensions and makes things work more
like you'd expect: uninstalling a plugin immediately deactivates it, and undoing
activates it again.
2023-06-06 16:14:33 -04:00
Abe Jellinek
a28b949dc1 Preferences: Attach preferences to all added nodes in tree
mutation.addedNodes only contains the top-level nodes, so we need to query for
all nodes with preference attributes in their trees.
2023-06-06 14:00:57 -04:00
Martynas Bagdonas
bb85e11a92 Fix tab selection when closing a tab nearby
Fixes #3151
2023-06-06 19:42:34 +03:00
Martynas Bagdonas
785dcb30c3 Ensure that note is created when inserting an image
Fixes #3155
2023-06-06 16:22:19 +03:00
Abe Jellinek
5e41b3ab4d Place word processor plugin installers under heading and fix spacing
Fixes #3147
2023-06-05 10:52:04 -04:00
Abe Jellinek
d077388616 Fix WebDAV settings
- Fix mistaken reference to event.target (instead of currentTarget) in sync
  function
- Move sync functions to fields for easier debugging - can't set a breakpoint
  inside an inner function in the Firefox debugger

Fixes #3142
2023-06-05 10:32:37 -04:00
Dan Stillman
ea1e28c7b7 Update translate submodule 2023-06-01 06:08:40 -04:00
Dan Stillman
77682cb45a Update LibreOffice and Word for Windows submodules 2023-06-01 05:36:29 -04:00
Dan Stillman
fd7cf71043 fx-compat: Fix Page textbox in classic citation dialog 2023-05-30 17:32:21 -04:00
Dan Stillman
086399da33 Handle multiple Fluent source files
With list specified in js-build/config.js
2023-05-29 22:46:24 -04:00
Dan Stillman
0de1305665 Tweaks to Fluent/Transifex JSON processing scripts (#3058)
- Use locale directories for JSON files, since that's where the
  Transifex client will interact with them
- Skip non-locale directories (e.g., don't create an .ftl file for
  .DS_Store)
- Other minor simplification
2023-05-29 22:46:24 -04:00
Tom Najdek
afaf0b4968 Add scripts to convert ftl to/from Transifex JSON (#3058) 2023-05-29 22:46:24 -04:00
Dan Stillman
d5a584c28b Don't close window with Cmd-W on first tab if other tabs are open
Closes #2572
2023-05-29 06:00:31 -04:00
Dan Stillman
7c902d40a9 Timer updates
- Switch to Mozilla's Timer.jsm for timer functions in XPCOM scope
- Add setInterval/clearInterval/requestIdleCallback/cancelIdleCallback
- Add all timer functions to plugins sandbox
2023-05-28 04:51:21 -04:00
Dan Stillman
f966662911 "Preferences" → "Settings" on all platforms
Firefox has switched on all platforms, Chrome and Edge on Windows use
"Settings", and we really don't want to have to say different things for
different platforms
2023-05-27 07:30:32 -04:00
Dan Stillman
773a89b0f3 Fix title of import wizard 2023-05-27 06:42:11 -04:00
Dan Stillman
77241d1c71 Fix test in collection tree selectLibrary()
getRowIndexByID() can only return an integer or false
2023-05-27 02:34:03 -04:00
Dan Stillman
fda0fda7ac Use 64-bit Windows build in add_omni_file 2023-05-27 02:32:57 -04:00
Dan Stillman
fd50a5b65e Switch to UTF-16 helper function for xul.dll binary patching 2023-05-26 06:45:23 -04:00
Dan Stillman
889a812fdc Replace "FirefoxCP" with "ZoteroCP" in subprocess names
"Isolated Web Content", "Socket Process", "Web Content", etc.

Closes #3137
2023-05-26 06:45:23 -04:00
Dan Stillman
cd20df8d74 Fix sw_vers being run repeatedly in View Output window on macOS
Fixes #3136
2023-05-26 06:45:23 -04:00
Dan Stillman
d14d281e7c Avoid warning about null bytes when checking for Git LFS checkouts 2023-05-26 02:08:17 +00:00
Dan Stillman
febcf2568e Update locales from Transifex and merge new English strings 2023-05-25 21:56:32 -04:00
Dan Stillman
3f739fc1b4 "Capitalize" → "Fix Case" for creator context menu
https://forums.zotero.org/discussion/105117/zotero-7-thank-you-for-adding-right-click-case-change-for-author-names
2023-05-25 21:56:31 -04:00
Dan Stillman
b2b768cd4b Fix fileQuitItemUnix is null error in PDF reader window 2023-05-25 21:56:31 -04:00
Abe Jellinek
4cfe682367
Remove outdated startup error messages (#3138) 2023-05-25 21:38:12 -04:00
Abe Jellinek
42572efca9 Fix error when adding link attachment with unparseable URL
https://forums.zotero.org/discussion/105158/zotero-7-beta-attach-link-to-uri-logosres-does-not-work-any-longer
2023-05-25 18:45:48 +03:00
Abe Jellinek
a4c3f5267b Fix ScienceDirect PDF downloads
ScienceDirect sometimes puts the `name` directive at the end of the Content-Type
header instead of in Content-Disposition. That isn't strictly spec-approved, but
there are other directives (`charset` and `boundary`) that can also be appended
to Content-Type per the spec. We want to strip them before looking for handlers.

https://forums.zotero.org/discussion/105194/sciencedirect-pdf-downloads-not-working-zotero-7
2023-05-25 17:57:32 +03:00
Abe Jellinek
76b7fd0dc1 Set preventDefault flag when URL is passed to CLH
Fixes #3132
2023-05-25 17:28:16 +03:00
Dan Stillman
117dbe1fe0 Clear Zotero.skipLoading after data directory tests
This was causing a startup error in the re-enabled debug output tests,
which don't reset app state.
2023-05-25 05:45:53 -04:00
Dan Stillman
6e2ec2300d Fix checking for Firefox profiles high up in filesystem
This was triggering an erroneous warning dialog about a failure to check
for Firefox profiles during Linux tests (where the profile is at
something like /tmp/tmp.l5phnqSxBH/Zotero), but it could also affect a
custom profile directory location.
2023-05-25 03:37:06 -04:00
Dan Stillman
feb12fafe8 Add Git LFS checkout checks to app build script
For people with existing repos who haven't re-run check_requirements
2023-05-25 03:24:18 -04:00
Abe Jellinek
6405997723 Use Zotero.appName in window title 2023-05-25 09:13:42 +03:00
Abe Jellinek
91fec9024c Bidi: Fix control characters appearing in reader window titles on Windows
Fix in 6d5ce578e4 only affected tabs.

Fixes #3135
2023-05-25 09:05:36 +03:00
Dan Stillman
4ca4278635 Update Word for Mac submodule 2023-05-24 17:30:14 -04:00
Abe Jellinek
794b27c1ad Test debug output logging again
Now that we run tests in Zotero with application menus.
2023-05-24 20:59:29 +03:00
Abe Jellinek
087a9859b4 Fix preference binding issues and "Include Zotero Links" checkboxes
- Set zotero-noteQuickCopy-menu's preference attribute to the correct key
- Warn about all ID-ish preference attribute values
  - zotero-noteQuickCopy-menu's preference attribute was being set to the ID of
    a now-nonexistent <preference> element. preference attribute values should
    be preference keys now, but we were only warning if the associated
    <preference> element was actually there
  - We can't warn in all cases where the preference doesn't yet exist, because
    some preferences don't have default values, and we shouldn't limit to
    preferences that don't exist, because then the warning will stop showing
    after the preference is persisted once
- When a <preference> ID is replaced by the associated key, update the
  preference attribute so future syncFromPref() and syncToPrefOnModify() calls
  will set the correct preference
- Listen to a range of events on all bound nodes, no matter their type
- Don't resolve _firstPaneLoadDeferred until actually done loading

Fixes #3131.
2023-05-24 20:46:00 +03:00
Martynas Bagdonas
26068a855c Make note editor iframe an XUL element to avoid focus anomalies
Fixes #3128
2023-05-24 17:38:15 +01:00
Dan Stillman
722287b81a Switch back to @mozilla.org/browser/clh;1 and fix tests
In Firefox 102, `-file` was being swallowed by `nsBrowserContentHandler`
in BrowserContentHandler.jsm, so ab7d916e0 overrode that by using the
same contract id for our main nsICommandLineHandler in
zotero-service.js. But `nsBrowserContentHandler` also handles `-chrome`,
which we were using in tests to pass runtests.html. There's no need to
pass in dynamically though -- we can just hard-code that and open the
window ourselves.
2023-05-24 08:21:16 -04:00
Dan Stillman
744e73bfdb Revert "fx-compat: Handle files opened via OS (#3120)"
This reverts commit ab7d916e0d.

Switching to `@mozilla.org/browser/clh;1` broke tests and possibly other
command-line things, so disable for now.
2023-05-24 06:53:23 -04:00
Dan Stillman
0b1d958a86 Fix erroneous warning if Firefox profile directory can't be found
`Zotero.File.getContentsAsync()` now uses IOUtils rather than OS.File
2023-05-24 06:53:23 -04:00
Dan Stillman
14875c962b Fix broken building on Windows from de154ab407 2023-05-24 08:29:43 +01:00
Dan Stillman
9da76eab43 Don't open second window when launching a second time 2023-05-24 02:25:20 -04:00
Dan Stillman
0734f6d55b Add commented-out line to save copy of Firefox Windows installers
For fetch_xulrunner development
2023-05-24 02:25:20 -04:00
Dan Stillman
f5433f04e6 Update searchfox link to permalink 2023-05-24 02:25:20 -04:00
Abe Jellinek
ab7d916e0d
fx-compat: Handle files opened via OS (#3120) 2023-05-24 01:37:41 -04:00
Abe Jellinek
caa1036da2 Remote translation: Don't use wantGlobalProperties
Not necessary - just use the properties we inherit from contentWindow. This
fixes the DOMParser constructor, which fails if called without a window context
from a non-system principal.

https://forums.zotero.org/discussion/105163/zotero-7-doi-translator-broken-in-scaffold
2023-05-23 22:30:24 +03:00
Abe Jellinek
fd6ea99967 Item box: Always save current item when switching items
Fixes #3125
2023-05-23 19:40:09 +03:00
Abe Jellinek
61749d39a6 Item box: Populate both fields on creator autocomplete click
Fixes #3129
2023-05-23 19:06:56 +03:00
Martynas Bagdonas
04a44cfbaa Update pdf-reader submodule 2023-05-23 12:00:17 +01:00
Dan Stillman
8440501ad2 Remove unused Zotero.isBigSurOrLater property 2023-05-23 01:55:31 -04:00
Dan Stillman
f9dab9b041 Show correct OS info in error reports 2023-05-23 01:55:31 -04:00
Dan Stillman
478dcc4f0f Add Zotero.Utilities.Internal.subprocess(command, args)
To run a short-lived command and return stdout

The Subprocess module can also start long-running process and
communicate with them, but we'll implement something different for that
if we need it.
2023-05-23 01:46:25 -04:00
Dan Stillman
522de4ad92 Add 32/64-bit info after version number in about dialog on Windows/Linux 2023-05-22 23:58:00 -04:00
Dan Stillman
de154ab407 Skip check for "Zotero" in xul.dll on macOS 2023-05-22 08:23:53 -04:00
Dan Stillman
39b8a33166 Fix Git LFS checkout check when not in repo root 2023-05-22 06:39:03 -04:00
Dan Stillman
0c3d8eeb6f Upload deployment ZIP from 'main' branch 2023-05-22 06:27:53 -04:00
Dan Stillman
66623b945e Temporary fix for context-menu options getting triggered on Windows
https://forums.zotero.org/discussion/105103/right-click-on-collections-or-items-not-functioning-properly-in-zotero-7
2023-05-22 06:16:53 -04:00
Dan Stillman
840a98ff40 Update app build scripts for branch reshuffling
`master` → `6.0`, `fx102` → `main`
2023-05-22 04:10:21 -04:00
Dan Stillman
55fe6f33f5 fx-compat: Fix XMLSerializer calls
https://forums.zotero.org/discussion/105118/zotero-7-error-upon-exporting-in-mods-format
2023-05-22 01:34:41 -04:00
Dan Stillman
9622fcccdb Show consistent paths for missing scripts in check_requirements 2023-05-22 01:25:58 -04:00
Dan Stillman
5d0c1f38ef Add check for Git LFS in check_requirements 2023-05-22 01:25:54 -04:00
Dan Stillman
08213eb8fb fx102 branch is no more 2023-05-21 18:52:26 -04:00
Dan Stillman
4eb951c977 Add 7.0 beta build script 2023-05-21 18:38:38 -04:00
Dan Stillman
879da4feef Don't include 6.0 builds in incrementals 2023-05-21 22:37:42 +00:00
Dan Stillman
c653449cc0 Increase active tabs count from 2 to 3 on <=8 GB systems
To match current Zotero 6 behavior on non-Windows systems
2023-05-20 19:12:19 -04:00
Dan Stillman
54d56f468b Update styles and translators 2023-05-20 16:10:57 -04:00
Dan Stillman
4a68c04891 fetch_xulrunner: Use local copies of Firefox on Windows if available
Allows for faster fetch_xulrunner development without repeatedly
downloading Firefox from Mozilla servers. Already possible on macOS.
2023-05-20 12:52:12 +01:00
Dan Stillman
1e78025726 Use "Zotero" directory in C:\ProgramData
Instead of using "Mozilla-1de4eec8-1241-4177-a864-e594e8d1fb38" like
Firefox and Thunderbird
2023-05-20 12:50:41 +01:00
Dan Stillman
c0bc796fce Don't try to use the Mozilla Maintenance Service on Windows
Updating via the service seems to actually work (or at least it logs
that it's going to use it and the update succeeds -- I didn't verify
that it actually uses the service), but conditionally using a Mozilla
background service only if it's installed on the system seems like a bad
idea.
2023-05-20 12:50:31 +01:00
Dan Stillman
30f6cd44d8 Use correct WinWord DLL for 64-bit Windows
And omit 64-bit DLL from 32-bit build
2023-05-20 12:46:32 +01:00
Dan Stillman
8dd1db9839 Convert POSIX paths to Windows paths for mbsdiff on Windows 2023-05-20 12:46:32 +01:00
Dan Stillman
d9f86a6293 Add 7.0 deploy scripts for 'dev' and 'test' channels 2023-05-20 07:44:01 -04:00
Dan Stillman
ee07d603b1 Simplify lastrev filename 2023-05-20 07:41:08 -04:00
Dan Stillman
2097822872 CI: Add lfs: true to actions/checkout@v3 2023-05-20 11:02:21 +00:00
Dan Stillman
90d5e1e551 Update Linux updater for Zotero 7 2023-05-20 10:51:47 +00:00
Abe Jellinek
db4a79838b Preferences: Resync menulists when their subtrees change 2023-05-19 16:54:32 +03:00
Abe Jellinek
ff43d1877e Focus preferences window if already open on Cmd-Comma 2023-05-19 16:46:24 +03:00
Dan Stillman
874a45ed1c Add quotes around path in manage_incrementals 2023-05-18 10:51:30 +01:00
Dan Stillman
dec508542d Convert Cygwin paths passed to AWS CLI
AWS CLI v2 (or possibly some other config change on our new build
system) doesn't like POSIX paths, so convert to Windows paths
2023-05-18 10:51:29 +01:00
Dan Stillman
82a00b1f7b Update signtool.exe path 2023-05-18 10:51:29 +01:00
Dan Stillman
2e50c3856e Update paths for NSIS 3
Which seems to work the same as the NSIS 2 Unicode version we were using
previously
2023-05-18 10:49:29 +01:00
Dan Stillman
8a4d305843 Fix xz_to_bzip under Cygwin 2023-05-18 05:00:38 +01:00
Dan Stillman
39fa35ae12 Restore workaround for -C in mar command 2023-05-18 04:59:37 +01:00
Dan Stillman
cc65ca032e Update Windows updater for Zotero 7 2023-05-18 04:58:35 +01:00
Abe Jellinek
eecd85a1c2 Disable window dragging inside toolbar controls
And enable in the context pane toolbar extension.
2023-05-17 16:52:50 +03:00
Dan Stillman
33ac72ebac Generate xz MARs for new updater
The old updater used MARs with bzip2-compressed files, but Mozilla switched to
xz compression, so we generate xz-based MARs using the current MAR tools and
`make_(full|incremental)_update.sh` scripts and add a script to generate
bzip2-based MARs to serve to pre-7.0 builds.
2023-05-17 04:35:40 -04:00
Dan Stillman
6261640a92 Update Mac updater for Zotero 7
We were previously using an old version of the Mozilla updater before they
added Mozilla signature verification, but it's Intel-only, so we need to build
our own version of the current updater with signature verification disabled.
2023-05-17 04:35:40 -04:00
Dan Stillman
a30e63eee1 Remove unused make_incremental_updates.py script 2023-05-17 04:35:40 -04:00
Dan Stillman
ff51aad139 Generate changelog link automatically in add_version_info 2023-05-17 04:35:40 -04:00
Dan Stillman
4695b156e0 Move add_version_info to scripts dir
Not specific to update packaging
2023-05-17 04:35:40 -04:00
Dan Stillman
19265d4e98 Don't notarize 'test' channel builds on macOS 2023-05-17 04:35:40 -04:00
Abe Jellinek
7482c2b4ec Fix "Could not map contract ID ... to CID" warning in console
This is how Mozilla does it:
https://searchfox.org/mozilla-esr102/source/uriloader/exthandler/HandlerService.manifest
2023-05-16 20:06:36 +03:00
Abe Jellinek
f299692de7 Allow window dragging from PDF reader toolbar
Fixes #2713
2023-05-16 16:23:32 +03:00
Martynas Bagdonas
b51a30ed99 Update pdf-reader submodule 2023-05-11 16:50:54 +01:00
Dan Stillman
75eeac1d41 Fix avoidance of console warning for FxAccountsCommon.js
Follow-up to 969b782fd0
2023-05-11 02:09:36 -04:00
Dan Stillman
3d7ce028e9 Change win64 to win-x64 in app build scripts 2023-05-11 05:17:52 +01:00
Dan Stillman
3ba6fbf0f7 Avoid warnings in console due to duplicated brand.ftl
zoteroPane.xhtml includes base.js via customElements.js, and base.js
inserts brand.ftl, so we don't need to include brand.ftl as a link.
2023-05-10 07:12:24 -04:00
Dan Stillman
598689c9bc Update translators and styles 2023-05-10 06:43:08 -04:00
Dan Stillman
99cec416b7 Remove old code to force use of Lucida Grande on macOS
This was already commented out for Z7, which fixes the font rendering
problem.

Closes #1740
2023-05-10 06:25:05 -04:00
Dan Stillman
05fd1601ad Update locales from Transifex
This removes some newlines due to processing changes in our script.
2023-05-10 06:25:05 -04:00
Dan Stillman
b8c9bfcc34 Update non-English Mozilla locale files
Mostly just minor whitespace changes due to changes in our processing
script
2023-05-10 06:25:05 -04:00
Dan Stillman
8cf7993af5 Add non-English updates.properties
(And update the en-US version with some strings that we don't use but
might if we updated to a slightly newer version of the updater before
they got rid of the dedicated update window)
2023-05-10 06:25:05 -04:00
Dan Stillman
6a14e8a376 Add some disabled code to extract 'updates' files from old Moz langpacks 2023-05-10 06:25:05 -04:00
Dan Stillman
27ccff636b Various fixes to locale processing script
- Properly handle regular vs. Mozilla locale files
- Avoid whitespaces changes as much as possible
- Keep copyright block at top of all Mozilla files
- Bug fixes
2023-05-10 06:25:05 -04:00
Dan Stillman
08a508b750 fx-compat: Fix collections-containing-an-item highlight 2023-05-09 17:49:18 -04:00
Abe Jellinek
fa31956d28
fx-compat: Fix feed button appearance/overflow behavior (#3114) 2023-05-09 16:38:33 -04:00
Abe Jellinek
942986c6b6 fx-compat: Use native checkboxes for Quick Copy options 2023-05-09 16:01:52 +03:00
Dan Stillman
659c131de6 Fix Win64 ZIP filename when fetching build for incremental updates 2023-05-09 07:39:28 -04:00
Dan Stillman
bbcfe50e0d Update to Firefox 102.11.0esr
Mac and Windows launchers in 725e5ac0f and 93f009e9d8 were actually from
102.11.0esr, not 102.10.0esr
2023-05-09 05:42:42 -04:00
abaevbog
fa28228acb
Automatically run fetch_xulrunner if xulrunner is missing or out of date (#3111) 2023-05-09 05:41:27 -04:00
Dan Stillman
93f009e9d8 Win: Update to Firefox 102.10.0 and don't create default-esr profile
zotero.exe.tar.xz is now stored using Git LFS, so anyone building the
app on Windows will need that installed.
2023-05-09 07:06:19 +01:00
Dan Stillman
725e5ac0f0 Mac: Update to Firefox 102.10.0 and don't create default-esr profile 2023-05-09 01:30:34 -04:00
Dan Stillman
b568585f44 Don't create default-esr profile and data directory
Set MOZ_LEGACY_PROFILES environment variable to disable
dedicated-profile support, which creates dedicated profiles for
different channels (e.g., `esr`).
2023-05-09 01:30:05 -04:00
Abe Jellinek
508cd0a64c
Hide About window in Window menu (Mac) (#3113) 2023-05-08 20:35:40 -04:00
Abe Jellinek
8c37865c07 Fix add-on install error message when file is entirely invalid
If the file wasn't an XPI at all, or it didn't contain valid metadata for fx102,
the error message would previously show "%S" where the add-on name should be.
Now we fall back to the file path.
2023-05-08 20:13:47 +03:00
Abe Jellinek
b30f97dad5 fx-compat: Allow file drop on Add-ons window
Fixes #3099
2023-05-08 20:06:47 +03:00
Abe Jellinek
ddbcc32bd8 fx-compat: Basic viewer: Add necessary FTL 2023-05-08 19:51:31 +03:00
Dan Stillman
371bcfea81 "Zotero Preferences" → "Zotero Settings" on macOS
Fixes #3105
2023-05-07 23:56:16 -04:00
Dan Stillman
87c71f74a0 Move -app-name variable to brand.ftl
So a custom build doesn't have to modify each .ftl file

`app-name` is redundant with the Firefox strings, but it's what we used
previously and is easier to remember.
2023-05-07 23:55:34 -04:00
Dan Stillman
84f74e5db0 Remove connectorTypeSchemaData.js from .eslintignore
Follow-up to 43373b77e
2023-05-07 02:43:31 -04:00
Dan Stillman
43373b77ec Remove connectorTypeSchemaData.js and update build_typeSchemaData.js
We now use zoteroTypeSchemaData.js in the connector, so update the
build script to generate that.
2023-05-06 02:01:03 -04:00
Dan Stillman
2dc08a0dfb Fix React key warning after 4c283d88c7 2023-05-05 06:48:49 -04:00
Dan Stillman
2e0f7062c3 Don't log error at startup if session.json doesn't exist 2023-05-05 06:42:31 -04:00
Dan Stillman
f21ca49d83 Fix sync engine tests after 00703c0b8 2023-05-05 06:38:00 -04:00
Dan Stillman
4974532276 Z7: Fix Mark as Read/Unread button in feeds not working
Fixes #3092, but overflow in non-English locales needs to be addressed
in #3110
2023-05-05 06:34:43 -04:00
Dan Stillman
5a75c59bf2 Z7: Style improvements in update dialog 2023-05-05 05:20:33 -04:00
Dan Stillman
fc48025629 Reindent updates.css 2023-05-05 05:15:41 -04:00
Dan Stillman
00703c0b8f Z7: Fix conflict resolution merge window styling
Closes #3090
2023-05-05 04:28:07 -04:00
Dan Stillman
969b782fd0 Avoid console warning about resource://gre/modules/FxAccountsCommon.js 2023-05-05 00:37:09 -04:00
Dan Stillman
328de1e790 Restore CI tests and update for Z7 and combined repo
Now needs to run fetch_xulrunner instead of downloading Firefox
2023-05-04 08:40:06 -04:00
Dan Stillman
4c283d88c7 Remove key hack for setting innerHTML in item tree
Results in a segfault during tests due to a null pointer deference
2023-05-04 08:40:06 -04:00
Dan Stillman
7ee5dd564c Add comment for upgrade logic change 2023-05-04 08:40:06 -04:00
Martynas Bagdonas
c62b95a9a2 Update pdf-reader submodule 2023-05-04 07:22:23 +01:00
Dan Stillman
15674daeae Update Linux build to Firefox 102.10.0esr 2023-05-03 01:44:48 -04:00
Dan Stillman
febc2fcc7d fx-compat: Wait until request completion in WebProgressFinishListener
`nsIWebProgressListener.onStateChange()` gets called twice at the end of
requests, once with `stateFlags` set to `327696` and once with it set to
`262160`, which corresponds to `STATE_STOP + STATE_IS_NETWORK +
STATE_IS_REQUEST` and `STATE_STOP + STATE_IS_NETWORK`. httpd.js debug
logging shows that the connection is closed between the two calls. In
WebProgressFinishListener, we were previously calling `onFinish` after
the first one, but in Zotero 7, at least on Linux (or maybe just on
slower machines due to a race condition), the file from `saveURI()`
doesn't appear to be reliably written after the first call, causing
`Attachments.downloadFile()` to fail in `_enforcePDF()` due to an empty
file.

This changes WebProgressFinishListener to wait until the second
`STATE_STOP` call. We'll have to confirm whether this is the
state-change pattern for all requests, but it fixes our Find Available
PDF tests in CI.
2023-05-01 02:52:37 -04:00
Dan Stillman
e6776fd922 Skip 32-bit Linux build in CI or tests 2023-04-30 06:10:14 -04:00
Dan Stillman
2dc5eecfac Avoid URLDecorationAnnotationsService errors on every network request 2023-04-30 05:25:50 -04:00
Dan Stillman
296c0142f2 fx-compat: OS.File.read() → IOUtils.read() in getContentsAsync()
https://firefox-source-docs.mozilla.org/dom/ioutils_migration.html

This also fixes a bug when `getContentsAsync()` is passed an
`nsIInputStream` or `nsIChannel` where raw bytes were returned instead
of a string. Not sure if we're doing that anywhere. If we are, this
would presumably break that code, but the function is supposed to return
a decoded string.
2023-04-30 05:23:41 -04:00
Dan Stillman
2f6f2feade for…in → for…of in sniffForMIMEType() 2023-04-29 18:50:39 -04:00
Dan Stillman
0858960d33 Better logging for request count mismatches in Find Available PDF tests 2023-04-29 17:50:49 -04:00
Dan Stillman
b80b19d3da Update version in package.json
(Makes no difference, but echoed in test output)
2023-04-29 17:39:08 -04:00
Dan Stillman
4ec357bb26 Use pdf-worker to extract text for item.attachmentContent if no cache 2023-04-29 17:38:14 -04:00
Dan Stillman
adf2d92471 Cleaner error if prepare_build fails due to missing 'build' dir 2023-04-29 16:28:50 -04:00
Dan Stillman
c326a6c971 Fix more files for combined repos 2023-04-29 07:50:54 -04:00
Dan Stillman
79ef3e3571 Fix path to staging Zotero in test runner on Linux 2023-04-29 07:22:02 -04:00
Dan Stillman
78cc8cc8c9 Don't open Error Console when running tests in CI 2023-04-29 07:14:51 -04:00
Dan Stillman
3905f9d5b3 Move fetch_xulrunner and fetch_mar_tools into app/scripts 2023-04-29 07:14:51 -04:00
Dan Stillman
9a5275b92a Stop bundling the PDF tools 2023-04-29 07:14:51 -04:00
Dan Stillman
a497f501e9 Update pdf-worker and update full-text test
Strip '\f' at end of extracted text and ignore '\n' in the middle of
text from the test PDF
2023-04-29 04:56:28 -04:00
Dan Stillman
26dade03f2 Z7: Fix ZoteroPane tests 2023-04-29 04:27:48 -04:00
Dan Stillman
8fc94a5560 Z7: Fix loadPrefPane() test support function 2023-04-29 04:21:09 -04:00
Dan Stillman
7e6af7f541 Remove executable version output in test runner
Now that we're using our own build, we output it in other places
2023-04-29 04:20:33 -04:00
Dan Stillman
e46ae13a5a Remove resizabledialog.xml binding 2023-04-29 03:15:39 -04:00
Dan Stillman
95455dbd83 Fix tagsbox tests after shadow root removal 2023-04-29 03:15:15 -04:00
Dan Stillman
4a77bc4be0 fx-compat: Update conflict resolution merge window (#3090)
Tests passing, but not yet styled properly
2023-04-29 03:13:53 -04:00
Dan Stillman
dbefdaac2c Update snapshot tests for new SingleFile markup 2023-04-28 02:18:52 -04:00
Dan Stillman
46d0ce3cbf Don't load example.com in /saveSnapshot tests 2023-04-28 02:18:19 -04:00
Dan Stillman
fa143f1ea4 Z7: Update retractions tests 2023-04-28 01:54:00 -04:00
Dan Stillman
5f631ff0af Add delay() test support function
`Zotero.Promise.delay()` wrapper
2023-04-28 01:54:00 -04:00
Dan Stillman
ed224dce34 Z7: Update relatedbox tests 2023-04-28 01:54:00 -04:00
Dan Stillman
82b4943d13 Z7: Update note editor tests 2023-04-28 01:54:00 -04:00
Dan Stillman
07acfb444a Z7: Fix Add Item by Identifier tests (and rename textbox)
Now only one textbox, so no need to call it 'multiline'
2023-04-28 01:54:00 -04:00
Dan Stillman
2c995c913e Z7: Update items test for andJoiner delimiters 2023-04-28 01:54:00 -04:00
Dan Stillman
b6522ae3f5 Z7: Update item pane teets 2023-04-28 01:54:00 -04:00
Dan Stillman
787002bf7d Update caniuse 2023-04-28 01:53:56 -04:00
Dan Stillman
43ba4c3620 Don't check for .zotero-ft-info in test
No longer created
2023-04-27 03:48:49 -04:00
Dan Stillman
f95a6d0f0a Rename Zotero.Fulltext tests to Zotero.FullText 2023-04-27 03:48:01 -04:00
Dan Stillman
3ba78e28bb Update connectorTypeSchemaData and test data for Dataset Number removal 2023-04-27 03:44:25 -04:00
Dan Stillman
42f87597cf Add missing debug line for notifier registration 2023-04-27 03:39:25 -04:00
Dan Stillman
59ca0731b8 Fix note editor not being properly unregistered from notifier 2023-04-27 03:37:31 -04:00
Dan Stillman
2e081ce8d2 Fix RemoteTranslate test after b222bbcccb
And remove duplicate test
2023-04-27 01:05:02 -04:00
Dan Stillman
57a60c1946 Update runtests.sh for combined repos 2023-04-27 01:05:02 -04:00
Dan Stillman
b6b6bbc3ee Load integration manifest files only on correct platform 2023-04-27 01:05:02 -04:00
Dan Stillman
a34a11b200 Remove a couple mozilla.org update URLs
Fixes #3097
2023-04-27 01:04:55 -04:00
Dan Stillman
2bc4c38f01 Remove obsolete app.update prefs 2023-04-27 00:31:33 -04:00
Dan Stillman
395d0c231b Update Word for Mac submodule 2023-04-26 16:10:10 -04:00
Tom Najdek
a8c30362a1
Remove shadow root from PublicationsLicenseInfo #3082
* Fix legacy css path
 * Rename license-info.scss -> publicationsLicenseInfo.scss to match element name
2023-04-26 15:23:49 +02:00
Tom Najdek
842f474939
Remove shadow root from StyleConfigurator #3082
Also renamed style-configurator.scss -> styleConfigurator.scss
2023-04-26 15:23:49 +02:00
Dan Stillman
947fa2b558 Ignore numeric values for Type: lines in Extra
https://forums.zotero.org/discussion/comment/433334/#Comment_433334
2023-04-26 04:55:43 -04:00
Dan Stillman
eaef035062 Update non-en-US updates.dtd based on en-US file
Now that the localizer has been updated to handle Mozilla
.dtd/.properties files
2023-04-26 04:40:22 -04:00
Dan Stillman
144dbf8af0 Add Mozilla updates.dtd for non-English locales
From some 2017-era langpacks I had downloaded. These strings aren't in
current langpacks, which use a different update mechanism, but we're
bundling a modified version of updates.xhtml from Firefox.
2023-04-26 04:40:22 -04:00
Dan Stillman
6000d605f1 Update localizer scripts
- Adjust for combined repos
- Handle Mozilla .dtd/.properties files
- General cleanup
2023-04-26 04:40:22 -04:00
Dan Stillman
15151acb3e Add Mozilla locale strings for Breton 2023-04-26 04:40:22 -04:00
Dan Stillman
3d0896f1b6 Update menubar.ftl and textActions.ftl from current Mozilla langpacks 2023-04-26 04:40:22 -04:00
Dan Stillman
9236d65215 Add Mozilla wizard.ftl 2023-04-26 04:40:22 -04:00
Dan Stillman
a542db8e50 Skip en-US folder when copying en-US Mozilla files to other locales 2023-04-26 04:40:22 -04:00
Dan Stillman
3693674fc9 Fix Fluent localization for non-English locales
All declared Fluent files need to exist for a locale to be used (in a
window?). Since Mozilla code tries to load Fluent files, we need to copy
non-English Mozilla .ftl files to their default effective path (just in
the app omni.ja instead of the toolkit omni.ja).

Fixes #3094
2023-04-26 04:40:22 -04:00
Dan Stillman
c55ef8714b Update app build scripts for new combined repo
Also:

- Replace `install.rdf` with `version` file
- Remove lots of obsolete logic in `prepare_build` (formerly
  `build_xpi`)
2023-04-26 04:40:22 -04:00
Dan Stillman
1ab041ef55 Move build_xpi to app/scripts as prepare_build 2023-04-26 04:40:22 -04:00
Dan Stillman
257a2280c1 Use repo root in update-citeproc.sh 2023-04-26 04:40:22 -04:00
Dan Stillman
7ae79bbb98 egh's translator framework no longer needs to be unminified
Translators haven't been bundled with a Firefox extension since 2017, so
no need to unminify for review.
2023-04-26 04:40:22 -04:00
Dan Stillman
f5fcc9ee7b "Zotero wiki" → "Zotero documentation" in app build README 2023-04-26 04:40:22 -04:00
Dan Stillman
fb2b874614 Add zotero-build repo as scripts folder
Minus obsolete 4.0 files
2023-04-26 04:40:22 -04:00
Dan Stillman
a3d7b58b83 Add zotero-standalone-build repo as app folder
Minus obsolete 4.0 files
2023-04-26 04:40:22 -04:00
Dan Stillman
ae0091fbae Rename scripts folder to js-build 2023-04-26 04:40:22 -04:00
Abe Jellinek
c07eccb468 Scaffold: Improve perceived translation speed
When translators do a lot of logging.

https://github.com/zotero/translators/pull/3022#issuecomment-1517291971
2023-04-21 13:38:42 -04:00
Dan Stillman
fb2d35c765 Better logging for changes to deleted property 2023-04-21 06:51:41 -04:00
Dan Stillman
4a30dd2e4f Fix potential sync error after Replace Online Library in group
https://forums.zotero.org/discussion/104431/syncing-problem

Replace Online Library can upload annotations created by others in a
group library, so if the upload resulted in a local write, "Cannot edit
item in library" was thrown, since annotations by others aren't
writable. This should've only been a problem if the uploaded data was
actually modified by the server, but we were also checking whether
objects were editable before checking if they had actually changed, so
it would happen for any upload of another person's annotation.

This fixes the order of checks when saving objects and makes an
edit-check exception for saving uploaded data for group annotations.
2023-04-21 06:51:25 -04:00
Abe Jellinek
c7d30ebde4
Allow disabling JavaScript in basic viewer (#3089)
And:
- Prevent JavaScript inside notes from executing in reports
- Update calls to openInViewer() to pass an options object
2023-04-20 15:50:57 -04:00
Dan Stillman
78a81f321a Update utilities and translate submodules 2023-04-20 05:48:10 -04:00
Dan Stillman
6217cc9e89 Update connectorTypeSchemaData and test data for Dataset Number removal 2023-04-20 05:47:22 -04:00
Dan Stillman
1ec37ebcbf Fix redundant Number on Dataset item type 2023-04-20 03:21:33 -04:00
Dan Stillman
f57c462b85 fx-compat: Don't use number as OS.Path.join() argument
It's dropped silently from the path in Fx102.
2023-04-19 17:41:11 -04:00
Dan Stillman
8e46e2a4c1 Remove obsolete install.rdf from zotero-unit 2023-04-19 17:27:06 -04:00
Dan Stillman
7774cb7ffb Update citeproc-js to 1.4.63
73bc1b44bc
2023-04-19 17:27:06 -04:00
Adomas Venčkauskas
a9937740c5 Fix classic citation dialog collection tree not working (regression b213b8f1)
Report https://forums.zotero.org/discussion/104460/zotero-6-0-24-classic-add-citation-dialog-doesnt-show-collections-content
2023-04-19 15:26:24 +03:00
Abe Jellinek
83527d27fb Preferences: Fix site settings delete button being disabled after click 2023-04-18 14:10:24 -04:00
Adomas Venčkauskas
50e780ad57 Fix broken citation dialog (regression 01b9a3c2) 2023-04-18 14:51:16 +03:00
Abe Jellinek
a47a17852e Fix feed item drag test's after() callback 2023-04-17 16:28:10 -04:00
Abe Jellinek
b222bbcccb fx-compat: RemoteTranslate improvements
- Support removeHandler()
- Return DB items from translate() when called with libraryID
- Don't invoke done until attachments are done

Fixes #3084 ("after all" hook still times out, but that happens even if the test
is disabled)
2023-04-17 16:20:54 -04:00
Adomas Venčkauskas
096a3c5f2f Add a test for feed update scroll issues. See fd744fb52 2023-04-17 12:30:31 +03:00
Dan Stillman
348083d287 Refresh Feeds row when feed unread count is updated
Regression from fd744fb526
2023-04-15 05:51:38 -04:00
Dan Stillman
2397940292 Use httpd.js instead of resource:// URL for feed item drag test
Since HiddenBrowser doesn't work on resource:// URLs (at least without
modifications, and it wouldn't be representative)
2023-04-15 05:07:47 -04:00
Dan Stillman
44f283c4a2 Update translate module
Missing from #2784
2023-04-15 03:38:08 -04:00
Dan Stillman
40fd9e8759 Fix test for opening the Cite prefpane when clicking Manage Styles… 2023-04-15 03:35:17 -04:00
Dan Stillman
085a271b6c Update test prefs
Remove Firefox prefs and skip word processor integration installation,
which no longer depends on extensions being bundled.
2023-04-15 01:21:45 -04:00
Dan Stillman
2796e6c80a Fix attachment tests that depend on HTML indexing
HTML files are now indexed instead of read directly, and indexing was
previous skipped in tests and otherwise performed on a delay, so set a
flag in the affected tests that triggers inline indexing.
2023-04-15 00:24:35 -04:00
Dan Stillman
d1ae009f57 Fix HTML indexing when using linkFromDocument() 2023-04-15 00:24:13 -04:00
Dan Stillman
b99e581929 Fix advanced-search tests 2023-04-15 00:24:02 -04:00
Dan Stillman
c81391b5b6 Fix Collection condition in Advanced Search (regression from 6b819e259c)
The shadow root here is from xul:menulist, not one of our CEs.
2023-04-14 16:00:26 -04:00
Dan Stillman
033733122a
Merge pull request #2784 from AbeJellinek/fx-compat-loadDocument
fx-compat: Implement Scaffold functions, SingleFile, PDF redirects, and style installation
2023-04-14 15:07:26 -04:00
Abe Jellinek
893ad2bf62 fx-compat: Fix PDF and style interception 2023-04-14 11:44:52 -04:00
Abe Jellinek
0612a9e6f5 fx-compat: Run translation and SingleFile in [hidden] browser
And replace loadDocuments().
2023-04-14 11:44:44 -04:00
Abe Jellinek
b2947aede0 fx-compat: Fix attaching CookieSandbox to a browser 2023-04-14 11:44:02 -04:00
Abe Jellinek
667058204d fx-compat: HiddenBrowser: Fix destroy() and URI/path check 2023-04-14 11:44:02 -04:00
Abe Jellinek
4b99b2715d fx-compat: HiddenBrowser: Add more options
- Make docShell properties configurable
- Allow requiring a successful HTTP status code
2023-04-14 11:43:48 -04:00
Adomas Venčkauskas
fd744fb526 Fix feed update refreshing, scrolling item and collection trees
Closes #2950
2023-04-14 15:23:01 +03:00
Dan Stillman
49b7e43c81 Zotero → { -app-name } for some localized strings 2023-04-14 07:03:31 -04:00
Dan Stillman
d701b8db11 CI: Stop using --legacy-peer-deps
No longer necessary after react-virtualized update (#3055)
2023-04-13 00:56:58 -04:00
Dan Stillman
9a68867d42 Update react-virtualized to 9.22.4
Fixes #3055 for now
2023-04-13 00:54:23 -04:00
Abe Jellinek
01b9a3c268
fx-compat: Fix <tab> keyboard nav, move CE imports to single file (#2756)
Having a single customElements.js file that we import everywhere we need it
helps with organization, and it gives us a single place to put things like the
<tab> fix.

We could switch to using setElementCreationCallback() like Firefox if the number
of imports gets out of hand, but the overhead right now should be small.
2023-04-12 23:09:40 -04:00
Dan Stillman
33ef7b1641 Prevent setting search .name to empty value
Prevents bug in zotero-citation plugin (at least on macOS) from creating
a search that breaks syncing

We were already checking for a missing name in `saveTx()`, but the
plugin is saving the same search twice in rapid succession, the second
time without a name, and the second attempt clears the search object's
name value after the first save's `_initSave()` check and before its SQL
write. The second save fails, but the first save goes through without a
name, resulting in a sync error.

https://forums.zotero.org/discussion/104274/id-1702002152-cannot-sync
https://github.com/MuiseDestiny/zotero-citation/issues/31
2023-04-12 22:23:13 -04:00
Dan Stillman
cadfca7475 Set a default annotation color if not assigned
https://forums.zotero.org/discussion/104249/sync-issue-on-ipados
2023-04-12 22:23:13 -04:00
Abe Jellinek
b33d3ec799
Basic viewer: Open separate windows per URI (#3081) 2023-04-12 16:53:28 -04:00
Dan Stillman
8e6f33f045 Re-enable hardware acceleration
For all the people who turned it off to fix rendering problems in the
PDF reader due to Fx60
2023-04-12 06:14:50 -04:00
Martynas Bagdonas
6440a23f96 Fix PDF.js build script in pdf-reader 2023-04-12 11:51:27 +03:00
Martynas Bagdonas
e6e424836d Update PDF.js in PDF reader 2023-04-12 11:15:46 +03:00
Martynas Bagdonas
5880d62000 Fix citation dialog opening from note editor 2023-04-12 11:14:56 +03:00
Abe Jellinek
e747c089fc fx-compat: Basic viewer: Fix menus
- Add strings and items to previously empty and untitled Edit and Window menus
- Add basic context menu to the browser
2023-04-10 16:47:08 -04:00
Abe Jellinek
72ec5c64d9 fx-compat: Fix printing from basic viewer
Fixes #3071
2023-04-10 16:09:06 -04:00
Abe Jellinek
48f7830558 fx-compat: Load zotero://report/ channels as chrome
It seems that the issue wasn't that zotero:// URLs can't be loaded in a content
browser, but rather that the report extension was returning a channel that the
content browser couldn't access. For some reason, it handled that failure by
passing the URL off to the OS, which then opened a duplicate instance of Zotero.

Also:

- Remove ensureBrowserType() and always use <browser type="content"> in
  basicViewer (see b8966f)
- Fix system principal being used to load extensions without `loadAsChrome` set
  to true if an extension with `loadAsChrome` set to true had been loaded in the
  past
2023-04-10 16:01:09 -04:00
Abe Jellinek
6a85dd2c5e
fx-compat: Lay out preferences window with flexbox (#3073) 2023-04-10 15:37:50 -04:00
Abe Jellinek
80c2f233d4 fx-compat: Fix WebDAV settings layout
Fixes #3069
2023-04-10 14:39:17 -04:00
Dan Stillman
1db153b66b Space out pref sections 2023-04-10 06:43:41 -04:00
Dan Stillman
593b4fd515 Move Config Editor button to bottom of Advanced prefpane 2023-04-10 06:43:15 -04:00
Dan Stillman
8b2362a84e Update locales from Transifex and merge new English strings 2023-04-10 06:09:04 -04:00
Dan Stillman
6372d3c01b Point to our textActions.ftl in editMenuOverlay.js
This doesn't help with zotero/zotero-standalone-build#113, though.
2023-04-10 05:59:41 -04:00
Dan Stillman
db856014aa Remove obsolete extensions-pane overlay 2023-04-10 05:59:41 -04:00
Abe Jellinek
fdcb12df92
Tab bar: Make bottom border span the whole window (#3066) 2023-04-08 18:19:46 -04:00
Dan Stillman
16ef1c476e
Merge pull request #3067 from tnajdek/2925-direct-login-fx-102
Port Mendeley Import fixes & improvements from master branch
2023-04-08 18:03:18 -04:00
Dan Stillman
d420ab34eb Mendeley importer: Add native=true to checkbox 2023-04-08 17:17:14 -04:00
Abe Jellinek
6d5ce578e4 Bidi: Fix control characters appearing in the window title on Windows 2023-04-07 13:50:15 -04:00
Dan Stillman
d22e6cde6b CI: Use npm i --legacy-peer-deps instead of --force
Just to be a little more precise and match the build instructions
2023-04-07 03:19:48 -04:00
Dan Stillman
8ce059bb46 Update GitHub Actions action versions 2023-04-07 01:32:26 -04:00
Dan Stillman
79fa3c7b0f Remove obsolete parameter to WebSocket constructor 2023-04-07 01:32:19 -04:00
Tom Najdek
5e2507041d
Remove unused import, nicer plurals, lint 2023-04-06 17:10:13 +02:00
Tom Najdek
a6042d3958
Mendeley importer: Fix issue with empty tags (#3018)
Also adds a test for this particular case and for importing tags in
general.
2023-04-06 17:10:13 +02:00
Tom Najdek
96022847d7
Mendeley importer: Fix issue with empty creators (#3016)
It does not appear to be possible to create a creator with no values in
Mendeley, however we got reports of these causing the imports to fail.
This tweak makes the importer more resilient by discarding empty/invalid
creators.
2023-04-06 17:10:13 +02:00
Dan Stillman
a6a69605c6
Mendeley citation relinking tweaks
- Show "More information" link next to relink option
- Automatically check relink option when coming from integration prompt
- Change done message to "[x] items were relinked" instead of "0 items
  were imported"
2023-04-06 17:10:13 +02:00
Adomas Venčkauskas
e10fc538d0
Add a prompt to import Mendeley DB if mendeley citation found in doc 2023-04-06 17:10:13 +02:00
Adomas Venčkauskas
9b938f2236
Add a nicer interface for prompts 2023-04-06 17:10:13 +02:00
Tom Najdek
197d8d1f3b
Add option to Mendeley importer to relink items
New option only appears if importer version is < 1 or not present.
It will:
    * Skip fetching collections and attachments
    * Skip any new items
    * Update relations on existing items
2023-04-06 17:10:12 +02:00
Dan Stillman
80bdf51ecb
Store Mendeley importer version number in database 2023-04-06 17:10:12 +02:00
Tom Najdek
1923085068
Block Mendeley import if ZotFile installed 2023-04-06 17:10:12 +02:00
Tom Najdek
4b523555d6
Mendeley Import: Auth using direct login
* Importer will now ask user for a login and password via form and will
  perform sign-in directly using credentials rather than oauth
* Signing in this way enables importer to obtain desktop document ID
  which is now stored for each item
* It's possible to switch back to the old method (ouath) by setting
  `import.mendeleyUseOAuth` pref to `true`.
* New option to only import new items. This options only appears if
  database contains previously imported items.
* Importer will now update mendeleyDB:documentUUID on existing items to
  match value used in Mendeley Desktop if available
* Importer will no longer create collections when no new items are
  imported * Importer will only report number of new items imported on
  re-import * Importer will now preserve dateAdded on re-import

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2023-04-06 17:10:12 +02:00
Adomas Venčkauskas
05e9523cba fx102: Fix linux styling. Closes #3052 2023-04-06 09:46:27 +03:00
Abe Jellinek
4060acae41
fx-compat: Item box: Use custom text field styles on Windows (#3060) 2023-04-06 02:04:13 -04:00
Abe Jellinek
8e04c077ca
Don't add border to the top/sides of the toolbar on Windows (#3061) 2023-04-06 01:04:00 -04:00
Abe Jellinek
db74640993 fx-compat: Make Tools -> Error Console work
Fixes #3059
2023-04-05 14:13:37 -04:00
Abe Jellinek
5d44089214 fx-compat: Fix some CE style conflicts
- Windows global styles make .header bold, so we'll override them
- Prefix IDs in <notes-box>
- Give <tags-box> Add button a normal margin
  - I think the CSS this removes was meant to apply to tags in the list, not the
    Add button, but that's handled elsewhere now
2023-04-05 12:39:32 -04:00
Martynas Bagdonas
fcf3cec0fc Don't show HTML and Markdown options for collection export
Fixes #3033
2023-04-05 09:30:38 +02:00
Abe Jellinek
4af158bf56 fx-compat: Item box: More padding tweaks
- Add same padding to item type menu as we have on field value labels
- Make comma flush with last name and slightly closer to first name
2023-04-04 15:08:07 -04:00
Abe Jellinek
f694f87d49 fx-compat: Update item pane tests 2023-04-04 14:52:10 -04:00
Abe Jellinek
da80ae1f89 fx-compat: Item box: Re-add padding on value labels 2023-04-04 14:40:03 -04:00
Abe Jellinek
aea1303119 fx-compat: Item box: Fix field sizing on all platforms
Layout should no longer shift when editing creators or fields.
(Linux untested.)
2023-04-04 14:39:57 -04:00
Abe Jellinek
16411422c8 fx-compat: Item box: Set control attribute on label
For accessibility.
2023-04-04 14:39:50 -04:00
Abe Jellinek
94c5717052 fx-compat: Add missing element selectors to platform SCSS
Follow-up to 6b819e259c: fixes element-specific
selectors mistakenly being applied globally, and some selectors not having the
intended effect because of lower specificity.
2023-04-03 16:38:31 -04:00
Abe Jellinek
d9b16c15f7 fx-compat: <split-menu-button>: Use margin instead of absolute height
And add space to the right of the button text. Should look right on Linux now.

Fixes #3041
2023-04-03 12:01:25 -04:00
Dan Stillman
ab2e163234 Update test sample data for authority/legislativeBody base mapping 2023-04-03 00:41:35 -04:00
Dan Stillman
2131a1e4ee Update global schema and utilities 2023-04-02 19:10:55 -04:00
Dan Stillman
68a6441b16 Continue generating citeProcJSExport test data
Since it's needed by zotero/utilities
2023-04-02 19:05:53 -04:00
Dan Stillman
3530545eb9 Remove base-only localized strings from searchConditions
Now all included in `itemFields.`

We still use base-only fields as search conditions, and schema.json
consumers might want to do so as well, so it makes sense to include
them.
2023-04-01 22:04:50 -04:00
Dan Stillman
430118f071 Write out path when generating item type/field data for tests
It writes to the build folder, so it's easy to think it's not working.
2023-04-01 16:34:43 -04:00
Dan Stillman
e27c1b5335 Add Dataset and Standard item types
zotero/zotero-bits#22
zotero/zotero-bits#52
2023-04-01 16:34:43 -04:00
Dan Stillman
6ac13e3281 Limit Everything full-text-word subsearch to current library
This fixes an error using Everything if another library hasn't yet been
loaded and should speed up Everything searches for people with multiple
libraries.

This is sort of an awkward fix, because it doesn't fix the underlying
problem of `addCondition('libraryID', ...)` not working the same as
`.libraryID =` for some search conditions that perform subsearches. But
supporting `addCondition('libraryID', ...)` for those would get
complicated, because there could technically be multiple such
conditions, and applying those to a subsearch that used `AND` would get
messy. So let's just fix the problem at hand.

Fixes #3032
2023-04-01 04:55:05 -04:00
Dan Stillman
1aa82094f1 Better way of skipping migration of Place and Date from Extra
Or at least a way that we already have built-in and that only applies to
the call in `Zotero.Item::migrateExtraFields()`. This doesn't
distinguish between CSL fields (`publisher-place`, `event-place`,
`issued`) and actual Zotero field, and we really only need to skip
the former, but it's fine.

Follow-up to e3cfeee81, related to #3030
2023-04-01 04:52:30 -04:00
Dan Stillman
e3cfeee813 Temporarily disable extracting Issued from Extra
Until we can parse ranges in the Date field. See #3030.

citeproc-js will still use it (which is the point).
2023-04-01 04:52:14 -04:00
Adomas Ven
d6a9b43515 Sorts first-author last name matches first when year present. (#3025)
Closes #3024
2023-04-01 04:52:04 -04:00
Dan Stillman
94f5f7a3c4 Update package-lock.json 2023-04-01 04:47:36 -04:00
Dan Stillman
8e13fc0e2a Use npm i --force for react-virtualized 2023-04-01 04:15:10 -04:00
Dan Stillman
c580d7fc5e CI: Add --openssl-legacy-provider for Webpack 2023-04-01 04:15:10 -04:00
Dan Stillman
ac93a30933 Update pdf-worker submodule 2023-04-01 04:10:34 -04:00
Dan Stillman
2e6fe3ddf1 CI: Update Node version to 18 2023-04-01 02:01:25 -04:00
Adomas Ven
6b819e259c
fx102: Cleans up scss files, removes shadow DOM use from CEs (#3051)
Removes a huge amount of excessive files and duplication for CE scss.
All CE css is now output in the single
zotero-react-client.css file.

Moving all CE styling into a single stylesheet required removing their
shadow DOMs. It is desirable anyway, since you want to
be able to style CEs from "outside", when embedding in different
contexts.

Shadow removal required some CE code changes to maintain
functionality.

Elements refactored:
- attachment-box (displayed when an attachment (like PDF) is selected in
the item tree)
- color-picker (in the tag color selector)
- guidance-panel (displayed on first run when editing authors for a book
section)
- item-box (info tab in the item pane)
- note-editor
- notes-box (note tab in the item pane)
- quick-search-textbox
- related-box (related tab in the item pane)
- tags-box (tags tab in the item pane)
- zoterosearch (advanced search condition builder form)
2023-04-01 01:37:55 -04:00
Martynas Bagdonas
bd9a40562f Replace pdftotext and pdfinfo with pdf-worker 2023-03-31 12:48:05 +01:00
Adomas Venčkauskas
3a0731a024 Merge branch 'fx-compat-monkey-patch-toolbarbutton' into fx102 2023-03-29 15:05:37 +03:00
Abe Jellinek
988a443974 Fix the toolbarbutton dropmarker style 2023-03-29 15:03:07 +03:00
Abe Jellinek
88ce834385 Monkey-patch toolbarbutton CE to display a native menu on macOS 2023-03-29 15:02:55 +03:00
Tom Najdek
3eeac6f8b0
Fix double <browser> regression in basicViewer #3039 2023-03-28 13:01:15 +02:00
Dan Stillman
1af3142c52 Update translators, styles, CSL locales, and global schema 2023-03-28 04:25:22 -04:00
Tom Najdek
d0e177055d
Remove multimatch from the build process #2862 (#3047) 2023-03-27 16:22:44 -04:00
Abe Jellinek
fe89ad5a51 ProgressWindow: Fix incorrect sizing
Setting a height/max-height was causing the window not to grow correctly when
rows were added. Whatever the purpose of those styles was in past FF versions,
they're no longer necessary now.
2023-03-27 14:15:05 -04:00
Dan Stillman
8469a2485b
Merge pull request #2862 from tnajdek/2252-bulk-folder-import-no-react-wizards-squashed
fx-compat: Wizards. Add folder import
2023-03-27 01:20:44 -04:00
Abe Jellinek
ca2b84af8f
fx-compat: Disable macKeyset completely on non-Mac (#3044) 2023-03-25 04:06:48 -04:00
Abe Jellinek
2b3ee82d56 fx-compat: <split-menu-button>: Use margin-inline-end 2023-03-24 14:34:13 -04:00
Abe Jellinek
c30a648edf fx-compat: <split-menu-button>: Add divider 2023-03-24 14:31:26 -04:00
Abe Jellinek
5b08eec813 fx-compat: Don't run <split-menu-button> command handler when popup is opened 2023-03-23 14:15:14 -04:00
Abe Jellinek
8f87a74398 fx-compat: Fix showNativeElementPopup() positioning on Win/Linux 2023-03-23 14:14:29 -04:00
Abe Jellinek
8512402eca fx-compat: Fix Reset Sync subpane
cfbfcf2 changed restore{To,From}Server to restore{To,From}OnlineLibrary and
updated most of the references, but not the ones in preferences_sync_reset.
Other languages still have those strings under the old key names.
2023-03-23 10:18:46 -04:00
Tom Najdek
01611cbb07
Temporarily disable folder import #2862 2023-03-23 14:16:51 +01:00
Tom Najdek
fc572ba2a6
fx-compat: Convert Publications dialog to CE 2023-03-23 14:16:51 +01:00
Tom Najdek
c65e8f1621
fx-compat: Convert rtfScan to use CE wizards
Also:
* Adds Style Configurator CE
* Extends "base" CE to enable fluent l10n
2023-03-23 14:16:51 +01:00
Tom Najdek
5ea43bd65c
fx-compat: Convert import wizard to use CE 2023-03-21 20:42:43 +01:00
Tom Najdek
2820add3d1
Add bulk folder import #2252 2023-03-21 20:38:39 +01:00
Dan Stillman
6117221cbc fx-compat: Remove DOMParser init() calls
No longer supported. Still possible to pass to the constructor, but
almost certainly not necessary:

https://udn.realityripple.com/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIDOMParser#Principals_document_and_base_URI
2023-03-20 16:32:40 -04:00
Tom Najdek
13cc393840
fx-compat: long tag fixer (#2649)
* Manual tag splitting from tag selector
* Only apply split to the tag in current library
* Preserve tag type
2023-03-16 21:20:11 -04:00
Abe Jellinek
b1595cdd1d Scaffold: Support the detectedItemType test field (#3023) 2023-03-14 10:21:10 -04:00
Dan Stillman
0ba81a1a92 Fix no such column: IA.authorName error from early 6.0 beta upgrade
Fixes #3013
2023-03-09 01:28:44 -05:00
Dan Stillman
c675150305 fx102: Update quit keybindings
- Add 'x' accesskey for "Exit" on Windows
- Show "Quit" instead of "Exit" on Linux
- Don't show Ctrl-Q for shortcut key on Windows

But Ctrl-Q still works on Windows when it shouldn't because of the Mac
keybinding, which still gets registered even if disabled
programmatically in platformKeys.js.

fx102 follow-up to #3010
2023-03-09 01:26:44 -05:00
Adomas Venčkauskas
b4d534c02d Use referrer from connector when saving snapshots
Closes #3006
2023-03-09 00:37:25 -05:00
Dan Stillman
c048460c22 Match duplicates with same last name but different field modes
https://forums.zotero.org/discussion/103307/duplicates-not-being-recognised-as-duplicates
2023-02-28 00:45:03 -05:00
Abe Jellinek
0627ee0cb6
fx-compat: Fix adding/editing feeds (#2632) 2023-02-26 05:34:21 -05:00
Abe Jellinek
53ace4876e fx-compat: Fix feed Add To button
And make accessible by keyboard
2023-02-26 05:00:31 -05:00
Abe Jellinek
730677a918 fx-compat: Fix ProgressWindow 2023-02-26 05:00:31 -05:00
Dan Stillman
95f2e40434 Use clearer variable in item box
https://groups.google.com/g/zotero-dev/c/TvOfXVxwwkA/m/SdpU1QD7AAAJ
2023-02-25 01:40:10 -05:00
Abe Jellinek
fd85411e26
Preserve capitalization in Zotero.HTTP.request() headers (#3002) 2023-02-24 02:15:07 -05:00
Dan Stillman
e18624e4b5 Fix startup error if DB corrupt and no backup files
Fixes #2996
2023-02-24 02:11:17 -05:00
Martynas Bagdonas
429970ad30 Fix annotation image rendering caused issues:
- Don't save unmodified annotation item when rendering annotation image
- Don't render annotation image multiple times
2023-02-24 02:11:17 -05:00
Adomas Ven
ba06db2e19 Remove firefox-zotero IPC pipe and switching code (#2990) 2023-02-24 02:11:17 -05:00
Dan Stillman
2c9e9f8a11 Update note-editor 2023-02-24 02:11:17 -05:00
Martynas Bagdonas
411167ab58 Tweak note-editor text and highlight color icons 2023-02-24 02:11:17 -05:00
Martynas Bagdonas
e659e042b0 Change note-editor text color icon 2023-02-24 02:11:17 -05:00
Martynas Bagdonas
504e932d88 Add missing text color string 2023-02-24 02:11:17 -05:00
Martynas Bagdonas
f49a6bf807 Add more colors to pdf-reader, note-editor and introduce text color tool 2023-02-24 02:11:17 -05:00
Abe Jellinek
55b17c2b7e Scaffold web template: Serialize multiples
Fixes #2980
2023-02-23 16:36:59 -05:00
Adomas Ven
cfbfcf20bf Refactor l10n code. Remove use of react-intl. (#2975)
Strings from .dtd files are now accessible from Zotero.getMessage
as the eventual move to Fluent would remove their distinction.
2023-02-10 10:26:49 +02:00
Dan Stillman
bcfdaaabab Update Retraction Watch retraction reasons 2023-02-10 01:55:23 -05:00
Dan Stillman
3813456e2b Fix some lint errors in Zotero.Retractions 2023-02-10 01:55:18 -05:00
Dan Stillman
bac87cbc42 Detect retractions for DOIs with capital letters
https://forums.zotero.org/discussion/102745/retraction-watch-not-working
2023-02-10 01:55:12 -05:00
Dan Stillman
c6bcc2572c Add PDF reader tab title pref to General pane 2023-02-10 01:54:36 -05:00
Dan Stillman
3be8abeae2 Fix broken creator autocomplete if place becomes a base field
Well this was a wild one to debug.

Creator fields were only initialized for autocomplete due to a series of
>10-year-old bugs:

1) In `showEditor()`, `Zotero.ItemFields.isAutocompleteField(fieldName)`
   was called for creator fields, which would pass, e.g.,
   `creator-0-lastName`.

2) In `isAutocompleteField()`, `ItemFields.getName()` would normalize
   `creator-0-lastName` to `false`, since it's not a valid field.

3) `isAutocompleteField()` listed `place` as a base field despite its
   not having any mapped fields, so when `getTypeFieldsFromBase()` was
   called on it, the return value would be `false`, which would be added
   to the list of autocomplete fields, which would mean that the
   normalized field of `false` from `creator-0-lastName` would match,
   which would mean that `isAutocompleteField('creator-0-lastName')`
   would always return true...as long as `place` never gained a mapped
   field.

Except `isAutocompleteField()` wasn't supposed to be the test for
initializing autocomplete for creator fields anyway -- `fieldName ==
'creator'` was. But `fieldName` is something like `creator-0-lastName`,
not `creator`, which meant that that test always failed, which meant
that if `place` did gain a mapped field, both tests would fail, which
would cause the creator field not to be initialized for autocomplete,
which would cause it to break as soon as you started to type into it.

This fixes that.
2023-02-10 01:39:31 -05:00
Martynas Bagdonas
a78860f092 Add Filename option for PDF tab title pref 2023-02-09 17:21:21 +00:00
Dan Stillman
382bde0fc2 Rename PDF tab title pref to include reader
In case we have a separate pref for notes or something else

(cherry picked from commit 6d0e5959e6)
2023-02-09 17:21:21 +00:00
Martynas Bagdonas
c0c1d011fa Add a hidden pref for tab title with support for Creator-Year-Title option (#2985)
(cherry picked from commit a5fb64f295)
2023-02-09 17:21:21 +00:00
Dan Stillman
8272989171 Add DOMParser to plugin scope 2023-02-09 05:36:03 -05:00
Abe Jellinek
4865f8afca Scaffold: Await more async functions
Might help prevent a deadlock I experienced when switching back to Zotero after
changing a translator file externally (although I can't reproduce it).
2023-01-23 12:32:30 -05:00
Dan Stillman
786d3db880 Revert "Limit Windows version to 2 PDF tabs in memory"
This reverts commit ffc8088ccd.

I cherry-picked this, but it's not necessary in Zotero 7, which has a
Win64 build.
2023-01-17 23:09:05 -05:00
Dan Stillman
3d4b93c86a Fix DOI field context menu not appearing after field edit
Context menu wouldn't appear again until the item box was refreshed
2023-01-17 23:05:48 -05:00
YFdyh000
bb5fe45f31 Show fieldLocalizedName in Scaffold - List All Fields (#2965) 2023-01-17 10:39:02 -05:00
Abe Jellinek
7e0b898765 fx-compat: Preferences: Fix pane script global object
Panes were being loaded with Zotero_Preferences as their global scope, so global
variables they defined would be set on that object instead of the window.
2023-01-17 10:28:57 -05:00
Adomas Venčkauskas
b6edaea54c fx102: Fix Word for Windows initialization and prefs 2023-01-13 09:56:59 +02:00
Dan Stillman
c7da16f07d Add protection against immediate retries in delayGenerator 2023-01-11 02:31:08 -05:00
Dan Stillman
6a1f0251cd Fix incorrect retries if multiple HTTP.request() calls get 500s
https://forums.zotero.org/discussion/comment/425814/#Comment_425814

The passed intervals array was modified, so after a request() got a 500,
subsequent calls would start with longer delays and eventually start
retrying immediately.
2023-01-11 02:20:07 -05:00
Dan Stillman
437b457134 Additional logging for "Invalid sync state undefined"
https://forums.zotero.org/discussion/102186/invalid-sync-state-undefined
2023-01-08 02:02:28 -05:00
Martynas Bagdonas
ffc8088ccd Limit Windows version to 2 PDF tabs in memory
Fixes zotero/zotero#2955
2023-01-08 02:02:28 -05:00
Abe Jellinek
7e7e8b88a2 LABD file relinking: Process using Unix paths (#2961) 2023-01-05 15:40:28 -05:00
Dan Stillman
959e868126 Read default prefs from prefs.js in a plugin's root directory
The file should follow the same `pref("extensions.foo.bar", "value");`
syntax as files previously in defaults/preferences/, which should no
longer be used in Zotero 7. (For an extension that works in both Zotero
6 and 7, it's OK to have a file in defaults/preferences for Zotero 6 and
an identical prefs.js for Zotero 7.)

Files in defaults/preferences/ aren't automatically loaded when a plugin
is installed/enabled but are still loaded at app startup by Mozilla code
for now. Plugins shouldn't count on that continuing to be the case in
Zotero 7 and should switch to prefs.js.

We'll add a way for bootstrapped plugins to manually trigger reading of
a prefs.js file in Zotero 6.
2023-01-05 01:53:03 -05:00
Dan Stillman
83792757de Remove pref code for <Fx59 2023-01-05 01:09:28 -05:00
Dan Stillman
699e46c2f5 Merge pull request #2951 from AbeJellinek/add-request-endpoint
Add `/connector/request` endpoint
2022-12-23 21:38:51 -05:00
Abe Jellinek
fc8a037d12 Zotero.HTTP.request(): Process headers case insensitively
Using the Headers class from the Fetch API.

Before, the added test would fail: `_requestInternal()`, not finding a header
named `Content-Type` (case sensitive), would set it to
`application/x-www-form-urlencoded`. XMLHttpRequest, upon being given both
`content-type`: `application/json`) and `Content-Type`:
`application/x-www-form-urlencoded`, would helpfully merge the two, producing
`content-type`: `application/json, application/x-www-form-urlencoded`. That's
obviously not the correct behavior.
2022-12-23 21:37:15 -05:00
Abe Jellinek
e46ffaf84b Add /connector/request endpoint 2022-12-23 21:37:15 -05:00
Dan Stillman
bad4597a86 Add mechanism for setting preferences remotely
Limited to a hard-coded list

Initially limited to `extensions.zotero.import.mendeleyUseOAuth`,
to switch the Mendeley importer from direct login to OAuth
2022-12-23 17:26:20 -05:00
Dan Stillman
32b6e0a485 Allow 204 response to OPTIONS request from WebDAV server
https://forums.zotero.org/discussion/101824/possible-to-allow-http-204-response-for-options-request-in-webdav-server-check

The specs used to (seemingly inadvertently) disallow 204 for OPTIONS,
but they've been clarified to make it clear that it's allowed [1], and MDN
now even shows it as an example [2].

[1] https://stackoverflow.com/a/57455110
[2] https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS
2022-12-23 17:26:04 -05:00
Abe Jellinek
da075fb215 fx-compat: Scaffold: Fix Tests richlistbox growing when tests are added 2022-12-20 13:19:22 -05:00
Adomas Venčkauskas
c12e5659ab Fix a potential bug in integration plugin when field codes are corrupt 2022-12-14 16:26:33 +02:00
Dan Stillman
75aa17f169 Fix running function passed to Zotero.openInViewer()
This fixes plugin removal in the Add-ons window.

Broken by b8966f7878
2022-12-11 18:39:27 -07:00
Dan Stillman
e7fa5d7f9d Add setTimeout and clearTimeout to plugin scope 2022-12-10 02:11:30 -07:00
Abe Jellinek
45e0340787 v-t: Fix freeze when type-to-find wraps and first row is selected 2022-12-06 14:58:58 +02:00
Dan Stillman
7b7bded5f0 Add "support questions" to CONTRIBUTING.md 2022-12-01 05:10:42 -05:00
Adomas Venčkauskas
e59bcd2b64 Link Mendeley citations in documents to imported items. Closes #2622 2022-11-29 16:27:19 +02:00
Dan Stillman
76f2f0c783 Don't show items with annotated attachments after moving to trash
https://forums.zotero.org/discussion/100775/deleted-items-keep-reappearing-in-my-library

Regression from c3ee588bf
2022-11-28 04:34:49 -05:00
Abe Jellinek
ca1f83e9c9 fx-compat: Tag Color Chooser: Don't disable label
The default styles make it a strange-looking gray color, and there's no reason
to disable it separately if the element it's connected to is disabled.
2022-11-22 21:00:35 -05:00
Abe Jellinek
16eac5040b fx-compat: Fix error when switching language to Automatic
Services.locale always wants an array now, but it can be empty.

We still get "Uncaught (in promise) undefined" printed to the console, no stack,
not caught by "Pause on exceptions" in the debugger... but it's not clear that
that's actually coming from this code, and it doesn't seem to prevent anything
from working.
2022-11-22 20:53:29 -05:00
Adomas Venčkauskas
f98ab3b0a6 Import URL from XPCOM code instead of relying on window for Proxy code
Also fix other failing proxy tests. Closes #2928
2022-11-22 15:58:49 +02:00
Adomas Venčkauskas
b561aff94f Avoid locator detection on paste in citation dialog. Closes #2856
Locators will get detected if there is additional typing or editing
after the paste
2022-11-22 15:54:30 +02:00
Adomas Venčkauskas
4fa208d4d7 fx-compat: Fix pasting in quick format dialog 2022-11-22 15:52:57 +02:00
Adomas Venčkauskas
350a5d2cbb Fix quick format locator regexp to not match numbers without space.
Closes #2915
2022-11-22 15:51:54 +02:00
Adomas Venčkauskas
7e4e66b54d Fix proxy test 2022-11-22 15:51:54 +02:00
Adomas Venčkauskas
e8356de3c1 Proxy code: ensure URL constructor in non-window JS scope
Closes #2924
2022-11-22 15:51:54 +02:00
Abe Jellinek
4b09edfa42
fx-compat: Add color picker CE (#2682) 2022-11-21 02:48:16 -05:00
Dan Stillman
4dbb2d88b9 Update styles, translators, and CSL locales 2022-11-21 01:14:07 -05:00
Dan Stillman
90cf3c9049 Merge new English strings 2022-11-21 01:14:07 -05:00
Dan Stillman
5a82aa952d Don't allow note on embedded-image attachments
https://github.com/windingwind/zotero-better-notes/issues/212
2022-11-21 01:14:07 -05:00
Dan Stillman
7ffc509ee6 Fix response content type in Find Available PDF test 2022-11-21 01:14:07 -05:00
Dan Stillman
c6df0b586c Use clearer name for Find Available PDF tests 2022-11-21 01:14:07 -05:00
Dan Stillman
b5862ba780 Handle relative PDF links when using custom PDF resolver 2022-11-21 01:14:07 -05:00
Dan Stillman
1f0a721101 Fix focus stealing in item box (#2885)
Port of #2895
2022-11-21 01:14:07 -05:00
Adomas Venčkauskas
0e4cdda8c7 Prevent citation merging from being always enabled after refreshing the doc 2022-11-21 01:14:07 -05:00
PChemGuy
48d81c7d47 Fixed double-quoted string literals in SQL files (#2892)
Replaced double quotes around string literals with single quotes.
2022-11-21 01:14:07 -05:00
Abe Jellinek
00b387afc2
fx-compat: Toolbar fixes (#2922)
- Don't rely on Zotero.hiDPISuffix being initialized in menuToolbarbutton.js --
  it probably hasn't been at the time that the code that creates the dropmarker
  is running
- Fix merge mistake that created a duplicate block of CSS
2022-11-21 00:07:59 -05:00
Abe Jellinek
74492e40c4
Improve bidi & RTL support (#2415)
- Render cell text in its native direction
- Fix context menu positioning
- Fix item box (localizations needed)
- Fix column resizing
- Fix bidi text in collection tree
- Always right-align in RTL, always left-align in LTR.
  I'm going off advice from this excellent guide for RTL website design
  by Ahmad Shadeed: https://rtlstyling.com/posts/rtl-styling#tables
- Join creators in the tree ("Smith and Jones") using a format string to
  support languages like Arabic and Hebrew where there shouldn't be a
  space after the "and".
- Fix tabs
- Fix toolbar on Mac, flip icons on other platforms
2022-11-20 18:23:17 -05:00
Adomas Venčkauskas
93bba41dd5 Don't throw when getting potential proxies with invalid URL 2022-11-15 13:54:33 +02:00
Adomas Venčkauskas
ed46d8c53c Deproxify homepage URLs without trailing slash. Closes #2884 2022-11-15 13:22:52 +02:00
Dan Stillman
039142e50d Fix clearing of active quick search after annotation change
https://forums.zotero.org/discussion/90727/search-results-disappear
2022-11-14 22:55:17 -05:00
Abe Jellinek
a7b605f0cc
Add "Open PDF reader in new window" preference (#2868)
When enabled:
- Double-clicking a PDF or choosing "Open PDF" opens a new window
- Shift-double-clicking opens a new tab
- "Open in New Window" locate option becomes "Open in New Tab" and has the
  reverse behavior
2022-11-14 17:12:48 -05:00
Abe Jellinek
b6591dba5a
Make Feeds row into a selectable global view of feed items (#2800) 2022-11-14 16:55:28 -05:00
Abe Jellinek
318ec4074e
fx-compat: Style Editor: Validate inline (#2745) 2022-11-12 05:31:29 -05:00
Adomas Venčkauskas
e789872efe Improve cookie-sandbox behavior when getting attachments via WBP
Previously cookies only got attached on the initial request but not on
any redirect and subsequent request. This may have been the cause for
many reports of import failures behind proxies in the past.
2022-11-11 12:56:12 +02:00
Abe Jellinek
cda0e0cf6d
Add "Any Field" advanced search condition (#2902) 2022-11-10 21:55:09 -05:00
Abe Jellinek
177da5937e
Add "Add to Dictionary" to note editor context menu (#2897)
As well as "Undo Add to Dictionary", as in Firefox.
2022-11-10 17:50:40 -05:00
Adomas Venčkauskas
eaeb144c3b Fix a cookie sandbox regression e537018 2022-11-10 14:58:27 +02:00
Adomas Venčkauskas
56229136be Adjust tests to not use the dotsToHyphens proxy option 2022-11-10 12:46:14 +02:00
Adomas Venčkauskas
26f1d6125b Fix proxied urls not unproxifying (regression 1116b05f)
Technically this code has been wrong for a long time, but it only
manifest now. It seems that the equivalent code in translate module
was fixed when that code was extracted into a separate repo
2022-11-10 12:45:31 +02:00
Adomas Venčkauskas
249fbfad15 Update translate submodule 2022-11-10 12:28:44 +02:00
Adomas Venčkauskas
1116b05f1d Always replace dots to hyphens for https proxy schemes 2022-11-10 12:28:44 +02:00
Abe Jellinek
9cc2993e70 fx-compat: Fix Locate Manager appearance
- Correct padding and don't use Mozilla preferences styles
- Fixed v-t issue that applied the wrong class names to columns, giving them
  incorrect widths
2022-11-07 16:05:21 -05:00
Abe Jellinek
3af5976aa2 fx-compat: Preferences: Manage pref observers for elements added later 2022-11-03 11:52:54 -04:00
Abe Jellinek
e4b290a394 fx-compat: Replace more XUL createElement() calls 2022-11-02 16:01:48 -04:00
Abe Jellinek
76f844da2f Scaffold: Autocomplete translator IDs in setTranslator() calls 2022-11-01 16:36:44 -04:00
Abe Jellinek
ac8db7a376 fx-compat: Scaffold: Fix type-to-find not receiving ' ' 2022-11-01 16:05:17 -04:00
Abe Jellinek
1aebad3c19 Scaffold: Fix copying JSON test data
Previously only copied '[object Object]'.
2022-11-01 16:04:24 -04:00
Dan Stillman
b5ce8b655a Fix error copying from note if note Quick Copy format is "HTML"
In this case, Note Markdown wouldn't be preloaded, but it's always used
for copying from the note editor, and since the note editor uses
`noWait`, this would result in "Code promise is not resolved in noWait
mode".
2022-11-01 03:56:25 -04:00
Dan Stillman
cbb1ebad33 Fix Quick Copy drag after reiniting translators
Zotero.Translators.reinit() didn't reinit Quick Copy, so if an export
translator was selected it wouldn't be preloaded again and dragging
would fail with "Code promise is not resolved in noWait mode".
2022-11-01 03:19:22 -04:00
Adomas Venčkauskas
228e8407a7 Make colored tagging via keyboard layout independent
Report https://forums.zotero.org/discussion/100717/tag-number-shortcut-with-mac-raccourci-clavier-pour-marqueurs-avec-un-mac
2022-10-31 09:45:27 +02:00
Dan Stillman
8e59e49d29 Avoid infinite/excessive loops in Find Available PDF
https://forums.zotero.org/discussion/100634/potential-infinite-loop-when-trying-to-find-available-pdf

Closes #2883
2022-10-30 04:44:31 -04:00
Dan Stillman
4722366b42 Update Mac Word automation settings instructions for Ventura 2022-10-29 16:42:28 -04:00
Dan Stillman
7a45047f8f Fix comment for Zotero.Attachments.getPDFResolvers() 2022-10-29 04:41:16 -04:00
Dan Stillman
59cb33d231 Retry only twice on error in Find Available PDF
Not three times
2022-10-29 04:41:10 -04:00
Dan Stillman
06b23cca94 Fix hang on 500 from site during Find Available PDF
Find Available PDF has its own domain-based retry logic that predated
automatic 5xx retries in Zotero.HTTP, so disable the latter and fix some
bugs in the former.

Fixes #2700
2022-10-29 04:38:57 -04:00
Adomas Venčkauskas
d658e05363 Truncate long citation text in citation dialog. Closes #2879 2022-10-28 15:08:26 +03:00
Abe Jellinek
57916c032f
Attachment box: Add ability to copy URL of snapshot/link (#2748)
Fixes #2747
2022-10-27 16:54:50 -04:00
Dan Stillman
9869eb4bc8 Restore cell.csl for style tests
Removed in a28908f0b4
2022-10-27 05:07:46 -04:00
Dan Stillman
d850a8be7d Don't localize "Markdown" in Quick Copy settings 2022-10-27 05:06:55 -04:00
Dan Stillman
c6448bd9c1 Add Zotero.Utilities.Internal.stringWithColon() for localized colons
Generally just a colon, but, e.g., French adds a space before it. We'll
want to replace uses of `punctuation.colon` with this.
2022-10-27 05:05:47 -04:00
Dan Stillman
146d50c8d1 Update translators 2022-10-27 05:05:35 -04:00
Dan Stillman
c51cb88c97 Adjust layout of Quick Copy note format options
Also:

- Hide format options until translators are loaded (since otherwise
  the checkboxes don't have labels and the layout is messed up)
- Remove unnecessary "zotero-" prefix from the new elements
2022-10-27 05:04:16 -04:00
Dan Stillman
a95a2937c1 Reset note Quick Copy pref on upgrade if set to Markdown + Rich Text
The default JSON pref value used spaces, but changing the drop-down
resulted in a version without spaces, so simply changing the default to
include the new link options wouldn't change all existing installs and
the "Include App Links" checkbox wouldn't show as enabled for Markdown.
This adds a pref migration step to reset the pref to the new default if
it's set to Markdown + Rich Text, regardless of whitespace differences.
2022-10-27 04:50:04 -04:00
Martynas Bagdonas
da7c73b662 Add "Include Zotero Links" option for note export and QuickCopy
Fixes #2349
2022-10-27 04:49:11 -04:00
Dan Stillman
09f0f74104 Fix error message for invalid field in Item.setField()
The error message was showing a field instead of an item type.

https://forums.zotero.org/discussion/100598/error-1533410729-impossible-to-correct-date-field-in-items-added-with-zotero-conector-ver-6-0-15
2022-10-27 03:47:54 -04:00
Dan Stillman
3a77eb85ed Don't match all attachments with annotations for "not" search conditions
Fixes #2867
2022-10-27 03:46:18 -04:00
Dan Stillman
fe016edf33 PDF reader: Hide "Rotate Page 180°" menu option for now
Rotating will speed up with Zotero 7, so maybe we can do without this.
2022-10-27 03:43:34 -04:00
Dan Stillman
ff3a74064b PDF reader: Add "Page" to rotate menu options for clarity 2022-10-27 03:41:28 -04:00
Martynas Bagdonas
454a2c186b Add rotation options to Edit menu to rotate the current PDF page
(cherry picked from commit d8d6054927)
2022-10-27 03:39:56 -04:00
Martynas Bagdonas
03ba306018 Reduce loaded tabs limit if the system has 8 GB or less memory 2022-10-27 03:01:42 -04:00
Adomas Venčkauskas
ce3266e036 Update SingleFile. Closes #2880 2022-10-25 16:02:22 +03:00
Adomas Venčkauskas
0d1b194b6b Add an integration test for citation merging 2022-10-25 14:50:22 +03:00
Adomas Venčkauskas
19558a425b Fix wrong given name disambiguation after editing author for citeproc-js
Closes #2870
2022-10-25 14:50:05 +03:00
Adomas Venčkauskas
a28908f0b4 Change integration test citation style to APA and some refactoring 2022-10-25 14:50:05 +03:00
Adomas Venčkauskas
87a567122e Fx102: Fix Integration tests 2022-10-25 13:48:39 +03:00
Adomas Ven
ee67c848d7 Adds support for merging adjacent citations (#2875) 2022-10-25 13:19:14 +03:00
Abe Jellinek
93666d310e Zotero.PreferencePanes: Fix shutdown observer error (#2845)
`this` referred to the observer instead of Zotero.PreferencePanes, so
`this.pluginPanes.length` caused an error and plugin panes were not removed.
2022-10-16 16:06:22 -04:00
Abe Jellinek
ccc94e7b45 fx-compat: Add stylesheets parameter to PreferencePanes.register() (#2845)
And just fully reload the preferences window when the pane array changes. The
preferences window won't often be open when a plugin is enabled or disabled,
considering that the Add-ons window is external to the preferences, and trying
to add/remove panes dynamically without reloading brings lots of bugs.
(No way to dynamically remove a script, for one.)
2022-10-16 16:06:05 -04:00
Abe Jellinek
f81a81cb74 fx-compat: Preferences: Activate <?xml-stylesheet?>s, default to XUL (#2845) 2022-10-16 16:05:51 -04:00
Abe Jellinek
c1bb910d1c
Clear sync error and start sync after logging in in prefs (#2802)
Also fixes an existing error due to an argumentless call to
Zotero.Sync.Runner.updateIcons() in ZoteroPane.
2022-10-16 15:47:54 -04:00
Dan Stillman
f9a0622c30 Merge new English strings 2022-10-13 02:20:42 -04:00
Dan Stillman
ac165cfc14 Update note-editor and pdf-reader submodules 2022-10-13 02:20:42 -04:00
Dan Stillman
961e5b955d Default to UTF-8 when indexing text file without detected charset
https://forums.zotero.org/discussion/94637/indexing-of-markdown-plain-text-attachments-with-md-extension
2022-10-13 02:20:42 -04:00
Martynas Bagdonas
81c6c8deff Add annotation update test to pdf-reader tests 2022-10-13 02:20:42 -04:00
Dan Stillman
23a6af128b Change connector server response to "Zotero is running"
People are confused by "Zotero Connector Server is Available". I'm not
sure if this will be any better, but not mentioning the connector might
help -- that seems to be part of the problem.

We could display a longer message with a link to
https://www.zotero.org/support/kb/connector_zotero_unavailable, but this
is the /ping page that gets hit constantly, so it seems like we should
keep it short (though probably it doesn't make a difference).
2022-10-13 02:20:42 -04:00
Abe Jellinek
bde157b085
fx-compat: Automatically register plugin l10n sources (#2863)
Fixes #2837
2022-10-11 11:59:33 -04:00
Abe Jellinek
367090614d fx-compat: Fix File -> Save... in basicViewer
Printing is still broken with no clear fix - PrintUtils really wants a
tabbrowser.
2022-10-11 10:47:15 -04:00
Abe Jellinek
f030190fb7 "Swap First/Last" in creator transform menu
https://github.com/zotero/zotero/pull/2801#issuecomment-1274107763
2022-10-11 10:30:53 -04:00
Abe Jellinek
568b88e342
Add "Capitalize" text transform to creator context menu (#2801) 2022-10-11 01:28:27 -04:00
Abe Jellinek
9be51a5cb0
Fix last editpane tab being misaligned vertically (#2864) 2022-10-10 21:47:20 -04:00
Dan Stillman
7276223a90 Tweak text in LABD auto-relinking dialogs (#2374, #2092) 2022-10-10 10:38:53 -04:00
Abe Jellinek
5f9e8f5b7e Automatically relink attachments from LABD (#2374)
Fixes #2092
2022-10-10 10:38:43 -04:00
Martynas Bagdonas
ecd0e50ac4 Tweak pdf-reader annotation creation test 2022-10-10 17:06:00 +03:00
Martynas Bagdonas
3a26f6eb6f Add pdf-reader annotation creation test
(cherry picked from commit af436d34a8)
2022-10-10 16:56:17 +03:00
Martynas Bagdonas
8db82c1022 Don't allow to rotate or delete pages for read-only PDF
(cherry picked from commit 29dd0cf5dc)
2022-10-10 16:56:17 +03:00
Martynas Bagdonas
35cbbeeea4 Fix annotation image saving to cache for read-only annotations
(cherry picked from commit 28329aa785)
2022-10-10 16:56:17 +03:00
Martynas Bagdonas
b851e66ec8 Fix annotation saving regression
(cherry picked from commit c5d418fc16)
2022-10-10 16:56:17 +03:00
Martynas Bagdonas
a5c17f3abe Properly handle errors when trying to open too large (>2GB-1) PDF file
(cherry picked from commit e9c6c76e79)
2022-10-10 16:56:17 +03:00
Martynas Bagdonas
13d22a2dbc Update pdf-reader submodule
(cherry picked from commit f13966894f)
2022-10-10 16:56:17 +03:00
Abe Jellinek
384d4ace7e
fx-compat: Remove most Babel plugins (#2855)
We still need `babel-plugin-transform-es2015-modules-commonjs`, but everything
else is redundant in fx102 and mangles output code unnecessarily.
2022-10-06 18:53:07 -04:00
Adomas Ven
aa1aac6adb
fx-compat: Restore word processor integration (#2841)
- Word for Windows not tested since there's no build yet
- Word for Mac currently causes a sigsev, and likely we'll see this on
windows too. This is happening on an API call where we pass a callback,
so likely an issue in ctypes that we'll have to work around.
- All integration UIs restored.
- Added a component for richlistitems with a checkbox with corresponding
interactions (spacebar/double-click to toggle).
2022-10-06 00:17:28 -04:00
Martynas Bagdonas
03de28a7b7 Fix pref observer handler unregistering
(cherry picked from commit b7cc1d549b)
2022-10-05 21:00:20 +03:00
Martynas Bagdonas
b24a7cf529 Allow importing annotations in group libraries
(cherry picked from commit b594ad0b0a)
2022-10-05 21:00:16 +03:00
Martynas Bagdonas
f8837ae58b Don't allow pdf-reader to set annotation author name
Fixes the issue when your own created annotation becomes grayish and indicates that it was modified by another user.

(cherry picked from commit 4dd1851140)
2022-10-05 21:00:11 +03:00
Martynas Bagdonas
acfbbebd85 Re-render annotation images when rotating a page
Fixes #2824

(cherry picked from commit 006dd20d5b)
2022-10-05 21:00:04 +03:00
Martynas Bagdonas
ef5e80d4dc Remove PDF view rotation options 2022-10-05 20:59:49 +03:00
Abe Jellinek
bcb4220d00 Preferences: Use XUL <label>s around HTML <h2>s
Fixes #2836
2022-10-05 12:05:23 -04:00
Adomas Venčkauskas
0bbad7a2db Fix item list row text not read when using non-contiguous kb selection
Closes #2830
2022-10-03 15:20:56 +03:00
Abe Jellinek
5ef9a3116c
Preferences: Restore Help button (#2803)
Having the macOS Help button in a scrolling view feels kind of weird, but that's
what Apple is doing in the Ventura System Settings app, so I guess we go with
it. I like it better than Firefox's non-contextual "Firefox Support" button
under the pane list in their preferences, anyway - having pane-by-pane
contextual help buttons seems like good UX that there isn't a good reason for us
to ditch.
2022-10-03 07:35:40 -04:00
Abe Jellinek
b8966f7878
fx-compat: Fix zotero:// protocol for reports (#2825)
- The protocol can no longer be marked "dangerous to load," only "UI resource"
  (accessible inside browsers but not by web pages).
- The protocol needs to run in the main process.
- We need to replace the XUL browser to reset its type attribute depending on
  whether we're loading a zotero protocol URI - zotero protocol URIs, maybe due
  to the protocol handler's tight coupling with the main process, cannot load in
  type="content" browsers.
2022-10-03 07:31:17 -04:00
Dan Stillman
fe391a1026 Add 15 and 16 as note font size options in menu
https://forums.zotero.org/discussion/100079/notebook-fonts
2022-10-03 06:47:17 -04:00
Dan Stillman
7e8d9c55ac Update pdf-reader submodule 2022-10-03 06:47:17 -04:00
Dan Stillman
47c939561c Remove default OpenURL gateway
https://www.worldcat.org/registry/gateway is no longer supported -- see
https://forums.zotero.org/discussion/comment/418373/#Comment_418373 for
details

If no resolver is selected, show an error on "Library Lookup" with a
button to open the prefs.
2022-10-03 06:47:17 -04:00
Dan Stillman
817ca999e3 Swap "Split Vertically" and "Split Horizontally" in PDF reader 2022-10-03 06:47:17 -04:00
Dan Stillman
4f10c00c71 Add Number as items list column option
https://forums.zotero.org/discussion/99844/add-columns-to-desktop-app-report-number
2022-10-03 06:47:17 -04:00
Dan Stillman
d758d41e56 Update package-lock.json 2022-10-03 06:47:17 -04:00
Martynas Bagdonas
d1f1c4afea Update note-editor submodule
(cherry picked from commit 2569ad6506)
2022-09-30 13:25:06 +03:00
Martynas Bagdonas
d484d16128 Prevent error when creating a note from annotations that have ink
(cherry picked from commit 4fdf43ed92)
2022-09-30 13:25:06 +03:00
Martynas Bagdonas
764d1b006e Import external annotations before trying to add a note from annotations
(cherry picked from commit 9691fcafc2)
2022-09-30 13:25:06 +03:00
Martynas Bagdonas
61c0dfee38 Add split view for PDF reader (#2832)
Fixes #2821
2022-09-29 14:28:47 +03:00
Dan Stillman
03f05c8afa Update note-editor submodule
(cherry picked from commit 0e60389ee4)
2022-09-29 13:58:53 +03:00
Dan Stillman
6d5c3c042e Update pdf-reader and pdf-worker submodules
(cherry picked from commit f6e11981e3)
2022-09-29 13:58:45 +03:00
Dan Stillman
f40b215753 fx-compat: Restore error reporting wizard 2022-09-28 06:56:39 -04:00
Dan Stillman
03532e1289 fx-compat: Fix Zotero.getInstalledExtensions() 2022-09-28 06:56:24 -04:00
Tom Najdek
76ff32098f
fx-compat:Creator buttons keyboard accessible #999 (#2833) 2022-09-23 04:18:24 -04:00
Dan Stillman
e0ccce4072 fx-compat: Fix 'dev' channel warning not appearing 2022-09-22 03:41:11 -04:00
Dan Stillman
afac621611 Update ESLint config 2022-09-22 00:20:56 -04:00
Dan Stillman
542a6adf84 Zotero.Plugins.getResourceURI() → getRootURI()
To go with the `rootURI` string variable passed to bootstrap methods
2022-09-20 00:39:21 -04:00
Dan Stillman
acc4d2a81b Update paths for Mozilla Fluent files
Follow-up to zotero/zotero-standalone-build@600b35d
2022-09-15 18:39:19 -04:00
Dan Stillman
dda60995a3 fx-compat: Fix app update dialog
Styling needs to be redone, but it works.
2022-09-15 06:29:14 -04:00
Dan Stillman
35d5c2633d fx-compat: Add app update dialog files from fx68
Removed in fx69

Not yet functional
2022-09-15 06:29:14 -04:00
Dan Stillman
e955583d2c Update translate submodule 2022-09-15 06:29:14 -04:00
Martynas Bagdonas
7cd57cd9e4 Fix focusContextPane error when pressing tab in standalone PDF window
Fixes #2823
2022-09-15 12:01:34 +03:00
Abe Jellinek
500f187a60 Scaffold: Remove useless debug 2022-09-13 11:20:41 -07:00
Martynas Bagdonas
82b53fee87 Fix PDF reader sometimes showing UTC time and sometimes local
(cherry picked from commit c13d17b5e6)
2022-09-13 17:16:08 +03:00
Martynas Bagdonas
531f8fe24d Convert Mendeley colors to equivalent Zotero colors on PDF open
Fixes #2820

(cherry picked from commit eb255c5868)
2022-09-13 17:16:08 +03:00
Dan Stillman
169db42cf6 CI: Enable ZIP building on fx102 branch
Tests are still skipped
2022-09-12 21:52:37 -04:00
Tom Najdek
223f44fdfd Map annotation colors colors on import #2819 (#2822) 2022-09-12 19:58:21 -04:00
Abe Jellinek
7829a0dfdc fx-compat: Style Editor: Fix error when no style selected 2022-09-12 14:06:58 -07:00
Abe Jellinek
52e8fa8995 Prune Monaco distribution, fix JS acting like TS in Scaffold
We don't need most of the bundled languages or localizations, so they were just
taking up disk space pointlessly.
2022-09-12 14:06:17 -07:00
Dan Stillman
88869f43ae Merge new English strings 2022-09-12 15:54:11 -04:00
Dan Stillman
a63c634e3f Add "Create Note from Annotations" option to items list context menu
To allow creation of a standalone note with annotations from all the
selected top-level items and/or attachments. Annotations will be sorted
by the order of the items in the items list.

"Add Note from Annotations" remains when a single regular item or one or
more attachments under a single regular item are selected.
2022-09-12 15:54:03 -04:00
Dan Stillman
e81b43be98 Add collectionID option to EditorInstance.createNoteFromAnnotations()
For adding a standalone note to the current collection
2022-09-12 15:54:03 -04:00
Dan Stillman
39e45221b1 Rename Zotero.Items::keepParents() to keepTopLevel()
So that it works for more than two levels of items

Also fix a bug where the parent item could be returned more than once if
multiple child items were selected.
2022-09-12 15:54:03 -04:00
Dan Stillman
497d6376c8 Add Zotero.Item::topLevelItem and Zotero.Items.getTopLevel(items) 2022-09-12 15:54:03 -04:00
Martynas Bagdonas
f70ec29881 EditorInstance.createNoteFromAnnotations(): Handle multiple attachments 2022-09-12 15:54:03 -04:00
Abe Jellinek
018e534383 fx-compat: Zotero service: Correct reportError() call 2022-09-09 13:50:47 -07:00
Abe Jellinek
ca894c3416 fx-compat: Zotero protocol handler: Correct constant name 2022-09-09 13:50:40 -07:00
Abe Jellinek
dbbc6a2f44 fx-compat: Basic viewer: Restore loadURI() for Zotero.openInViewer() 2022-09-09 13:46:19 -07:00
Martynas Bagdonas
20aa40c5d2 Adjust PDF reader and context pane UI based on font size pref
Fixes #2809

(cherry picked from commit 64897455f4)
2022-09-09 18:10:25 +03:00
Abe Jellinek
94392fce96 fixup: Option-P was supposed to push, not type pi 2022-09-07 11:17:47 -04:00
Abe Jellinek
df9d8d593c fx-compat: Fix sync button tooltip
XULTooltipElement now prepends a <description> node, so the nodes we were
getting were off by one. Just use class names for all the children.
2022-09-07 11:15:55 -04:00
Martynas Bagdonas
9f9dde511e fx-compat: Flex grow note-editor when using in contextPane 2022-09-07 17:26:12 +03:00
Martynas Bagdonas
7317b61425 fx-compat: Fix note-editor initialization 2022-09-07 17:26:12 +03:00
Martynas Bagdonas
9d584152f0 fx-compat: Fix contextPane after b5bdae3d 2022-09-07 17:26:12 +03:00
Abe Jellinek
74051576dd
Hide "Find Available PDF" for feed items (#2807) 2022-09-06 18:46:13 -04:00
Martynas Bagdonas
04120099fb Allow inserting images over context menu
Fixes #2759

(cherry picked from commit f893206dfd)
2022-09-06 17:11:41 +03:00
Martynas Bagdonas
75a080b7cb fx-compat: Tweak image copying to clipboard 2022-09-06 17:05:52 +03:00
Martynas Bagdonas
80385ff893 Add context menu options to copy/save image from pdf-reader/note-editor
Fixes #2664
2022-09-06 16:48:13 +03:00
Abe Jellinek
dbc65faecb Preferences: Don't add IDs to pane containers
Built-in panes were creating a semi-invalid DOM in which the pane container and
the root element of the pane's XHTML got the same ID. There's no reason to give
containers IDs in the DOM, since we already have a Map of IDs to pane objects,
so let's just not.
2022-09-02 11:22:50 -04:00
Abe Jellinek
5d6ad703c1 Preferences: Fix tests, improve clarity, and more
- Fix sync and advanced preferences tests; use a new waitForFirstPaneLoad()
  functions instead of the old paneload event listener
- Remove empty preferences_searchTest.js
- Rename some Zotero_Preferences members/functions for better clarity and
  public/private differentiation
- Reorder, also for clarity
- Fix tabIndex parameter causing an error if invalid
- Remove window.sizeToContent() call in Sync.displayFields()
    - So *that's* why the window resized every time the sync pane was loaded...
- Deprecate openURL() and simplify openInViewer()
2022-09-02 11:01:37 -04:00
Martynas Bagdonas
286381d0dd Update pdf-reader submodule
(cherry picked from commit ae5de2c2f5)
2022-08-31 16:00:01 +03:00
Martynas Bagdonas
11b0afc0bd Add missing noteEditor.mathBlock string
(cherry picked from commit a3b45a74e9)
2022-08-31 16:00:01 +03:00
Dan Stillman
a4f802806c Use items-list sort order for report from collection or saved search
https://forums.zotero.org/discussion/99284/exporting-a-report-sorted-by-first-date

Regression from HTML tree
2022-08-30 16:22:53 +02:00
Dan Stillman
aa50bf24aa Update pdf-reader and note-editor submodules 2022-08-30 16:21:42 +02:00
Abe Jellinek
0fe394082c fx-compat: Scaffold: Prevent Space from scrolling translator list 2022-08-30 10:07:15 -04:00
Dan Stillman
00b24f85c9 Fix HTTP.request() 5xx handling with errorDelayMax=0
This was causing delay-less infinite loops for OPTIONS requests to Box,
which are returning 502 errors.
2022-08-29 23:46:58 +02:00
Abe Jellinek
63864f2f86
duplicateAndConvertSelectedItem: Don't copy abstracts (#2799) 2022-08-29 16:15:31 -04:00
Abe Jellinek
b646073dfa fx-compat: Fix style clash on disabled Export checkbox 2022-08-27 22:33:45 -04:00
Martynas Bagdonas
09ba429723 Update note-editor submodule and strings for math and table insertion
(cherry picked from commit d156bef42a)
2022-08-25 14:27:42 +03:00
Adomas Venčkauskas
4f0b07505a Fix SingleFile snapshot saving stalling in Firefox Connector
Update SingleFile submodule
2022-08-24 11:49:45 +03:00
Abe Jellinek
92095314c6 fx-compat: Preferences: Use our edit menu overlay
So text context menu actually works.
2022-08-22 16:46:50 -04:00
Abe Jellinek
c2254f3783 fx-compat: Scaffold: Native checkboxes, dropmarker 2022-08-22 16:20:28 -04:00
Abe Jellinek
d653ec817c fx-compat: Add by Identifier: Prevent expand after invalid ID input 2022-08-22 12:51:35 -04:00
Abe Jellinek
85e13dc3ee Zotero.PreferencePanes: Auto-generate ID, rearrange params
A manual pane ID isn't often necessary, since you can just give a manual ID to
the root element in your XHTML. Let's make things a bit simpler for the caller
and reduce the potential for conflicts.
2022-08-22 10:52:25 -04:00
Dan Stillman
0655d4350e Update package-lock.json 2022-08-22 01:15:21 -04:00
Dan Stillman
170f1962ad Don't repeatedly upload relations
Fixes #2772
2022-08-22 01:15:21 -04:00
Tom Najdek
454368e3d3 Make citavi annotations importer more resilient 2022-08-19 12:05:30 -04:00
Tom Najdek
cff02b04a0 Fix importing Citavi annotations in some cases 2022-08-19 12:05:30 -04:00
Dan Stillman
0695154661 Update pdf-reader submodule 2022-08-19 12:05:30 -04:00
Dan Stillman
5103d904f3 Include proper test for b373291c02 for #2771 2022-08-19 12:05:30 -04:00
Dan Stillman
e9e1add9b8 Fixed filed items with annotations appearing in Unfiled Items
Fixes #2771

Regression from 20c6fe67
2022-08-19 12:05:30 -04:00
Abe Jellinek
22b00c33de Empty Trash: Visually remove deleted items, refresh icon (#2606)
There were a few problems causing the incorrect behavior:
1. Rows were being removed only if they had no non-deleted children, which
   wasn't the right check. We want to remove all rows with no *deleted*
   children.
2. Children of the removed rows weren't being removed with them.
3. We weren't invalidating the tree (which _removeRows() doesn't do).

Also:

* Erase trashed annotation after getAnnotations() test

Because ItemTree#notify() doesn't yet correctly handle refresh events on
parent items that are themselves children (three-level nesting: item ->
attachment -> annotation), this test was causing a failure in
itemTreeTest.js.
2022-08-19 09:14:24 -04:00
Martynas Bagdonas
40ae2e3246 Fix navigation to annotation when opening an unloaded PDF reader tab
Regression from 142e3b09
2022-08-18 04:12:44 -04:00
Martynas Bagdonas
8ca7356489 Fix regression for broken "Snow in Page"
Fixes #2764
Regression from 7ec54fd
2022-08-18 04:12:44 -04:00
Abe Jellinek
0eaf5887ea fx-compat: Scaffold: Use platform keys like zoteroPane 2022-08-17 16:47:39 -04:00
Abe Jellinek
f5f49c7b1d fx-compat: Scaffold: Non-async detectWeb and async scrape by default
We don't usually want an async detectWeb, since HTTP requests should only be
used there in very exceptional cases. We do usually want an async scrape (and we
were already - mistakenly - awaiting it).
2022-08-17 16:31:30 -04:00
Dan Stillman
f7b8d25e75 Update localized string for pdf-reader 2022-08-17 03:47:30 -04:00
Dan Stillman
d3d6a6be48 Fix and disable item-tree test for emptying trash
20c6fe6737 caused this to start failing, but only because the test was
testing something too specific. The change in that commit caused more
rows to be left behind when emptying the trash (for reasons I should
probably look into), but the trash wasn't being emptied properly before,
which #2606 should fix. This test should be restored as part of that PR.
2022-08-17 03:35:54 -04:00
Dan Stillman
402dc286d1 Update pdf-reader submodule 2022-08-17 03:35:28 -04:00
Dan Stillman
c3ee588bfe Match parent attachments for annotation tags
Expose annotation tags in tag selector and match parent attachments when
filtering/searching

This also fixes searching for annotation text or comments when using
Everything quick search.

This is temporary until we display annotations in the items list
directly.
2022-08-17 03:35:28 -04:00
Dan Stillman
eca253d4a3 Update pdf-reader submodule 2022-08-16 06:09:09 -04:00
Dan Stillman
6cd1a41a32 Fix importing of standalone attachments without URLs
And allow `importSnapshotFromFile()` without `parentItemID` or
`libraryID`, which is more consistent with other attachment functions

Follow-up to 318e4852e9

https://forums.zotero.org/discussion/comment/414802/#Comment_414802
2022-08-16 06:09:00 -04:00
Abe Jellinek
b03657add3 fx-compat: Use DOMParser constructor in _eventToEventTitle 2022-08-15 10:38:11 -04:00
Dan Stillman
676abca671 Fix importing of standalone attachments
Maybe has been broken for years?

https://forums.zotero.org/discussion/99020/warning-data-loss-when-exporting-collections
2022-08-13 16:24:14 -04:00
Dan Stillman
d546caca4c Don't relate book sections to each other when creating from book
Fixes #2757
2022-08-13 05:46:04 -04:00
Dan Stillman
344a10421a Fix copying of standalone attachments between libraries
Regression in f684984b07 (maybe a race condition)
2022-08-13 02:04:07 -04:00
Abe Jellinek
30197a09d2 Revert mistaken change from 26069a580a
Shouldn't have made it into that commit.
2022-08-12 15:36:54 -04:00
Abe Jellinek
fc86bdb55c fx-compat: Fix error when Edit menu is shown 2022-08-12 15:34:27 -04:00
Abe Jellinek
26069a580a fx-compat: Fix Quit when main window is closed
Application menu items, contrary to the comment I added in a654ad291f,
actually *do* belong in hiddenWindow.xhtml so that they still work when
zoteroPane.xhtml is closed. They just can't be split between there and
zoteroPane.xhtml. This commit moves all of them to hiddenWindow.xhtml and
reimplements openPreferences() in a non-Zotero-object-dependent way.

Fixes #2738
2022-08-12 15:34:26 -04:00
Abe Jellinek
9ab813ebdc fx-compat: Item box: Vertically center field contents
Fixes alignment of the "y m d" label on the date field and the buttons to the
right of creator fields.
2022-08-11 16:46:03 -04:00
Abe Jellinek
333cf8cc2a
Add Book -> Book Section and Book Section -> Book to context menu (#2754) 2022-08-11 16:28:32 -04:00
Martynas Bagdonas
4f52eb9be3 Fix PDF reader selector popup that was never opening
(cherry picked from commit e4e3c72036)
2022-08-11 14:22:52 +03:00
Martynas Bagdonas
d1550a3fd5 Fix regression preventing opening PDF reader window when the tab is open
(cherry picked from commit 0857cefb0c)
2022-08-11 14:22:52 +03:00
Adomas Venčkauskas
d6909ec8e5 Update SingleFile config for current version
They got updated upstream and the backwards-compat code
does not run for the way we execute singlefile

See https://github.com/gildas-lormeau/SingleFile/issues/1021
Addresses https://github.com/zotero/zotero-connectors/issues/398
2022-08-11 14:00:40 +03:00
Adomas Venčkauskas
2dd54fddf4 Prevent singlefile config from overwriting the Zotero.SingleFile namespace 2022-08-11 13:51:57 +03:00
Dan Stillman
c90f8415b3 Improve test for event-title substitution
And add comments

Follow-up to 20d0f103f
2022-08-11 03:57:25 -04:00
Dan Stillman
ebacb83563 Reset Zotero.locale to 'en-US' after cite test 2022-08-11 03:57:20 -04:00
Dan Stillman
7eab91a160 Automatically substitute event-title for event in styles
Stopgap until styles are updated in citation-style-language/styles#6151
2022-08-11 03:57:15 -04:00
Abe Jellinek
df5bde79e5 Add test for 87455d 2022-08-11 03:57:09 -04:00
Dan Stillman
57b91a0add Move item box comment from 87455d28c3
The code seems to have already been applied on the fx102 branch
2022-08-11 03:56:46 -04:00
Abe Jellinek
678a6101b3 Advanced Search: Make sure items are loaded (#2743) 2022-08-11 03:53:39 -04:00
Dan Stillman
72d4cdd3a3 Don't preselect Act for multiple sources in classic citation dialog
"Multiple Sources…" wasn't properly handled by 629892b0b8

https://forums.zotero.org/discussion/98877/act-instead-of-page
https://twitter.com/drezvera99/status/1554521940684984320
2022-08-11 03:53:34 -04:00
Martynas Bagdonas
098886bcb6 Select existing unloaded tab instead of opening a new one
Fixes #2740
2022-08-11 03:52:53 -04:00
Martynas Bagdonas
9190eb8f34 Allow to scroll tabs with mouse wheel
Fixes #2724
2022-08-11 03:52:45 -04:00
Abe Jellinek
1f9e518581 Duplicates Merge: Preserve embedded annotations (#2728) 2022-08-11 03:52:40 -04:00
Adomas Venčkauskas
63148dff3b Do not load-timeout on browser PDF download during content load
Closes #2726
2022-08-11 03:52:31 -04:00
Martynas Bagdonas
d595b3f195 Freeze note schema version to 8
We can do it because it was only used to create a note from annotations.

No need to update schema version in Zotero client, unless using new
features when creating a note from annotations.
2022-08-11 03:50:06 -04:00
Martynas Bagdonas
44ef4cd35a Fix regression that prevents showing the last selected tab on startup
Fixes #2723
2022-08-11 03:50:01 -04:00
Martynas Bagdonas
b02ad0dc83 Fix regression that prevents showing new notes in contextPane notes list 2022-08-11 03:49:52 -04:00
Adomas Venčkauskas
1955427d62 Fixes some assets not being saved with SingleFile snapshots
Part of zotero/zotero-connectors#394

When saving an item (e.g. on arxiv) with a site translator, the
translator may add a custom snapshot attachment URL which does not match
the translation URL (the URL in the browser where translation was
initiated) in which case Zotero handles snapshot saving. Zotero loads
the page in a background browser. By default images are not loaded in
this browser. SingleFile due to CORS restrictions has to refetch all
resources that are not from the same domain or subdomain, but uses
pre-loaded resources (images) from the same domain. Before this change
any images that were from the same domain as the saved website were not
saved in the snapshot. This commit fixes that.
2022-08-11 03:49:52 -04:00
Adomas Venčkauskas
3ba78dec78 Changes for updated SingleFile submodule 2022-08-11 03:49:52 -04:00
Adomas Venčkauskas
66f5647069 Update SingleFile submodule 2022-08-11 03:49:52 -04:00
Dan Stillman
f46c0986d3 Localize "Export PDF…" menu option
Fixes #2710
2022-08-11 03:49:52 -04:00
Dan Stillman
a33775d2a1 Update translate submodule 2022-08-11 03:49:52 -04:00
Dan Stillman
e83a7e49e0 Update global schema 2022-08-11 03:49:52 -04:00
Dan Stillman
54a7211a45 Update locales from Transifex 2022-08-11 03:47:00 -04:00
Dan Stillman
1e5fd2d551 Disable sort tests from 26a5e2900a for now
Until I can figure out the race-condition breakage they trigger later in
the file
2022-08-11 03:46:56 -04:00
Dan Stillman
8bce2b1fdd Increase Mendeley API timeout to 60 seconds
To see if we can fix the 30-second timeout here:

https://forums.zotero.org/discussion/comment/412750/#Comment_412750
2022-08-11 03:46:51 -04:00
Dan Stillman
393b1f8369 Add warning in toolbar for 'dev' channel builds 2022-08-11 03:43:03 -04:00
Dan Stillman
e6a2a12d6e Update note-editor and pdf-reader 2022-08-11 03:19:11 -04:00
Dan Stillman
1ea65a09b5 Update translators 2022-08-11 03:17:48 -04:00
Martynas Bagdonas
7089ce8fc7 Use Quick Copy (Markdown) for direct plain-text copying from note-editor
Fixes #2505
2022-08-11 02:49:07 -04:00
Abe Jellinek
bd18339797 Prevent deleting My Publications
Previously showed a blank confirmation dialog and logged an error.
2022-08-11 02:48:59 -04:00
Martynas Bagdonas
221aa25e00 Prevent delayed context pane expansion and pdf-reader rerender/resize when switching from library tab 2022-08-11 02:48:54 -04:00
Martynas Bagdonas
4ab154c4bf Don't include quotes when {{highlight}} is placed in a blockquote
Fixes #2697
2022-08-11 02:48:49 -04:00
Martynas Bagdonas
fcb63465ac Include quotation marks for highlights by default, but allow to disable
Fixes #2697
2022-08-11 02:48:44 -04:00
Dan Stillman
612fec8961 Fix test failure after 26a5e2900a 2022-08-11 02:48:39 -04:00
Dan Stillman
d3942ad1f0 Better fix for errors from invalid sort fields
Just catch the error from `ItemTree::sort()` and clear the
secondary-sort and fallback-sort prefs so that sorting works on the next
attempt.

Replacement for a8ed30ce80

https://groups.google.com/g/zotero-dev/c/kc0-C6-SA74/m/bhHniGceAQAJ
2022-08-11 02:48:35 -04:00
Dan Stillman
d747da7c65 Revert "Validate fields in ItemTree::getSortFields()"
This reverts commit a8ed30ce80 and related
commits.

We'll address breakage from invalid sort fields another way, without
inconveniencing plugin authors.

https://groups.google.com/g/zotero-dev/c/kc0-C6-SA74/m/bhHniGceAQAJ
2022-08-11 02:48:31 -04:00
Dan Stillman
9dc8995ba8 Sort empty rows last for Date/Year columns when descending
Date columns start in descending order, so put empty rows at end

Also remove a seemingly unnecessary exception for Title when not the
primary sort and just always sort it with empty rows first
2022-08-11 02:48:26 -04:00
Dan Stillman
e25ec0d981 Fix sorting of attachments and notes columns
Regression from a8ed30ce80
2022-08-11 02:48:22 -04:00
Dan Stillman
3ab661b628 Fix sorting by Item Type and feed item itemID
Regression from a8ed30ce80
2022-08-11 02:48:16 -04:00
Dan Stillman
cba70856b7 Increase downloadPDFViaBrowser.onLoadTimeout to 3000
Apparently necessary for some people to get PDFs on ScienceDirect. We
should come up with a better way of detecting the page load if we can,
so that we can avoid this long of a timeout for people who just will
never have access to ScienceDirect PDFs.

https://forums.zotero.org/discussion/comment/411056/#Comment_411056

Addresses #2698
2022-08-11 02:48:11 -04:00
Dan Stillman
5620dc96bd CookieSandbox: Fix error setting request cookies
Regression from 6af3b0276a, showing up as "trackedBy is undefined" error

https://forums.zotero.org/discussion/98322/no-snapshot-or-pdf-autosaved-using-zotero-connector-on-safari
2022-08-11 02:48:06 -04:00
Dan Stillman
74f00e60c7 Merge new English strings 2022-08-11 02:47:51 -04:00
Dan Stillman
2c11aadc57 Add localized string for timestamp CSL locator
Not included in the CSL locales:

https://forums.zotero.org/discussion/comment/412060/#Comment_412060
2022-08-11 02:47:46 -04:00
Dan Stillman
c4c940722b Merge new English strings 2022-08-11 02:47:38 -04:00
Dan Stillman
7b247e73df Tweak confirmation message for recursive collection-item removal
I guess the "its" is technically a little clearer, but it's a bit
awkward, and I think it's reasonably implied.
2022-08-11 02:47:33 -04:00
Abe Jellinek
b18967fba4 recursiveCollections: Remove from all subcollections on delete (#2689) 2022-08-11 02:47:28 -04:00
Dan Stillman
90179caa72 Update pdf-reader and pdf-worker submodules 2022-08-11 02:47:23 -04:00
Dan Stillman
cac0e7ee50 Update locales from Transifex 2022-08-11 02:47:19 -04:00
Dan Stillman
387e4dd958 Add CSL 1.0.2 locators and switch to CSL locales for localization
And move Page to middle of list, while still selecting by default

https://forums.zotero.org/discussion/comment/396602/#Comment_396602
2022-08-11 02:47:15 -04:00
Dan Stillman
fea99bf8f8 Fix test failure after a8ed30ce8
We added a `toggleSort()` call on the title, so then when called again
it reverses the direction. To avoid, sort by creator and then title in
the second test.
2022-08-11 02:47:09 -04:00
Dan Stillman
92a1a43cbb Validate fields in ItemTree::getSortFields()
To avoid startup hang if a plugin does something bad:

https://forums.zotero.org/discussion/comment/411843/#Comment_411843

Fixes #2692
2022-08-11 02:47:04 -04:00
Tom Najdek
a7c5f78107 Improve log output for multiple Mendeley imports
Helps with debugging cases where new import is started while previous
one is still being cancelled
2022-08-11 02:46:47 -04:00
Tom Najdek
9acf1ac42e Lint code related to Mendeley importer 2022-08-11 02:46:42 -04:00
Tom Najdek
141258d564 Fix a bug in regex extracting fields to "extra"
Because regex is built using a template string, \s* is actually escaped
into s*, i.e. literal "s" appearing 0 or more times. In most cases this
would mean that output can have spacing slightly off. In extreme case,
when identifier starts with letter "s", this could this could lead to
identifier being stored incorrectly.

Also adjusted tests to be more strict and mock data to cover this case.
2022-08-11 02:46:37 -04:00
Tom Najdek
c9400c565c Mendeley import: detect win close, better feedback
* Detect wizard cancel/close and interrupt import. This will still
  have to wait for current fetch (file or metadata) to complete but will
  then advance to the cleanup stage
* Advance progress bar during metadata fetch
* Add some extra logging
2022-08-11 02:46:31 -04:00
Tom Najdek
4b86c2a3fd Don't try to remove temporary dir after import
Previously we had a structure that also created folders in temp dir,
that has since changed but code in cleanup phase to remove containing
dir has been accidentally left unremoved.
2022-08-11 02:46:26 -04:00
Martynas Bagdonas
5f6d6da154 Fix disabled "Add to Note" when a child note is open
Fixes #2687
2022-08-11 02:46:17 -04:00
Dan Stillman
01dc397afd Update global schema and utilities for CSL 1.0.2 2022-08-11 02:43:53 -04:00
Martynas Bagdonas
ca3e048b78 Adjust page rotation labels in PDF reader
Fixes #2669
2022-08-11 02:43:47 -04:00
Martynas Bagdonas
b9f4a7835a Show parent item title for child notes in context pane
Fixes #2681
2022-08-11 02:43:32 -04:00
Dan Stillman
31f78989d2 Update pdf-reader submodule 2022-08-11 02:40:38 -04:00
Martynas Bagdonas
b5bdae3d6d Implement smart notes switching in contextPane (#2671)
Fixes #2650
2022-08-11 02:38:55 -04:00
Dan Stillman
5920c5d3e5 Update utilities submodule and date-parsing tests
Includes strToDate() fixes
2022-08-11 02:36:04 -04:00
Dan Stillman
9c6d7abc76 Update locales from Transifex 2022-08-11 02:35:56 -04:00
Martynas Bagdonas
4de31ebb85 Update pdf-reader and note-editor, use specific prebuilds, tweak code 2022-08-11 02:35:36 -04:00
Adomas Venčkauskas
3ff650f046 Limit the force-click during drag fix to macOS (4fb0661b) 2022-08-11 02:34:29 -04:00
Adomas Venčkauskas
9feb2fc6cf Fix alt-arrow not working on macOS when editing collection names.
Fixes #2651
2022-08-11 02:34:24 -04:00
Adomas Venčkauskas
1937220099 Fix force-click during drag sometimes causing collections to switch
Closes #2652
2022-08-11 02:34:17 -04:00
Abe Jellinek
48ad6dcb99 Fix error if New Collection prompt is canceled 2022-08-11 02:34:12 -04:00
Dan Stillman
3fb9e2162e Use String.fromCharCode() to load Chinese characters in strToDate() test
Follow-up to dc045250a6
2022-08-11 02:34:06 -04:00
Dan Stillman
56151a4198 Fix parsing of Chinese and other non-ASCII month names
https://forums.zotero.org/discussion/97683/bug-locale-issues-concerning-zotero-and-zotero-connector
2022-08-11 02:33:58 -04:00
Dan Stillman
c8cc97dd97 Properly strip ZWJ in isOnlyEmoji() 2022-08-11 02:33:54 -04:00
Dan Stillman
011b60af61 Fix Emoji detection
And move to Zotero.Utilities.Internal.isOnlyEmoji()

Fixes #2643
2022-08-11 02:33:41 -04:00
Abe Jellinek
3481def4f6 Fix sorting by attachment (#2586) 2022-08-11 02:33:03 -04:00
Dan Stillman
d14700606d Update locales from Transifex and merge new English strings 2022-08-11 02:32:54 -04:00
Dan Stillman
6828e24481 citeproc-js: Add space after left margin in plain-text mode
This adds a space after the the number in some numeric styles ("[1]" in
IEEE style, "1." in Nature) when pasting bibliography entries into a
plain-text editor.

Some styles (ACS, AMA, Vancouver) will need to be updated to remove
their hard-coded spaces to avoid double spaces after this change.

Patch from @zepinglee

Fixes #2633
2022-08-11 02:32:39 -04:00
Martynas Bagdonas
bfc61a69ba Add support for PDF page deletion and rotation (#2595)
* Add support for PDF page deletion and rotation
Fixes #2561
2022-08-11 02:32:30 -04:00
Adomas Venčkauskas
44e8a372e5 Fix a MIMETypeHandler.removeHandler() bug 2022-08-11 02:31:33 -04:00
Adomas Venčkauskas
1687d4caad Improve downloadPDFViaBrowser handlers and logging 2022-08-11 02:31:28 -04:00
Adomas Venčkauskas
f88cc8b988 Fix cookieSandbox not overriding user agent if no cookies for domain.
Potential fix for #2635
2022-08-11 02:31:23 -04:00
Martynas Bagdonas
266ea99a77 Fix library tab tooltip always staying on top 2022-08-11 02:31:15 -04:00
Dan Stillman
b1c2b9e005 Fix detection of some emoji set as colored tags
Emoji such as ⭐️ that began as text-based Unicode characters and depend
on Variation Selector-16 to display the emoji presentation weren't being
properly detected.
2022-08-11 02:31:01 -04:00
Dan Stillman
65318a442e Fix support tests after 28ed3e34b 2022-08-11 02:29:44 -04:00
Dan Stillman
8d2745dfc5 Update global schema
Includes the Preprint archiveID/number mapping for #2481
2022-08-11 02:29:30 -04:00
Dan Stillman
fdff93a961 Update locales from Transifex 2022-08-11 02:29:18 -04:00
Dan Stillman
5eecc3fc54 Add prefs for timeouts for downloading PDF via browser
1 second isn't enough for some users, so try 1.5, and allow for easier
debugging via a pref.

https://forums.zotero.org/discussion/96431/i-have-access-to-pdf-but-zotero-cannot-automatically-add-it
https://forums.zotero.org/discussion/97277/unable-to-download-papers-using-zotero-chrome-extension
2022-08-11 02:28:16 -04:00
Dan Stillman
cb2594f53f Feed import: Don't fail on OPML entry with no title or text
https://forums.zotero.org/discussion/96841/impossible-dimporter-ompl-rss
2022-08-11 02:28:03 -04:00
Martynas Bagdonas
b98a5e0545 Avoid error interrupting annotation extraction from multiple items 2022-08-11 02:25:43 -04:00
Dan Stillman
477dd69d54 Update locales from Transifex 2022-08-11 02:25:43 -04:00
Dan Stillman
82eb701ea7 Try to open external PDF reader to page number for "Show on Page"
PDF-handling code from `ZoteroPane.viewAttachment()` predates
`Zotero.OpenPDF` and didn't handle page numbers for external PDF
readers, so when called from "Show on Page" in a note (via
`ZoteroPane.viewPDF()`) it just launched the file itself in the
specified handler or via the OS.

For now, change to use `Zotero.OpenPDF.openToPage()` when there's a page
number. Later we should use `Zotero.OpenPDF` for everything, but that
code is more complicated than just using `launchFile()`, so we'll need
to do some testing (particularly on Linux) to see what's best.

(Note that "Show on Page" with an external reader doesn't make a ton of
sense, since you can't actually see the annotation, but opening the
right page is better than nothing.)

Fixes #2612
2022-08-11 02:25:43 -04:00
Abe Jellinek
139d92054f Scaffold templates: Pull URL from doc
Link URLs could lead to redirects.
2022-08-11 02:25:43 -04:00
Abe Jellinek
7d3e95e050 Fix Scaffold load error when fontSize pref is set 2022-08-11 02:25:43 -04:00
Abe Jellinek
8d75f37548
fx-compat: Add preferences with full-text/keyword search (#2659) 2022-08-10 18:26:23 -04:00
Abe Jellinek
db600cb5b9 fx-compat: Item box: Don't set flex attribute on HTML elements 2022-08-08 14:52:17 -04:00
Dan Stillman
78b0055206 Change app id to zotero@zotero.org
And remove all references to old id

We can do this because plugins will use new mechanisms for install and
update manifests that don't use the id (which also means it's now only
used internally).
2022-08-08 05:11:21 -04:00
Dan Stillman
ef33731490 fx-compat: Add message to Add-ons pane when no plugins installed
We'll want to update the rest of the instances of "extensions" or
"add-ons" to say "plugins" (unless we think we might support themes, in
which case we can keep "add-ons").
2022-08-06 03:49:40 -04:00
Abe Jellinek
cd296b1f37 fx-compat: Item box: Fix _*FieldValue(), more focus issues
_getFieldValue() and _setFieldValue() were using `.value` instead of
`.textContent`, so the few places that use it were getting/setting ignored
fields on divs.

fbc25834 messed up the tab index logic, shifting the responsibility for
preserving _lastTabIndex across refreshes: originally, the default was to throw
it away, and the caller was responsible for saving and restoring it if the
refresh was caused by tabbing between fields. The bad commit reversed the
situation and made the item box *remember* the _lastTabIndex by default,
meaning that a refresh caused by the notifier, for example, would focus the
last focused field even if it had been closed by the user in the meantime.

That bad change was a misguided attempt to fix the Tab key cycling infinitely
between Item Type, Title, and creators and never reaching further fields. The
actual fix was just to add `, textarea` to the query on line 1459.
2022-08-05 16:12:28 -04:00
Abe Jellinek
1315d02b2c fx-compat: Item box: Correct value margins, remove type dropmarker 2022-08-05 16:12:28 -04:00
Abe Jellinek
1ecc0b113b fx-compat: Item box: Fix auto-scroll functions 2022-08-05 12:32:03 -04:00
Abe Jellinek
cb14564174 fx-compat: Item box: Prevent editor from reopening after close
We did need to reset _lastTabIndex as the line removed in fbc25834 did, but
only immediately surrounding the saveTx() call.
2022-08-05 12:10:16 -04:00
Abe Jellinek
57abea5416 fx-compat: Item box: Remove some dead code
All already being handled by CSS (besides the exact character length limits, but
it's not clear that we really need those - we just ellipsize if it visually
overflows now, which seems fine).
2022-08-05 11:57:54 -04:00
Abe Jellinek
4e6fe4d119 fx-compat: Remove temp item type menulist logging 2022-08-05 11:49:14 -04:00
Abe Jellinek
1c36406b1e fx-compat: Item box: Fix removing creator while editing it 2022-08-05 11:45:58 -04:00
Abe Jellinek
361a83c378 fx-compat: Item box: Restore batch paste behavior
Since <input>s are single-line, we do the split operation on paste instead of on
blur.
2022-08-05 11:45:58 -04:00
Dan Stillman
53a09bb912 Add reason parameter for plugin bootstrap methods
As documented on https://wiki.mozilla.org/Extension_Manager:Bootstrapped_Extensions

And fix method names for `install()` and `uninstall()`
2022-08-05 04:51:07 -04:00
Dan Stillman
51f9150410 fx-compat: Initial plugin support
Plugins are ZIPs containing at least these two files:

- manifest.json: A WebExtension MV2 manifest with basic metadata
  properties and `applications.gecko` with `id` and `update_url`
- bootstrap.js: A bootstrap file, similar to old bootstrapped extensions,
  with `installed()`, `startup()`, `shutdown()`, and `uninstalled()`
2022-08-05 01:08:51 -04:00
Dan Stillman
e82e808f2b Update definition style of Zotero.log() and Zotero.logError() 2022-08-05 01:08:51 -04:00
Dan Stillman
e6256d60ec fx-compat: Fix logging to the browser console 2022-08-05 01:08:51 -04:00
Abe Jellinek
080ada78ee fx-compat: Item box: Prevent tabbing to hidden firstName 2022-08-04 17:20:01 -04:00
Abe Jellinek
fbc2583433 fx-compat: Item box: Fix tabbing 2022-08-04 17:02:41 -04:00
Abe Jellinek
7a22458ed4 fx-compat: Item box: Fix fieldMode resetting on blur
The fieldMode attribute of the input was being set by the call to
switchCreatorMode(), but it didn't carry over to the label that replaces it on
line 1997.

Also removed a debug line and cleaned up a bit.
2022-08-04 16:50:48 -04:00
Abe Jellinek
581f4bdf7b fx-compat: Fix parameter name typo 2022-08-04 15:10:32 -04:00
Abe Jellinek
617ede481a fx-compat: Add roles to banners
Fixes #2655 (with 0983ff)
2022-08-04 14:52:16 -04:00
Abe Jellinek
c7fc98dff6 fx-compat: editContextMenu -> editMenuOverlay
To reflect that it now handles the menu bar Edit menu as well.
2022-08-02 15:50:44 -04:00
Abe Jellinek
64155bf58f fx-compat: Fix edit context menu
The menupopup needs to be in a popupset to show correctly.
2022-08-02 15:49:06 -04:00
Abe Jellinek
27841acb83 fx-compat: Select items dialog: Fix search and make functional 2022-08-01 15:39:57 -04:00
Abe Jellinek
d4cd382092 fx-compat: Fix quick search height shifting 2022-08-01 15:36:06 -04:00
Abe Jellinek
f8ac57bdb1 fx-compat: Don't focus dropdown in quick search textbox
To match old behavior and fix autofocus.
2022-08-01 15:22:25 -04:00
Abe Jellinek
d018133e9b fx-compat: Use html-tooltip everywhere
And convert tooltiptext attributes on item box HTML elements to titles.
2022-08-01 15:02:42 -04:00
Abe Jellinek
812511e31b fx-compat: Open DOI popup as native menu, too 2022-08-01 14:29:35 -04:00
Abe Jellinek
bcf62e688f fx-compat: Item box: Use addEventListener() 2022-08-01 14:27:46 -04:00
Abe Jellinek
1ecb12048c fx-compat: Item box: Restore label top alignment 2022-08-01 14:20:34 -04:00
Adomas Venčkauskas
41907975b0 Adjust integration function comments and test dummy signature 2022-07-26 10:53:05 +03:00
Abe Jellinek
dc0b2ceb8b fx-compat: Item box: Make sure input has room 2022-07-21 16:18:32 -04:00
Abe Jellinek
808375d5e3 fx-compat: Item box: Fix creator name field sizing
Not the exact same sizing as Fx60, because that relied on some quirks
of the Mozilla box model that I can't reproduce with flexbox, but still
works about as well.
2022-07-21 16:12:28 -04:00
Abe Jellinek
37a6cc4de4 fx-compat: Item box: Fix date added/modified alignment
This CSS needs some serious cleanup, but we're getting somewhere.
2022-07-21 11:30:35 -04:00
Abe Jellinek
aeef51bc76 fx-compat: Item box: Clean up spacing 2022-07-21 11:17:31 -04:00
Abe Jellinek
1a8057aba1 fx-compat: Item box: Restore drop marker 2022-07-21 10:20:42 -04:00
Abe Jellinek
26a2398399 fx-compat: Restore guidance panels as CE
Fixes #2711.
2022-07-20 11:12:52 -04:00
Dan Stillman
8bfc42e8d8 Update version to 7.0.0 2022-07-19 22:38:01 -04:00
Dan Stillman
7b10182e4a Disable obsolete "Open in External Viewer" menu option
Hasn't done anything since in-browser viewing of certain file types in
Zotero 4 for Firefox. Perhaps we'd bring it back at some point, but
disable for now.
2022-07-19 22:38:01 -04:00
Dan Stillman
744837cce7 fx-compat: Remove Zotero.MIME.hasInternalHandler()
Hasn't been relevant since the Firefox NPAPI days, but was returning
true for `application/pdf` (possibly due to the bundled pdf.js in
Firefox still being included in our builds, which we should remove if
so), which was causing "Open in External Viewer" to appear, even though
it just opened the internal reader.
2022-07-19 22:38:01 -04:00
Abe Jellinek
5e6dc290b6 fx-compat: Scaffold: Read ESLint output from stdin
Need to update your zotero/translators clone to get linting working again.
2022-07-19 16:26:17 -04:00
Abe Jellinek
14f79018ad fx-compat: Scaffold: Fix "undefined" attributes 2022-07-19 14:44:28 -04:00
Abe Jellinek
db3aa5248c fx-compat: Scaffold: Fix list overflow in Tests 2022-07-19 14:44:28 -04:00
Abe Jellinek
8ff75607a5 fx-compat: Item box: Disable guidancepanel trigger + cleanup 2022-07-19 14:44:28 -04:00
Abe Jellinek
6f8c5d7c51 fx-compat: Item box: Make vertically scrollable 2022-07-19 14:44:20 -04:00
Abe Jellinek
083e3c7a36 fx-compat: Search: Clear join mode condition
Fixes an error that prevents changing the join mode from having an effect
after clearing the search when a join mode was already set. Bug also
present on master, not introduced with fx102.
2022-07-12 22:01:20 -04:00
Abe Jellinek
fba349b144 fx-compat: Remove more unused binding CSS 2022-07-12 14:55:12 -04:00
Abe Jellinek
5f8a5056f1 fx-compat: Remove unused progress display 2022-07-12 14:50:53 -04:00
Abe Jellinek
5c6837c1fc fx-compat: Add copyright to CE base 2022-07-12 14:47:24 -04:00
Abe Jellinek
916627b590 fx-compat: Scaffold: Fix indentation using spaces 2022-07-11 13:03:48 -04:00
Abe Jellinek
dc96c1a175 fx-compat: Fix ZP progress queue button creation 2022-07-11 13:02:51 -04:00
Tom Najdek
ea67ccc81a
fx-compat: Fix missing icon in tag selector #2679 (#2694) 2022-07-08 04:01:24 -04:00
Abe Jellinek
ab6b683d90
fx-compat: More progress on platform menus (#2675)
Not able to test on non-Mac yet, but this behavior should be right.
Removes all the #ifdefs and moves the behavior into platformKeys.js.
2022-07-07 00:04:13 -04:00
Abe Jellinek
9a8e78aaf4
fx-compat: Restore quick search menu and update styles (#2684) 2022-07-06 23:42:23 -04:00
Abe Jellinek
bc41c3b7b0 fx-compat: Make changelog link in About work 2022-07-06 15:24:31 -04:00
Abe Jellinek
abe19b9435 fx-compat: Fix error when v-t tooltip shows 2022-07-06 11:12:44 -04:00
Abe Jellinek
0983ffbef2 fx-compat: Make sync / retraction links tabbable
Addresses #2655. Still need to add roles.
2022-07-06 10:53:08 -04:00
Abe Jellinek
137c82c690 fx-compat: Make item table container vertical
Fixes retraction notice appearing to the left of the item metadata.
2022-07-05 15:40:33 -04:00
Abe Jellinek
8face792c0
fx-compat: Fix search dialogs (#2631) 2022-07-04 01:48:52 -04:00
Abe Jellinek
b78b9cad1f fx-compat: Duplicates: UI fixes
- Scroll vertically
- Restore margins between groupboxes
- Restore field version dropmarker
2022-06-30 12:32:11 -04:00
Abe Jellinek
97786bfa77 fx-compat: Fix multiline Add Item by Identifier
Now just one textarea instead of an input and a textarea.

Fixes #2677
2022-06-30 11:48:15 -04:00
Abe Jellinek
f81b4b071f fx-compat: Correct create[XUL]Element[NS]() calls
This fixes the dictionary manager and various other places where a XUL
element was being created with createElement(), and also simplifies a lot
of createElementNS(HTML_NS, ...) calls.

This might cause some minor regressions but everything tested has
worked. Not touching preferences (#2659) or bindings.
2022-06-29 11:14:40 -04:00
Abe Jellinek
8b7d959781 fx-compat: Fix column picker context menu 2022-06-29 09:27:11 -04:00
Dan Stillman
4fcde6c8c5 fx-compat: hiddenWindow.xul → hiddenWindow.xhtml 2022-06-29 06:17:21 -04:00
Dan Stillman
41f54624b1 fx-compat: Fix "Hide {-brand-shorter-name}" in Mac application menu 2022-06-29 03:38:16 -04:00
Abe Jellinek
1eb9718b6b Style editor: Light theme, leave selection if unchanged
Since onStyleModified() is called when a style is loaded.
2022-06-28 15:12:57 -04:00
Abe Jellinek
9c837b3361 Improve Monaco integration and use in csledit
And remove timedtextarea.xml. Fixes #2665.
2022-06-28 15:05:16 -04:00
Abe Jellinek
8681e8ffe9 fx-compat: Make macOS application menu shortcuts work
e.g. Cmd-H flashed the menu but didn't actually hide.
2022-06-28 12:15:11 -04:00
Abe Jellinek
00e46443a6 Add XULElementBase class for custom elements
https://github.com/zotero/zotero/pull/2631#discussion_r906723540
2022-06-28 11:52:11 -04:00
Abe Jellinek
6295050fa6
Restore platform edit menu behavior without #ifdef (#2674) 2022-06-27 23:06:01 -04:00
Abe Jellinek
f0aef79c7a fx-compat: Use permalink in comment 2022-06-27 14:26:00 -04:00
Abe Jellinek
a654ad291f fx-compat: Add comment explaining menubar change 2022-06-27 14:22:02 -04:00
Abe Jellinek
a8c4e0637b fx-compat: Restore Mac application menu
The stuff in hiddenWindow.xul doesn't seem to have been doing anything
in Fx102 anyway.
2022-06-27 14:15:11 -04:00
Abe Jellinek
89587e6b76 fx-compat: native="true" on more checkboxes/menulists 2022-06-24 09:11:38 -04:00
Dan Stillman
0120877623 fx-compat: Avoid automatic safe mode from Ctrl-C
Pressing Ctrl-C via the terminal is counted as a crash, and after three
recent crashes automatic safe mode is triggered. In Firefox, this
displays a prompt:

> Firefox closed unexpectedly while starting. This might be caused by
> add-ons or other problems. You can try to resolve the problem by
> troubleshooting in Safe Mode.

For us, that dialog doesn't appear for some reason (maybe we could make
it?) and Zotero just automatically opens in Safe Mode, which causes
state not to be restored and results in an annoying process fork that
breaks Ctrl-C. We might as well keep the automatic-safe-mode behavior
for end users, but we don't want to trigger it while working via the
terminal, so we just clear the recent crash counter when using
`-ZoteroDebug` or `-ZoteroDebugText`. (`extensions.zotero.debug.log`
won't trigger it, so it's best to use `-ZoteroDebugText`, which is
included automatically via the `build_and_run` script.)
2022-06-23 05:42:57 -04:00
Dan Stillman
3805f901cf fx-compat: Fix centering of library pane progress bar 2022-06-23 04:17:08 -04:00
Dan Stillman
f827b9ef50 fx-compat: initKeyEvent() → new KeyboardEvent()
Quick Format change is untested
2022-06-21 03:31:58 -04:00
Dan Stillman
587ae6ba7e fx-compat: Fix blurring of textarea fields in item box
And fix tests
2022-06-21 03:03:37 -04:00
Dan Stillman
563f91bf18 Rename zoteroIntlTest.js to intlTest.js 2022-06-21 01:39:31 -04:00
Dan Stillman
3743c179e1 Add missing commonDialog.js from dictionary manager
Currently provides close-on-Esc functionality
2022-06-21 01:39:07 -04:00
Dan Stillman
bbdcb92042 Add missing test data files 2022-06-21 01:39:07 -04:00
Dan Stillman
20945f60c9 fx-compat: Remove nsIURI.clone() usage 2022-06-21 01:39:07 -04:00
Dan Stillman
6297d0862f fx-compat: Replace last use of getURLSpecFromFile()
Follow-up to 8f7a160ba1

Untested, since it's in the prefs -- we'll have to see if this works
after #2659
2022-06-21 01:39:00 -04:00
Dan Stillman
789a8a5fe9 fx-compat: Use new mozILocaleService API
Replace functions with arrays, as in https://phabricator.services.mozilla.com/D6339
2022-06-20 23:09:46 -04:00
Dan Stillman
6e43d2cd4e fx-compat: Fix tags-box tests 2022-06-20 23:02:09 -04:00
Dan Stillman
3a5c24b6f1 fx-compat: Fix some tag selector tests 2022-06-20 19:32:03 -04:00
Dan Stillman
54529ab461 fx-compat: Pass dialog as second argument to waitForDialog() in tests
Makes it easier to run dialog.getButton(), etc.
2022-06-20 19:30:28 -04:00
Dan Stillman
96f6b871ce fx-compat: Fix sync error panel 2022-06-20 18:43:09 -04:00
Dan Stillman
842e100b73 Additional assertion for sync test from d0c1a1f600 2022-06-20 18:43:02 -04:00
Dan Stillman
d0c1a1f600 fx-compat: Fix sync test involving waitForDialog()
`waitForDialog()` now returns a regular window, and
`window.document.documentElement.textContent` includes all form
elements, so this updates a test to include the checkbox label.
2022-06-20 17:47:15 -04:00
Martynas Bagdonas
5b879f75c5 fx-compat: Avoid dead object errors in note-editor
Fixes #2663
2022-06-20 11:33:10 +03:00
Dan Stillman
b3077182d2 fx-compat: Fix Zotero.MIME.getMIMETypeFromURL()
Replace

```
Components.classes["@mozilla.org/network/standard-url;1"]
	.createInstance(Components.interfaces.nsIURL)
```

with

```
Services.io.newURI(url).QueryInterface(Ci.nsIURL);
```
2022-06-20 01:12:57 -04:00
Dan Stillman
30f636274b Update Notifier ids for itemBox/notesEditor custom elements 2022-06-20 00:47:50 -04:00
Dan Stillman
5bc1b6ad81 Update tests for itemBox/noteEditor custom elements 2022-06-20 00:47:50 -04:00
Dan Stillman
be3b245dbe Don't index PDF if fulltext.textMaxLength is 0
Follow-up to 13adfd131c
2022-06-19 19:03:41 -04:00
Dan Stillman
df3e7a600e Update Zotero.File.getContentsAsync() tests 2022-06-19 18:59:01 -04:00
Dan Stillman
dfff86df72 fx-compat: Fix Zotero.File.download() 2022-06-19 18:58:25 -04:00
Dan Stillman
8f7a160ba1 fx-compat: getURLSpecFromFile() → Zotero.File.pathToFileURI()
One remaining instance in the prefs that will need to be fixed
2022-06-19 15:20:54 -04:00
Dan Stillman
f8aa14d431 fx-compat: Fix feed test using Array.map() 2022-06-19 15:09:23 -04:00
Dan Stillman
fa2ad2f234 loadBrowserWindow() → loadZoteroWindow() in feed test 2022-06-19 15:07:41 -04:00
Dan Stillman
408453c9e9 fx-compat: Fix dictionaries tests 2022-06-19 04:16:53 -04:00
Dan Stillman
eb67adb257 fx-compat: Add ChromeUtils as eslint global 2022-06-19 04:16:53 -04:00
Dan Stillman
4a3ff46bd7 fx-compat: Fix waitForWindow()/waitForDialog() in tests 2022-06-19 04:16:53 -04:00
Abe Jellinek
d2dbf959b6 fx-compat: Restore old row highlight color on macOS
https://github.com/zotero/zotero/pull/2660#issuecomment-1159384470
2022-06-18 17:50:52 -05:00
Abe Jellinek
9c69f73de5 Manually remove handler instead of using once
Since we only want to remove if the target matches.
2022-06-18 03:45:32 -04:00
Abe Jellinek
a48ebe2dd7 Show native menus from toolbar 2022-06-18 03:45:32 -04:00
Abe Jellinek
a60e46dd5c fx-compat: Fix toolbar 2022-06-18 03:45:32 -04:00
Abe Jellinek
dd3385ec67 Revert "fx-compat: Remove Mac toolbarbutton images"
This reverts commit 280a1265c8.
2022-06-18 03:45:32 -04:00
Dan Stillman
d90334e883 fx-compat: Initial nsIWebBrowserPersist.saveURI() fixes
Will need additional fixes for cookie handling, etc., but this at least
fixes the signature
2022-06-17 20:29:01 -04:00
Dan Stillman
2b41b0127c Get binary contents in Zotero.File.getSample()
And fix magic numbers for content-type sniffing, which wrongly used the
Unicode replacement character (which likely just meant we were falling
back to file-extension-based detection)
2022-06-17 20:29:01 -04:00
Dan Stillman
13adfd131c fx-compat: Update full-text indexing
Use the new PageData mechanism for character set detection, don't try to
index HTML files directly without properly detecting the charset, and
generally simplify the indexing code.

HTML files are now considered cached files that require indexing and
won't be indexed automatically in Zotero.FullText.findTextInItems(),
which breaks certain expectations, including in some tests. This will
need to be addressed.
2022-06-17 20:29:01 -04:00
Dan Stillman
1dd24f7082 Remove Zotero.File.getCharsetFromFile()/addCharsetListener()
Unused in over a decade, and now replaced by the PageData actor
2022-06-17 20:29:01 -04:00
Dan Stillman
6a2949be8a fx-compat: Add HiddenBrowser.jsm
Remove Zotero.Browser and add HiddenBrowser.jsm. Post-Fission, web/file
content loads in a separate process, so it's not possible (as best as I
can tell) to directly access the contents of a hidden browser -- it just
appears as about:blank in the parent process. We now use Mozilla's
JSWindowActor mechanism [1] to get page data, including character set
and body text for full-text indexing. We'll have to evaluate other uses
of hidden browsers to see how to handle them.

This also adds include.jsm for loading the Zotero object into a JSM.

[1] https://firefox-source-docs.mozilla.org/dom/ipc/jsactors.html
2022-06-17 20:28:58 -04:00
Dan Stillman
7f748b2620 Take path or nsIFile in Zotero.File.pathToFileURI() 2022-06-17 20:24:43 -04:00
Dan Stillman
41dd75af8a Wait for Zotero.init() before returning Zotero.reinit()
Not sure if this makes a difference, but it seems more correct.
2022-06-17 20:24:43 -04:00
Dan Stillman
0dd088e98d Add loadZoteroWindow() support function for tests
`loadBrowserWindow()` will need to be updated for loading remote URLs,
but anything needing a Zotero window (including `loadZoteroPane()`) can
use this.
2022-06-17 20:24:43 -04:00
Dan Stillman
730e86d661 fx-compat: Restore tests and test using actual Zotero executable
The test runner now uses the Zotero executable from
`zotero-standalone-build/staging` rather than the Firefox from
`zotero-standalone-build/xulrunner`. Along with testing the actual
program, this restores visible UI updates during tests, which should
make debugging various things easier. We can also now remove anything
related to Zotero being an extension.

Many tests are still broken, but this at least lets us start running
them.
2022-06-17 20:24:43 -04:00
Dan Stillman
5d08359dc9 fx-compat: Update httpd.js from mozilla-central 1739f130 2022-06-17 20:24:43 -04:00
Dan Stillman
3c9dcea46b Add comment explaining CSS rule to hide menuitem icons on macOS 2022-06-17 20:24:43 -04:00
Abe Jellinek
0e1a16b96b fx-compat: Show native field/creator transform popups
No longer anchored to the element, but instead to the cursor.
2022-06-17 18:49:07 -05:00
Abe Jellinek
c31df4ae6b fx-compat: Display item box using CSS grid
- Widths are now correct
- Rows are a little too tall
- Field value vertical alignment is off
- Platform styling isn't done and some styles might be redundant
- Still can't scroll vertically
- Creator name inputs still displayed wrong
2022-06-16 16:27:16 -05:00
Dan Stillman
f454944f8c fx-compat: Fix files not showing up in debugger 2022-06-16 04:19:41 -04:00
Tom Najdek
cb3d4b1800
Fix tag selector menus not appearing on fx102 (#2654)
Also tweaked offset where a context menu appears to 1px from cursor
(was 2px) to match other context menus.
2022-06-14 18:28:02 -04:00
Abe Jellinek
cd17c90f2e fx-compat: Don't show hidden types in Item Type menu 2022-06-10 14:03:53 -05:00
Abe Jellinek
ac9e882bda fx-compat: Item box: Fix URL opening and field blurring 2022-06-10 13:59:01 -05:00
Abe Jellinek
7dd60abb11 fx-compat: Exclude menulist from clicky :active styling
Menulists only get :active for the split second when they're clicked but
the menupopup hasn't yet been shown.
2022-06-10 11:41:04 -05:00
Martynas Bagdonas
097d423275 fx-compat: Fix spellchecker and dictionary manager 2022-06-10 12:57:27 +03:00
Martynas Bagdonas
3eb65eef4f fx-compat: Fix tab text alignment 2022-06-09 16:41:24 +03:00
Martynas Bagdonas
5924753fd1 fx-compat: Fix unloaded tab loading 2022-06-09 16:30:34 +03:00
Martynas Bagdonas
64c652ea06 fx-compat: Replace eval with wrappedJSObject in PDF reader 2022-06-09 13:13:08 +03:00
Abe Jellinek
9a2e98360a fx-compat: Scaffold: Update Monaco
Now that we can. Quite a bit faster and more customizable.
2022-06-08 17:38:59 -05:00
Abe Jellinek
e537018e71 fx-compat: Initial fix for Scaffold
Not working:
- Web tests (hidden browser is broken)
- Test Updated status text
- Various platform menu things (code copied from ZP and will use whichever
  approach we settle on there)
2022-06-08 17:16:50 -05:00
Martynas Bagdonas
1b324f9bd1 fx-compat: Fix color rendering in annotation popup, use checkbox 2022-06-08 21:22:37 +03:00
Martynas Bagdonas
1e25e2ac4c fx-compat: Fix invisible caret issue in linksBox tags popup 2022-06-08 21:22:37 +03:00
Martynas Bagdonas
a7bc25b553 fx-compat: Fix PDF reader window 2022-06-08 18:57:26 +03:00
Martynas Bagdonas
08089d6120 fx-compat: Fix tooltip node to work in PDF reader tab 2022-06-08 18:57:26 +03:00
Martynas Bagdonas
2e5388af5b fx-compat: Implement tagsBox element 2022-06-07 17:13:48 +03:00
Abe Jellinek
7e55ea59bb fx-compat: Item box: Change creator type label correctly 2022-05-31 16:31:20 -07:00
Abe Jellinek
b9f3bea8c3 fx-compat: Attachment box: Only add listener once 2022-05-31 16:30:55 -07:00
Abe Jellinek
1b74befd64 fx-compat: Fix Item Type menu regression 2022-05-31 15:04:14 -07:00
Abe Jellinek
d3555228b2 fx-compat: Fix Duplicate Items merge view 2022-05-31 14:57:47 -07:00
Abe Jellinek
59d5013952 fx-compat: Item box: Fix menu actions, plus/minus buttons 2022-05-31 11:23:19 -07:00
Abe Jellinek
496f34117c fx-compat: Fix attachment rename, remove <links-box> observer
<links-box> doesn't actually have a notify() method, so an error was
being thrown on each notification.
2022-05-27 13:28:07 -06:00
Abe Jellinek
1ef40d9423 fx-compat: Fix attachment box 2022-05-27 12:56:13 -06:00
Martynas Bagdonas
307701788f fx-compat: Fix and extract notesBox into a separate element 2022-05-27 13:21:18 +03:00
Abe Jellinek
ed572df563 fx-compat: 2xize clicky 2022-05-26 12:38:42 -06:00
Abe Jellinek
f05d6fe0e0 fx-compat: Fix basicViewer for http(s):// URLs
maychangeremoteness="true" is required to successfully load pages from
the web even though we never actually change remoteness.

https://searchfox.org/comm-central/rev/2cf3a09a0127fe73e932c5ee793986f3bed2ccd2/mail/base/content/aboutMessage.xhtml#118
2022-05-26 10:45:57 -06:00
Abe Jellinek
e26fd18450 fx-compat: Change autocomplete-input load method 2022-05-26 09:39:30 -06:00
Martynas Bagdonas
0079fbdb08 fx-compat: Fix relatedBox 'Add' button visibility 2022-05-26 18:31:07 +03:00
Martynas Bagdonas
db0ac723fa fx-compat: Note editor and links box fixes:
- Add links-box component (inside noteEditor.js).
- Add related-box component and fix related pane.
- Use tagsBox.jsx instead of tagsbox.xml in note editor links box popup.
- Remove CSS styles and bindings for noteeditor, relatedbox and tagsbox.
2022-05-26 18:23:31 +03:00
Martynas Bagdonas
4a1812e5ba fx-compat: Fix selectItemsDialog 2022-05-26 18:23:31 +03:00
Tom Najdek
1fbed10375
Report correct path for outFiles in symlink task (#2639) 2022-05-26 05:48:27 -04:00
Tom Najdek
89dd6faa2b
Run add_omni_files for changes to symlinked files (#2638) 2022-05-26 05:14:16 -04:00
Dan Stillman
5ac4bc6d8b
Merge pull request #2636 from tnajdek/fx102-improve-build
Fx102 improve build
2022-05-25 17:34:20 -04:00
Abe Jellinek
27e5e3ca29 fx-compat: Item box: Visual fixes
- Override normal cursor on Abstract label
- Disable textarea resize
- Show clicky hover/active backgrounds on Item Type menu
2022-05-25 13:34:57 -06:00
Abe Jellinek
4a856b94cc fx-compat: Item box: Fix abstract expander 2022-05-25 13:22:52 -06:00
Abe Jellinek
3566d1fc1f fx-compat: Item box: Fix item type menulist
- Use IDs as list item values
- Use addEventListener() so events are actually received
- Put menulist inside <td>
    * This causes a small appearance regression at the moment because
      <td> margins/padding are a bit off, but that issue is visible on
      all other fields already.
2022-05-25 12:51:15 -06:00
Tom Najdek
8b76bf6e65
Run add_omni_file script when file change detected 2022-05-25 19:56:23 +02:00
Tom Najdek
7aa3bde170
On error, ring the bell
Should help with noticing syntax errors etc.
2022-05-25 19:37:20 +02:00
Tom Najdek
eb5f2978cc
Fix a problem with build when switching branch
When switching between master and fx102 bogus files were created outside
of the build/ directory. That's because previously we had a symlinked
file itembox.css and now we compile a file itemBox.css into the same
directory. However when running `npm start`, after switching branch, the
symlink still existed and thus when writing a new file, symlink was
followed and output has been written inside a source file instead.

Build system will now run cleanup step first (where it checks if files
frim `.signatures.json` still exist in src), then proceed with build,
so old symlinks will be removed thus producing a valid build.

This problem probably only happened on case-insensitive file-systems
(like default config on macOS HFS+).
2022-05-25 16:38:16 +02:00
Tom Najdek
32c0d228cc
Fix all scss files rebuild on every non-js change
multimatch test was incorrect triggering scss rebuild on every change
that reached that logic.

Also fixed weird (legacy?) use of path.join()
2022-05-25 16:10:15 +02:00
Abe Jellinek
c2ce5c7596 fx-compat: Remove duplicate menulistItemTypes.js 2022-05-24 15:56:09 -06:00
Abe Jellinek
5d96f9960a fx-compat: Item box: Fix unstyled menulists 2022-05-24 15:48:10 -06:00
Abe Jellinek
fdd73d4ada fx-compat: Item box: Fix multiline fields & autocomplete 2022-05-24 15:42:54 -06:00
Abe Jellinek
02bcb1712c fx-compat: Fix content shrinking to half of window height
On my system, this would always happen after adding a new attachment.
2022-05-24 13:59:12 -06:00
Abe Jellinek
29b270e761 fx-compat: Fix progress queue / Find Available PDFs 2022-05-24 13:52:52 -06:00
Abe Jellinek
195dd379d9 fx-compat: Fix context menu icons showing on Mac
Why does :is match when a regular selector doesn't? I have absolutely no
idea, but it's more concise anyway.

Fixes #2620
2022-05-24 13:37:20 -06:00
Abe Jellinek
87decd0f8d fx-compat: Fix _getExtensionFromURL() 2022-05-24 12:07:30 -06:00
Abe Jellinek
300af4477f fx-compat: Fix Attach Link dialog 2022-05-24 12:02:37 -06:00
Abe Jellinek
a2215cb8f6 fx-compat: Fix hard confirmation dialog
ID changed to commonDialog so we get commonDialog.css styling for free.
2022-05-24 11:43:45 -06:00
Dan Stillman
1a1a5924da fx-compat: Simplify Zotero.File.download()
`NetUtil.newChannel()` can take a string spec, so don't bother parsing
to an nsIURI first

Follow-up to 7adb8fd150
2022-05-24 03:03:36 -04:00
Abe Jellinek
7adb8fd150 fx-compat: Fix Zotero.File.download() 2022-05-24 00:47:22 -06:00
Abe Jellinek
eae9a4447d fx-compat: Mostly fix locateManager
Still many selectors to update in preferences.css, but how we do that
depends on what our <prefwindow>/<prefpane> replacement looks like.
2022-05-24 00:46:39 -06:00
Martynas Bagdonas
7b4c4e528c fx-compat: Fix context pane:
- Stacked view.
- Item pane tabs.
- Note list search box.
2022-05-19 14:10:51 +03:00
Martynas Bagdonas
e99a0d4515 fx-compat: Partial fixes for note editor 2022-05-19 14:10:51 +03:00
Dan Stillman
29bc36c02a fx-compat: Tweak styling of Create Bibligraphy window
And generalize CSS rules for richlistitem and groupbox headers (using
HTML H2s for the latter, as Mozilla does)

Follow-up to 547311ff26
2022-05-19 02:06:42 -04:00
Dan Stillman
9bf61f9914 fx-compat: Update CSL Edit window 2022-05-18 23:45:51 -04:00
Dan Stillman
d6e0c90baa Revert "fx-compat: Fix item box CSS link casing"
This reverts commit 4c21a42b53.

itemBox.css is correct
2022-05-18 23:45:51 -04:00
Abe Jellinek
948b09a27f fx-compat: Remove uses of defunct DOM constructors
This fixes feed translation. Getting a lot of '[object Object]' fields
from that, but I don't think it's related to these changes.
2022-05-18 20:03:37 -07:00
Abe Jellinek
09ec5b1fde fx-compat: Fix ProgressWindow
popup -> alwaysontop because popup removes the background.
2022-05-18 19:52:59 -07:00
Abe Jellinek
547311ff26 Fix Create Bibliography
listbox is gone, but richlistbox is still here as a custom element and
works fine for cases where we don't need virtualization.

groupbox label and richlistitem styles should probably be copied to
somewhere global once tuned a bit.
2022-05-18 19:32:39 -07:00
Abe Jellinek
4c21a42b53 fx-compat: Fix item box CSS link casing 2022-05-17 10:03:29 -07:00
Abe Jellinek
5f24b2dc98 Fix Create Parent dialog 2022-05-17 09:47:19 -07:00
Martynas Bagdonas
8dae561557 fx-compat: Remove ';' because style.setProperty fails in note-editor 2022-05-17 14:40:04 +03:00
Abe Jellinek
49a9c2dba9 fx-compat: Fix Export dialog
RDF isn't working yet, but CSV works well.
2022-05-16 14:27:23 -07:00
Abe Jellinek
60606a8528 fx-compat: Fix Add to Collection menu
Document.createXULElement is handy.
2022-05-16 13:18:16 -07:00
Martynas Bagdonas
9e93007355 fx-compat: Initial fixes for PDF reader, tabs and contextPane 2022-05-13 18:50:19 +03:00
Dan Stillman
4eb405d405 Update utilities submodule 2022-05-13 04:28:57 -04:00
Dan Stillman
da9154d811 fx-compat: Get basicViewer working for debug output
Doesn't work with, e.g., zotero://timeline/library
2022-05-13 04:28:57 -04:00
Dan Stillman
88afb2c495 Temporarily disable CI 2022-05-13 04:28:57 -04:00
Dan Stillman
d6875e1182 fx-compat: Switch to Mozilla's method of loading window scripts 2022-05-13 04:28:57 -04:00
Dan Stillman
9b3d7a32e3 Include error message in startup error dialog 2022-05-13 04:28:57 -04:00
Dan Stillman
248847b775 fx-compat: Fix CSS targeting for Big Sur and later in chrome.manifest 2022-05-13 04:28:57 -04:00
Dan Stillman
7c458b9bd3 fx-compat: Fix positioning of some context menus 2022-05-13 04:28:57 -04:00
Dan Stillman
bc68b6e9fe fx-compat: Start to fix tag color chooser dialog
Among other things, need to recreate XBL <customcolorpicker> as a Custom
Element and need to change `ondialogaccept`/etc. to event listeners:

https://searchfox.org/mozilla-central/rev/b72e9d7d63bf499d1d8168291b93d4ec7fde236e/browser/components/places/content/bookmarkProperties.js#232-237
2022-05-13 04:28:57 -04:00
Dan Stillman
63634eed02 fx-compat: Fix clicking URL label
Now that it's a div rather than a label, have to use `textContent`
instead `nodeValue`
2022-05-13 04:28:57 -04:00
Dan Stillman
d797734b38 Don't use Lucida for default note font 2022-05-13 04:28:57 -04:00
Dan Stillman
516c76a4ab fx-compat: Start to update feed settings dialog 2022-05-13 04:28:57 -04:00
Dan Stillman
909d68eac3 fx-compat: Fix New Item menu 2022-05-13 04:28:57 -04:00
Dan Stillman
2e26703b50 fx-compat: goQuitApplication() now takes an event argument 2022-05-13 04:28:57 -04:00
Dan Stillman
172c2da2cc fx-compat: Add dropmarkers to toolbarbuttons 2022-05-13 04:28:57 -04:00
Dan Stillman
758c3187fc fx-compat: Update Edit menu (WIP) 2022-05-13 04:28:57 -04:00
Dan Stillman
280a1265c8 fx-compat: Remove Mac toolbarbutton images
Need to replace with proper styling, but the former approach doesn't
work with the new toolbarbutton component.
2022-05-13 04:28:57 -04:00
Dan Stillman
10a801fcc7 WIP: Localization 2022-05-13 04:28:57 -04:00
Dan Stillman
a16e0620d2 WIP: Localization 3 2022-05-13 04:28:57 -04:00
Dan Stillman
65658b16e6 WIP: Localization 2 2022-05-13 04:28:57 -04:00
Dan Stillman
77015336a4 WIP: Localization 2022-05-13 04:28:56 -04:00
Dan Stillman
c82af749ac Don't force Lucida Grande in various components on macOS 2022-05-13 04:28:56 -04:00
Dan Stillman
4f5b7bbccb Remove old commented-out lines in include.js 2022-05-13 04:28:56 -04:00
Dan Stillman
002132bc4b fx-compat: Populate Window menu on macOS 2022-05-13 04:28:56 -04:00
Dan Stillman
ebc511f418 coroutine() → async for Zotero.init() 2022-05-13 04:28:56 -04:00
Dan Stillman
f8e10f80cc fx-compat: __defineGetter__() → defineProperty() 2022-05-13 04:28:56 -04:00
Dan Stillman
13b9837524 fx-compat: Fix New Item menu and serializePersist()
`document.getElementsByAttribute` → `document.querySelectorAll`
2022-05-13 04:28:56 -04:00
Dan Stillman
9222b939ab fx-compat: Fix error viewing items
`Components.classes["@mozilla.org/network/standard-url;1"]` no longer
exists
2022-05-13 04:28:56 -04:00
Dan Stillman
31677dd296 fx-compat: Fix error generating item context menus with locate options 2022-05-13 04:28:56 -04:00
Dan Stillman
f91bf49aae fx-compat: nsIIdleService → nsIUserIdleService 2022-05-13 04:28:56 -04:00
Dan Stillman
1714351cc9 fx-compat: Fix position of collection and item context menus 2022-05-13 04:28:56 -04:00
Dan Stillman
b49b8ad140 fx-compat: Mostly fix About pane
Example of converting top-level XUL `<dialog/>` to
`<window><dialog/></window>`, which uses a Mozilla-provided `<dialog>`
Custom Element
2022-05-13 04:28:56 -04:00
Dan Stillman
9e9ecc7dcf fx-compat: XPCOMUtils → ComponentUtils for generateNSGetFactory 2022-05-13 04:28:56 -04:00
Dan Stillman
f4675c02df fx-compat: Update nsILoginManager::findLogins() calls 2022-05-13 04:28:56 -04:00
Dan Stillman
d838bc952a fx-compat: Change "pref(" prefix in prefs file to "user_pref(" for tests
We now copy the prefs file into the app omni.ja, which requires
`pref()`, but for tests we copy it to the profile directory, where it
needs to stay as `user_pref()`.
2022-05-13 04:28:56 -04:00
Dan Stillman
c7c61f72c9 fx-compat: Stop trying to load overlay.js, which was removed 2022-05-13 04:28:56 -04:00
Dan Stillman
7ee40c4682 fx-compat: Fix Add Item by Identifier window
Still a little buggy
2022-05-13 04:28:56 -04:00
Dan Stillman
8075c2d938 Remove obsolete tab.css 2022-05-13 04:28:56 -04:00
Dan Stillman
753824a7e2 fx-compat: Temporarily disable quick search bar mode menu 2022-05-13 04:28:56 -04:00
Dan Stillman
a54da965a7 fx-compat: Use search-textbox custom element for quick search bar 2022-05-13 04:28:56 -04:00
Dan Stillman
26c4bea4fd fx-compat: .boxObject was removed in Fx69
https://bugzilla.mozilla.org/show_bug.cgi?id=1519948
2022-05-13 04:28:56 -04:00
Dan Stillman
0717612b4b fx-compat: Remove contentAreaContextMenu menupopup
No longer necessary
2022-05-13 04:28:56 -04:00
Dan Stillman
260c110d05 fx-compat: Convert itembox XBL to custom element
Still lots of things to fix, particularly with styling, but the basic
functionality is there.
2022-05-13 04:28:56 -04:00
Dan Stillman
3c6f0b26af Move .zotero-clicky to its own SCSS component
This will allow it to be included in shadow DOM.
2022-05-12 05:18:47 -04:00
Dan Stillman
87f2716da8 fx-compat: zoteroPane.xul → zoteroPane.xhtml 2022-05-12 05:18:47 -04:00
Dan Stillman
abfa09df51 fx-compat: loadURI() signature change in HTTP.loadDocuments() 2022-05-12 05:18:47 -04:00
Dan Stillman
59fd8247b4 fx-compat: Remove overlay.js, since overlays no longer exist 2022-05-12 05:18:47 -04:00
Dan Stillman
d635fdda41 fx-compat: AddonManager.getAllAddons() now returns a promise 2022-05-12 05:18:47 -04:00
Dan Stillman
66a60eea64 fx-compat: Update custom protocol handler 2022-05-12 05:18:47 -04:00
Dan Stillman
94c7e0674d fx-compat: Remove 'context' from onStartRequest()/onStopRequest()/etc. 2022-05-12 05:18:47 -04:00
Dan Stillman
3a77abc8d2 fx-compat: Zotero files are now packaged in app/omni.ja, not zotero.jar 2022-05-12 05:18:47 -04:00
Dan Stillman
004d5db2c3 fx-compat: Services.console.getMessageArray() returns an actual array 2022-05-12 05:18:47 -04:00
Dan Stillman
fb8984c947 fx-compat: XULDocument → XMLDocument 2022-05-12 05:18:47 -04:00
Dan Stillman
e98a80c803 Update Bluebird 2022-05-12 05:18:47 -04:00
Dan Stillman
46a52b3e3e fx-compat: Update locales code 2022-05-12 05:18:47 -04:00
Dan Stillman
5d72d896b8 Enable the connector server by default in prefs file
It was already enabled in zotero-standalone-build, but since there's no
Firefox version there's no reason to leave it off in the client code.
2022-05-12 05:18:47 -04:00
Dan Stillman
6d5b2c3d12 Fx-compat: nsIUTF8ConverterService → nsIScriptableUnicodeConverter
It's not totally clear what this does or if it's necessary (see #1540),
but this is a replacement that Thunderbird used.
2022-05-12 05:18:47 -04:00
Dan Stillman
bbecb4d0bd fx-compat: Add appcontent container to zoteroPane.xul
Part of inlining XUL

(View with -w for real diff)
2022-05-12 05:18:47 -04:00
Dan Stillman
3454705825 fx-compat: Update devtools server loading 2022-05-12 05:18:47 -04:00
Dan Stillman
1bb99a6bc8 fx-compat: nsIWebNavigation::loadURI() signature change 2022-05-12 05:18:47 -04:00
Dan Stillman
b6f5d7183f fx-compat: Remove use of tree.treeBoxObject and change getCellAt() signature
Properties and methods are now available on the tree itself, and
getCellAt() now returns an object instead of using in-out variables.
2022-05-12 05:18:47 -04:00
Dan Stillman
ee78dd308b fx-compat: Remove XBL stylesheets (WIP) 2022-05-12 05:18:47 -04:00
Dan Stillman
3f64310d45 fx-compat: Inline all XUL overlays 2022-05-12 05:18:47 -04:00
Dan Stillman
dd2ff63019 fx-compat: Replace nsIDOMParser with new DOMParser() 2022-05-12 02:38:59 -04:00
Dan Stillman
993320655e fx-compat: Throw error if generator is passed to DB.executeTransaction() 2022-05-12 02:38:59 -04:00
Dan Stillman
03242e8984 fx-compat: DB.executeTransaction() no longer takes generator functions 2022-05-12 02:38:59 -04:00
Dan Stillman
ccbc785499 fx-compat: XPCOMUtils.generateQI() → ChromeUtils.generateQI() 2022-05-12 02:38:59 -04:00
Adomas Venčkauskas
4d35cdf095 Remove unneeded constant in virtualized table 2022-05-10 17:03:34 +03:00
Adomas Venčkauskas
eb6b14a218 Fix item tree column resizing issues
Report https://forums.zotero.org/discussion/97077/problem-with-column-width-adjustment
2022-05-10 17:02:36 +03:00
Adomas Venčkauskas
a406e62fd3 Item Tree: Fix column dividers not aligned for second-level items
Closes #2605
2022-05-10 13:52:32 +03:00
Adomas Venčkauskas
aa483f579f HTML tree: Find-as-you-type remains on matching string.
Closes #2607
2022-05-10 13:35:31 +03:00
Dan Stillman
9c86a974da Update version 2022-05-09 10:46:18 -04:00
Dan Stillman
273fc6c657 Update locales from Transifex 2022-05-09 10:05:55 -04:00
Dan Stillman
3f371f1cad Update translators 2022-05-09 09:26:43 -04:00
Abe Jellinek
db5b535ea6 Update translate submodule 2022-05-07 20:34:37 -07:00
Adomas Ven
c49a05d486
Improve column resizing robustness (#2588)
Also:

* Add staticWidth and minWidth column properties
2022-05-03 03:00:23 -04:00
Martynas Bagdonas
01645c5e51
Pin library tab (#2589)
Fixes #2575
2022-05-03 01:21:59 -04:00
Abe Jellinek
097308c5c6 Update utilities submodule 2022-05-02 17:12:39 -07:00
Dan Stillman
b6fdeeca13 Fix deadlock in integrity check before DB schema upgrade
One of the repair steps uses a transaction, which is reasonable, so
don't run integrity check within transaction at startup.
2022-05-01 02:14:45 -04:00
Dan Stillman
d201fdc119 Fix target is undefined error during upgrade from Zotero 4
https://forums.zotero.org/discussion/96811/database-upgrade-error-when-migrating-from-version-4-0-to-6-0-directly-skipping-zotero-5

Regression from 078e3bb07, probably
2022-05-01 02:14:36 -04:00
Dan Stillman
5e0674b842 Add logging for PDF exports 2022-04-30 05:17:41 -04:00
Abe Jellinek
9829ea7009
Update utilities, move tests, add to CI (#2584) 2022-04-30 04:55:11 -04:00
Dan Stillman
fd859bd976 Update locales from Transifex and merge new English strings 2022-04-29 18:28:52 -04:00
Dan Stillman
b536432866 Fix mistake in tab-unavailable integration message 2022-04-29 16:54:16 -04:00
Dan Stillman
644cce219a Tweak tab-unavailable integration message 2022-04-29 16:51:41 -04:00
Dan Stillman
294c1da8b4 Update version 2022-04-29 16:51:41 -04:00
Adomas Venčkauskas
ff920de130 Fix integration transaction getting stuck when google docs tab is closed
Closes #2583
2022-04-29 15:19:20 +03:00
Adomas Venčkauskas
fca16d2ad5 Fix find-as-you-type not matching beyond first letter
Closes #2581
2022-04-29 15:19:20 +03:00
Martynas Bagdonas
70c9bef320 Switch tabs with Cmd-Option-←/→
Fixes #2475
2022-04-29 12:56:04 +03:00
Abe Jellinek
3bfc6740c4
Add tests for improved compareCallNumbers (#2579) 2022-04-28 04:43:30 -04:00
Abe Jellinek
5196ba379b
Update typeSchemaData and builder script (#2576) 2022-04-28 02:12:29 -04:00
Martynas Bagdonas
fe14ee79a3 Show a few missing options in Tools menu when PDF reader tab is open
Fixes #2502
2022-04-27 18:20:41 +03:00
Martynas Bagdonas
41bdd36068 Add an option to disable smart quotes
Fixes #2524
2022-04-27 10:23:10 +03:00
Dan Stillman
a4cdaf0407 Show "Add Note from Annotations" in attachment context menu 2022-04-27 02:34:42 -04:00
Dan Stillman
c405fa76a1 Add sortNotesChronologically.reader pref for PDF reader notes list
And default to true. I forgot we were sorting reverse chronologically by
default in order to make it easy to open recent notes.

Follow-up to https://github.com/zotero/zotero/issues/2526 for
https://forums.zotero.org/discussion/96743/pdf-reader-two-feature-requests
2022-04-26 17:59:45 -04:00
Dan Stillman
40501c3953 Update locales from Transifex and merge new English strings 2022-04-26 17:22:39 -04:00
Martynas Bagdonas
10c8fc4c74 Implement tab duplication
Fixes #2566
2022-04-26 19:41:51 +03:00
Abe Jellinek
89aaa10504
Sort LC call numbers better, sort integers as integers (#2569)
* Update utilities submodule after https://github.com/zotero/utilities/pull/8
* Extract and add tests
2022-04-26 04:11:29 -04:00
Martynas Bagdonas
7a06671ecb Fix undefined variable issue in annotation templates 2022-04-26 08:29:42 +02:00
Adomas Venčkauskas
d96ebad82a Allow adding multiple sources at once in classic citation dialog.
Closes #2568
2022-04-25 13:28:00 +03:00
Adomas Venčkauskas
1be2d69f1e Log integration invocations before other integration actions 2022-04-25 12:43:48 +03:00
Martynas Bagdonas
b8d427790c Fix error when using a note template and checking if array is not empty 2022-04-23 14:52:24 +07:00
Adomas Venčkauskas
d9463daa66 HTML Tree: Search by typing loops instead of starting from beginning
Closes #2559
2022-04-22 10:58:25 +03:00
Dan Stillman
3d09ab4f18 Update version 2022-04-22 03:43:24 -04:00
Martynas Bagdonas
c1fde1d3d9 Improve tab title visibility and adjust scroll arrow scroll step
Fixes #2554
Fixes #2553
2022-04-22 13:07:18 +07:00
Dan Stillman
114b48d5b8 Update locales from Transifex 2022-04-21 15:46:50 -04:00
Dan Stillman
9b81e73906 Update translators 2022-04-21 15:46:50 -04:00
Dan Stillman
031ff1824b Fix middle click to close tabs (#1993) 2022-04-21 12:23:14 -04:00
Martynas Bagdonas
a8cb9bfddd Restore custom note styling
Fixes #2560
2022-04-21 13:17:04 +07:00
Abe Jellinek
f91ca9c18a Don't merge with a deleted master attachment 2022-04-20 11:04:24 -07:00
Martynas Bagdonas
142e3b09f8
Unload tabs (#2500)
- Keep all tabs unloaded on Zotero opening.
- Keep loaded only the last five selected tabs.
- Keep loaded only in the last 24h selected tabs.

Fixes #2383
2022-04-20 03:14:50 -04:00
Dan Stillman
578986ab1e Fix item types not appearing in New Item submenu
https://forums.zotero.org/discussion/96530/a-issue-about-new-item-drop-down-menu

After a type from the submenu was selected and added to the MRU, the
submenu wouldn't be updated. Not sure how long this has been going on.

Fixes #2534
2022-04-19 23:04:18 -04:00
Martynas Bagdonas
5d442b706e
Make tab bar scrollable (#2506)
Fixes #2232
2022-04-19 18:51:32 -04:00
Adomas Ven
7b0d6951d2
Update csl validator for CSL 1.0.2 (#2493) 2022-04-19 18:42:48 -04:00
Dan Stillman
3f10e4c064 Bad JSON in sync cache shouldn't break syncing
https://forums.zotero.org/discussion/95926/zotero-not-syncing-report-id-1924846177
2022-04-19 17:49:13 -04:00
Martynas Bagdonas
5c8ea0174a Fix empty table row height in generated report, prevent table overflow
Fixes #2545
2022-04-15 21:59:27 +07:00
Dan Stillman
ee10d33304 Update note-editor and pdf-reader submodules 2022-04-15 05:21:14 -04:00
Adomas Venčkauskas
5ca8486047 Adjust conditional clause for Windows from 76276a3 2022-04-15 11:21:07 +03:00
Adomas Venčkauskas
76276a39ce HTML Tree: adjust row padding per OS 2022-04-15 11:15:40 +03:00
Abe Jellinek
e8ad2fab95
getSortTitle: Only strip initial punctuation clusters (#2537)
Specifically exclude @, #, and *
2022-04-15 02:08:14 -04:00
Dan Stillman
c9b39675ba Update locales from Transifex and merge new English strings 2022-04-14 18:06:32 -04:00
Dan Stillman
498e38730b Update translate submodule 2022-04-14 18:06:32 -04:00
Abe Jellinek
d842e7a9bc Fix save() without transaction when saving search 2022-04-14 14:39:34 -07:00
Martynas Bagdonas
f494ab5114
Allow creating and editing tables in note-editor (#2511)
Fixes #2480
2022-04-14 17:17:32 -04:00
Adomas Venčkauskas
01506b27e9 Allow moving cursor by clicking on collection name while editing
Closes #2513
2022-04-14 17:03:54 +03:00
Adomas Venčkauskas
599c6821b7 Ensure columns don't resize when switching tabs 2022-04-14 16:51:13 +03:00
Abe Jellinek
1538a836b9
Show label of translator that causes import error (#2539) 2022-04-14 07:01:43 -04:00
Dan Stillman
08d3880d88 Don't remove relations in annotation item JSON
This was causing UUIDs for annotations from Mendeley imports to be
removed after a sync, resulting in annotations being duplicated on a
reimport.
2022-04-14 06:37:30 -04:00
Abe Jellinek
3792c89fbd Allow >4 numbers after the decimal point in Dewey
https://github.com/zotero/zotero/pull/2538#issuecomment-1097292396
2022-04-12 15:45:50 -07:00
Abe Jellinek
ce39185fa7
Sort call numbers alphabetically, handle Dewey specially (#2538) 2022-04-12 17:40:25 -04:00
Dan Stillman
58a1efb165 Update pdf-reader submodule 2022-04-12 05:18:42 -04:00
Dan Stillman
ad5049802f Update pdf-worker submodule 2022-04-12 03:13:02 -04:00
Dan Stillman
a72deb4648 Update locales from Transifex and merge new English strings 2022-04-12 02:57:07 -04:00
Dan Stillman
7ac4e68605 Update pdf-reader and pdf-worker submodules 2022-04-12 01:50:59 -04:00
Abe Jellinek
e03c1603ca Fix "%S" in displayed startup error message 2022-04-11 19:03:29 -07:00
Abe Jellinek
38f5551ee5
Add "Open PDF in New Window" to context menu (#2490)
Also:

* Remove Locate tooltips
2022-04-11 17:53:40 -04:00
Abe Jellinek
a5fc8b859c Context Pane: Use getNoteTitle()
ad36c9fb2a (r71022779)
2022-04-11 13:36:03 -07:00
Abe Jellinek
b8b1f8be55
Disable Import actions in uneditable libraries (#2471) 2022-04-11 16:12:43 -04:00
Abe Jellinek
ad36c9fb2a Context Pane: Sort notes in item tree order
Fixes #2526.
2022-04-11 10:13:50 -07:00
Abe Jellinek
892c1169c8 Attachment merge: Compare link mode type
Actually fixes #2527.
2022-04-11 09:30:16 -07:00
Adomas Venčkauskas
237bd8f0ce Fix Restore Column Order in Item Tree not always working
Closes #2521
2022-04-11 13:55:30 +03:00
Adomas Ven
4c445554a3
Item Tree: Attempt to fix OS font scaling (#2488) 2022-04-11 05:16:59 -04:00
Martynas Bagdonas
2af7275968 Fix template condition evaluating to true for empty string from function
Fixes #2529
2022-04-11 12:22:20 +07:00
Abe Jellinek
be0b0a7151
Always autocomplete creators in hideEditor (#2516) 2022-04-11 00:21:14 -04:00
Abe Jellinek
47a2f3cad9 Attachment merge: Compare linkModes, improve logging
Using keys instead of IDs should make logs more useful.
Fixes #2527.
2022-04-09 20:39:37 -07:00
Dan Stillman
0df8b7670d Fix broken tag selector with colored tags that differ with normalization
https://forums.zotero.org/discussion/96138/lost-content-in-tag-selector

An entered character from the CJK_COMPATIBILITY_IDEOGRAPHS block (char
code 63834, or similar) was normalized to the CJK_UNIFIED_IDEOGRAPHS
block (char code 35712), which then caused an expected key not to exist.

To fix, normalize colored tag values coming from the DB.
2022-04-09 06:24:17 -04:00
Martynas Bagdonas
2112aa7271 Don't jump back to library tab when PDF recognition finishes 2022-04-08 15:31:28 +07:00
Adomas Venčkauskas
b850d16c89 Fix integration error handling code when citeproc-rs disabled.
Closes #2508
2022-04-08 10:41:35 +03:00
Martynas Bagdonas
bdbde99fa7 Remove alpha channel from highlight color when inserting a note
Fixes #2499
2022-04-08 13:00:33 +07:00
Abe Jellinek
dea9fc5e88 Scaffold: setInterval -> activate listener 2022-04-07 19:50:13 -07:00
Abe Jellinek
a40ab83b71
Fix double separator in Edit menu on Win/Linux (#2507) 2022-04-06 23:42:13 -04:00
Abe Jellinek
fbaa1c6e61 Fix huge Scaffold toolbar icons on Win/Linux 2022-04-05 14:50:05 -07:00
Adomas Venčkauskas
c510d91461 Fix an error that causes test failures (regression 9a5657b) 2022-04-05 10:08:10 +03:00
Adomas Venčkauskas
5b9ac2ca53 Fix a non-terminal startup error introduced in d7b1a53 2022-04-05 10:08:10 +03:00
Martynas Bagdonas
ce4b82a332
Merge pull request #2423 from tnajdek/build-on-win
Fix build on win
2022-04-05 13:01:52 +07:00
Dan Stillman
28ec72666f Update locales from Transifex and merge new English strings 2022-04-04 14:02:08 -04:00
Adomas Venčkauskas
9a5657bf79 Item Tree: Fix fixed-width columns sometimes changing width 2022-04-04 16:06:51 +03:00
Martynas Bagdonas
f877476c1a Partially disable buggy ff <64 table resizing handles in note-editor
Unfortunately the first opened note will still have the handles.
2022-04-01 17:09:08 +07:00
Martynas Bagdonas
3f4030ff80 Allow copying image annotations to external text fields
Fixes #2447
2022-04-01 17:09:08 +07:00
Abe Jellinek
a5b3d6440b
Fix next duplicates set selection after merge (#2448) 2022-03-31 17:46:30 -07:00
Martynas Bagdonas
3356557493 Add 'Zoom to Page Height' PDF reader option
Fixes #2255
2022-03-31 15:52:00 +07:00
Martynas Bagdonas
8e54f1649b Add annotation to note at cursor position
Fixes #2487
2022-03-31 12:14:11 +07:00
Abe Jellinek
e922ae711a Fix ProgressQueue titles for cases, letters, etc.
Handles items with an alternate field that maps to title (like cases)
and items for which the title is usually filled in by updateDisplayTitle()
(like letters).
2022-03-30 16:30:07 -07:00
Abe Jellinek
2a1ce292d2 Remove Note Font Size -> Reset restart prompt
+ replace empty menuitem with a divider as in the Font Size menu.
2022-03-30 14:55:48 -07:00
Abe Jellinek
27c9086222 Scaffold: Show "defer" value in test list 2022-03-30 14:49:42 -07:00
Dan Stillman
bb88585699 Update version 2022-03-30 15:04:25 -04:00
Abe Jellinek
745069c070 Don't strip punctuation before numbers
Fixes #2496
2022-03-30 11:58:55 -07:00
Dan Stillman
f2209974b2 Don't show "Export PDF" in reader
Save As already exists
2022-03-30 14:13:24 -04:00
Dan Stillman
e0097df068
Remove "Store Annotations in File" option (#2498)
This is a confusing, bad option, which was already disabled in groups,
and this removes it from personal libraries as well. People seem to be
using it mainly because they think annotations are locked into Zotero if
they don't, which is causing them to ask for this to be done
automatically on every edit, which we don't do because it would result
in constant file syncing and file conflicts [1].

We provide multiple export options for exporting PDFs with annotations,
and people can use those when sharing a file with people who don't use
Zotero. Otherwise, if storing annotations in the file is a priority,
they can use an external reader that's not designed to be tightly
integrated into Zotero.

(As a rare hack, it's of course also possible to export the PDF with
annotations, replace the original file, and import the annotations.)

[1] https://www.zotero.org/support/kb/annotations_in_database
2022-03-30 13:58:59 -04:00
Tom Najdek
56321a7a6d
Fix regression: download() fails for non-http URLs (#2497)
This fixes compatiblity with some addons that use Zotero.File.download
to extract files from their XPI bundle.
2022-03-30 12:15:40 -04:00
Tom Najdek
776769f480
Citavi import: Tweak how page label is determined (#2494)
Instead of attempting to extract `PageRange` value we now let pdf worker
always determine page label.

Also improved citavi tests and fixtures.
2022-03-30 09:34:07 -04:00
Abe Jellinek
a9d7a08a05 Fix merge interface doubling rows in master selector
Master choices would occasionally be doubled in the listbox. Clearing
the innerHTML instead of using removeItemAt() fixes the issue.
2022-03-28 13:24:59 -07:00
Abe Jellinek
83702678e6 Update translators 2022-03-28 10:42:08 -07:00
Adomas Venčkauskas
d7b1a53248 HTML Tree: Improve item tree column header alignment.
Addresses #2153
2022-03-28 13:32:17 +03:00
Dan Stillman
17d9f06b65 Update more try-wrapped calls to getString 2022-03-27 02:37:49 -04:00
Dan Stillman
0842b16a51 Update version 2022-03-26 01:30:48 -04:00
Max Suica
047b639fbb
README.md: Update CI Badge (#2473)
Point visitors to our new Github Actions CI
2022-03-25 22:14:47 -04:00
Abe Jellinek
470d9cd7c2 Update more try-wrapped calls to getString 2022-03-25 16:49:52 -07:00
Abe Jellinek
82228a1072 Search: Use item field localization if string == key
91faa73b19 made getString return the key
instead of throwing on non-en-US locales, so we check if the getString
result is equal to the key even if it doesn't throw.

Fixes #2472.
2022-03-25 16:35:01 -07:00
Abe Jellinek
a3322a9afb
Merge pull request #2397 from AbeJellinek/scaffold-sanitize-for-display 2022-03-25 11:59:05 -07:00
Martynas Bagdonas
4dcb3e7a53 Fix deletion confirmation and copying in standalone PDF reader window
Fixes #2462
2022-03-25 15:53:49 +02:00
Martynas Bagdonas
2f5974e1ab Reduce probability of annotation comment/text being cleared while typing
Fixes #2361
2022-03-24 13:40:43 +02:00
Dan Stillman
91faa73b19 Don't throw from getString() for missing strings in non-English locales
Just show the key

We still merge strings before pushing betas, but this means it won't
crash for source builds, or if we forget. Not sure why we didn't do this
15 years ago.
2022-03-24 07:06:53 -04:00
Dan Stillman
1d1adbca70 Fix error merging items with missing attachment files
Fixes #2453
2022-03-24 06:39:47 -04:00
Dan Stillman
9d91e0d4f7 Update locales from Transifex and merge new English strings 2022-03-24 06:18:17 -04:00
Adomas Venčkauskas
f7e49630c8 Fix some more column picker brokenness 2022-03-24 11:00:16 +02:00
Adomas Venčkauskas
c87b40e5ca Fix secondary sort submenu breakage in 8e31bf5b 2022-03-24 10:33:58 +02:00
Adomas Venčkauskas
8e31bf5b6d Possible fix for missing More Columns submenu. Addresses #2443 2022-03-24 10:28:37 +02:00
Martynas Bagdonas
62f07a7356 Upgrade note-editor schema to v8:
- Allow highlight and citation nodes in headers

Fixes #2467
Related #2390
2022-03-24 10:21:04 +02:00
Dan Stillman
98f2d202a2 Update note-editor submodule 2022-03-24 03:32:54 -04:00
Adomas Venčkauskas
229f42bed2 HTML Tree: Change Cu.reportError() to Zotero.logError() 2022-03-23 13:28:46 +02:00
Martynas Bagdonas
23a4a14b44 Upgrade note-editor schema to v7:
- Allow ul/ol nodes to have `dir` attribute
2022-03-23 12:35:08 +02:00
Adomas Venčkauskas
c083c69be1 Fix note insertion dialog not appearing when classic mode is enabled.
Closes #2463
2022-03-23 11:58:06 +02:00
Adomas Venčkauskas
1b124bff2d Actually fix quick format color issues. See cc5e110 2022-03-23 11:28:50 +02:00
Adomas Venčkauskas
0f2273ea43 Link to manual word plugin installation instructions on install failure.
Closes #2444
2022-03-23 11:12:42 +02:00
Dan Stillman
6d4f3739de Update version 2022-03-23 00:08:42 -04:00
Dan Stillman
fcb16f628b Fix "path.startsWith is not a function" sync error on Windows
`OS.Path.join()` on Windows throws if an integer is passed. Seems like
this would happen on another computer whenever an image annotation is
deleted in a group?
2022-03-23 00:01:00 -04:00
Dan Stillman
37c48dc3ee Remove Zotero.Items.moveChildItems() transaction requirement exception
Follow-up to 734057ff9b

This was supposed to allow ZotFile to continue to work but 1) it
contained a bug and 2) another transaction messed things up for ZotFile
anyway, so we'll just fix this in jlegewie/zotfile#593.
2022-03-22 18:07:40 -04:00
Abe Jellinek
95d8b37f0a Potentially fix ProgressWindow crash
The call to _window.addEventListener() might have been causing an error
when _window was null or undefined (no main Zotero window could be
found), which would prevent _windowLoading from being set to true and
the window from being added to the ProgressWindowSet, which might have
caused unpredictable behavior when positioning windows later on.

I could only briefly reproduce the issue, so this is just one idea. The
call to addEventListener on a potentially null _window was definitely a
bug but I don't know if it caused the crash.
2022-03-22 12:55:47 -07:00
Tom Najdek
e156a46833
Fix build on win 2022-03-17 13:17:28 +01:00
Abe Jellinek
ed31a11fce Scaffold: Sanitize items for display more accurately 2022-03-09 11:42:16 -08:00
3709 changed files with 472492 additions and 116390 deletions

View file

@ -9,16 +9,10 @@
"chrome/content/zotero/xpcom/citeproc.js",
"chrome/content/ace/*",
"chrome/content/scaffold/templates/*",
"resource/react.js",
"resource/react-dom.js",
"resource/react-virtualized.js",
"test/resource/*.js"
],
"plugins": [
"@babel/plugin-proposal-class-properties",
"@babel/plugin-proposal-object-rest-spread",
"@babel/plugin-proposal-optional-chaining",
"@babel/plugin-proposal-unicode-property-regex",
[
"transform-es2015-modules-commonjs",
{

View file

@ -1,18 +0,0 @@
build/*
chrome/content/zotero/xpcom/citeproc.js
chrome/content/zotero/xpcom/isbn.js
chrome/content/zotero/xpcom/rdf/*
chrome/content/zotero/xpcom/xregexp/*
chrome/content/zotero/xpcom/translation/tlds.js
chrome/skin/default/zotero/timeline/bundle.js
chrome/skin/default/zotero/timeline/timeline-api.js
resource/bluebird/*
resource/classnames.js
resource/csl-validator.js
resource/jspath.js
resource/prop-types.js
resource/react*
resource/schema/connectorTypeSchemaData.js
resource/tinymce/*
test/resource/*
translators/*

View file

@ -1,44 +0,0 @@
{
"env": {
"browser": true,
"es6": true,
"node": true
},
"globals": {
"Zotero": false,
"ZOTERO_CONFIG": false,
"AddonManager": false,
"Cc": false,
"Ci": false,
"Components": false,
"ConcurrentCaller": false,
"ctypes": false,
"OS": false,
"PluralForm": false,
"Services": false,
"XPCOMUtils": false,
"XRegExp": false
},
"extends": [
"@zotero",
"plugin:react/recommended"
],
"parser": "@babel/eslint-parser",
"parserOptions": {
"ecmaVersion": 2018,
"ecmaFeatures": {
"jsx": true
},
"sourceType": "module"
},
"plugins": [
"react",
"@babel"
],
"settings": {
"react": {
"version": "17.0"
}
},
"rules": {}
}

4
.gitattributes vendored
View file

@ -1 +1,5 @@
*.sql text eol=lf
app/win/zotero.exe.tar.xz filter=lfs diff=lfs merge=lfs -text
app/mac/updater.tar.xz filter=lfs diff=lfs merge=lfs -text
app/win/updater.exe.tar.xz filter=lfs diff=lfs merge=lfs -text
app/linux/updater.tar.xz filter=lfs diff=lfs merge=lfs -text

View file

@ -1,9 +0,0 @@
**READ THIS BEFORE CREATING AN ISSUE**
Zotero does not use GitHub Issues for bug reports or feature requests.
Please post all such requests to the Zotero Forums at https://forums.zotero.org, where Zotero developers and many others can help. For confirmed bugs or agreed-upon changes, Zotero developers will create new issues in the relevant repositories.
Development questions involving code, APIs, or other technical topics can be posted to the zotero-dev mailing list at http://groups.google.com/group/zotero-dev.
See https://www.zotero.org/support/zotero_support for more information on how Zotero support works.

View file

@ -1,75 +1,439 @@
name: CI
on: [push, pull_request]
on:
push:
pull_request:
workflow_dispatch:
schedule:
# Monthly, to catch runner image and OS changes
- cron: '0 6 1 * *'
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: Build, Upload, Test
# Decide whether to run the network-filesystem and Windows tests: always for manual and
# scheduled runs, and otherwise only when the changes touch the Gecko version, the files
# responsible for network-filesystem database handling, or (for Windows) the files that
# make up the Windows build
changes:
name: Detect changes
runs-on: ubuntu-latest
if: >
github.event_name != 'pull_request'
|| github.event.pull_request.head.repo.full_name != github.repository
outputs:
network: ${{ steps.check.outputs.network }}
windows: ${{ steps.check.outputs.windows }}
steps:
- uses: actions/checkout@v2
- name: Check for network-filesystem-related changes
id: check
env:
EVENT: ${{ github.event_name }}
REPO: ${{ github.repository }}
SHA: ${{ github.sha }}
BEFORE: ${{ github.event.before }}
BASE: ${{ github.event.pull_request.base.sha }}
run: |
network=false
windows=false
if [[ "$EVENT" == "workflow_dispatch" || "$EVENT" == "schedule" ]]; then
network=true
windows=true
else
base="$BASE"
[[ -z "$base" ]] && base="$BEFORE"
git init -q repo && cd repo
git remote add origin "https://github.com/$REPO"
git fetch -q --depth 1 origin "$SHA"
# Run the tests if the base of the change can't be determined (e.g., a new
# branch or an unfetchable pre-force-push commit)
if [[ -z "$base" || "$base" == 0000000000000000000000000000000000000000 ]] \
|| ! git fetch -q --depth 1 origin "$base" 2>/dev/null; then
network=true
windows=true
else
files=$(git diff --name-only "$base" "$SHA")
if grep -qE '^(app/config\.sh|chrome/content/zotero/xpcom/(db|file)\.js|\.github/workflows/ci\.yml)$' <<< "$files"; then
network=true
windows=true
fi
if grep -qE '^app/(win/|build\.sh$|scripts/(dir_build|fetch_xulrunner|prepare_build)$)' <<< "$files"; then
windows=true
fi
fi
fi
echo "network=$network" >> "$GITHUB_OUTPUT"
echo "windows=$windows" >> "$GITHUB_OUTPUT"
test:
name: Test (${{ matrix.shard }})
runs-on: ubuntu-latest
timeout-minutes: 30
needs: changes
# Same-repo PRs are covered by the push run, so run pull_request jobs only for forks
if: >
github.event_name != 'pull_request'
|| github.event.pull_request.head.repo.full_name != github.repository
strategy:
matrix:
# Numbered shards split the full suite. 'smb' and 'nfs' run the db and file tests
# with the test data directory on a loopback CIFS or NFS mount, so that connection
# initialization itself runs against a network filesystem, which is where
# network-filesystem failures (startup crashes and hangs) occur. The network shards
# run only when the 'changes' job detects relevant changes.
shard: ${{ fromJSON(needs.changes.outputs.network == 'true'
&& '["1", "2", "3", "4", "smb", "nfs"]'
|| '["1", "2", "3", "4"]') }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
lfs: true
- name: Install Node
uses: actions/setup-node@v2
uses: actions/setup-node@v4
with:
node-version: 14
node-version: 24
#cache: npm
# On GitHub
- name: Install xvfb
if: env.ACT != 'true'
run: sudo apt update && sudo apt install -y xvfb
# Local via act
- name: Install packages for act
if: env.ACT == 'true'
run: apt update && apt install -y zstd xvfb dbus-x11 libgtk-3-0 libx11-xcb1 libdbus-glib-1-2 libxt6
- name: Cache Firefox
id: firefox-cache
uses: actions/cache@v2
- name: Cache xulrunner
id: xulrunner-cache
uses: actions/cache@v4
with:
path: firefox-x86_64
key: firefox-60.9.0esr
- name: Download Firefox
if: steps.firefox-cache.outputs.cache-hit != 'true'
run: wget -O tarball "https://zotero-download.s3.us-east-1.amazonaws.com/dev/firefox-60.9.0esr-x86_64-modified.tar.gz"
- name: Extract Firefox
if: steps.firefox-cache.outputs.cache-hit != 'true'
run: tar xvf tarball
path: app/xulrunner/firefox-x86_64
key: xulrunner-${{ hashFiles('app/config.sh', 'app/scripts/fetch_xulrunner') }}
- name: Fetch xulrunner
if: steps.xulrunner-cache.outputs.cache-hit != 'true'
run: app/scripts/fetch_xulrunner -p l
- name: Cache Node modules
id: node-cache
uses: actions/cache@v2
uses: actions/cache@v4
with:
path: node_modules
key: node-modules-${{ hashFiles('package-lock.json') }}
key: node-modules-24-${{ hashFiles('package-lock.json') }}
- name: Install Node modules
if: steps.node-cache.outputs.cache-hit != 'true'
run: npm install
- name: Build Zotero
run: npm run build
# Currently necessary for document-worker Webpack: https://stackoverflow.com/a/69746937
env:
NODE_OPTIONS: --openssl-legacy-provider
# Create deployment ZIP from the build output, then replace build/ with the
# unzipped contents so that tests run against the same artifact that gets
# deployed. This catches problems that only manifest after a zip round-trip
# (e.g., resolved symlinks, missing files).
- name: Create deployment ZIP
run: |
cd build
zip -r ../build.zip *
cd ..
- name: Replace build with ZIP contents
run: |
rm -rf build
mkdir build
cd build
unzip ../build.zip
- name: Set up SMB share
if: matrix.shard == 'smb'
timeout-minutes: 10
run: |
sudo apt install -y --no-install-recommends samba cifs-utils
sudo mkdir -p /srv/zotero-smb /mnt/zotero-smb
sudo chown $(whoami) /srv/zotero-smb
sudo tee -a /etc/samba/smb.conf > /dev/null <<EOF
[ztest]
path = /srv/zotero-smb
read only = no
EOF
(echo smbtestpass; echo smbtestpass) | sudo smbpasswd -s -a $(whoami)
sudo systemctl restart smbd
sudo mount -t cifs //127.0.0.1/ztest /mnt/zotero-smb \
-o user=$(whoami),pass=smbtestpass,vers=3.0,uid=$(id -u),gid=$(id -g)
- name: Set up NFS share
if: matrix.shard == 'nfs'
timeout-minutes: 10
run: |
sudo apt install -y --no-install-recommends nfs-kernel-server
sudo mkdir -p /srv/zotero-nfs /mnt/zotero-nfs
sudo chown $(whoami) /srv/zotero-nfs
echo "/srv/zotero-nfs localhost(rw,no_subtree_check,insecure)" | sudo tee -a /etc/exports
sudo exportfs -ra
sudo mount -t nfs4 localhost:/srv/zotero-nfs /mnt/zotero-nfs
- name: Run tests
if: matrix.shard != 'smb' && matrix.shard != 'nfs'
run: xvfb-run test/runtests.sh -f -r 3 -p ${{ matrix.shard }}/4
# The step timeout turns a startup hang into a failure
- name: Run tests on network share
if: matrix.shard == 'smb' || matrix.shard == 'nfs'
timeout-minutes: 10
run: TMPDIR=/mnt/zotero-${{ matrix.shard }} xvfb-run test/runtests.sh -f -r 3 -b db file
# Run the db and file tests on macOS with the test data directory on a loopback NFS
# mount. On macOS, SQLite selects locking methods without shared-memory support on
# network filesystems, which is what the network-filesystem database handling has to
# detect and handle, so this runs the real code path that crashed on SMB/NFS/sshfs
# data directories.
test-mac:
name: Test (macOS NFS)
runs-on: macos-15
timeout-minutes: 30
needs: changes
if: >
needs.changes.outputs.network == 'true'
&& (github.event_name != 'pull_request'
|| github.event.pull_request.head.repo.full_name != github.repository)
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
lfs: true
- name: Install Node
uses: actions/setup-node@v4
with:
node-version: 24
- name: Cache xulrunner
id: xulrunner-cache
uses: actions/cache@v4
with:
path: app/xulrunner/Firefox.app
key: xulrunner-mac-${{ hashFiles('app/config.sh', 'app/scripts/fetch_xulrunner') }}
- name: Fetch xulrunner
if: steps.xulrunner-cache.outputs.cache-hit != 'true'
run: app/scripts/fetch_xulrunner -p m
- name: Cache Node modules
id: node-cache
uses: actions/cache@v4
with:
path: node_modules
key: node-modules-mac-24-${{ hashFiles('package-lock.json') }}
- name: Install Node modules
if: steps.node-cache.outputs.cache-hit != 'true'
run: npm install
- name: Build Zotero
run: npm run build
# Currently necessary for document-worker Webpack: https://stackoverflow.com/a/69746937
env:
NODE_OPTIONS: --openssl-legacy-provider
- name: Set up NFS share
run: |
sudo mkdir -p /private/var/zotero-nfs
sudo chown $(whoami) /private/var/zotero-nfs
echo "/private/var/zotero-nfs -mapall=$(whoami) localhost" | sudo tee /etc/exports
sudo nfsd enable || sudo nfsd start
sleep 2
showmount -e localhost
mkdir -p "$HOME/zotero-nfs"
sudo mount_nfs -o vers=3 localhost:/private/var/zotero-nfs "$HOME/zotero-nfs"
# The step timeout turns a startup hang into a failure
- name: Run tests on network share
timeout-minutes: 10
run: TMPDIR="$HOME/zotero-nfs" test/runtests.sh -f -r 3 -b db file
# Boot the Windows build -- which uses custom-built Firefox components (xul.dll) rather
# than stock Mozilla binaries -- and run the db and file tests. A Gecko bump commit
# updates the custom-component hashes in config.sh along with the version, so this
# tests each new set of custom components.
test-win:
name: Test (Windows ${{ matrix.arch }})
runs-on: ${{ matrix.os }}
timeout-minutes: 40
needs: changes
if: >
needs.changes.outputs.windows == 'true'
&& (github.event_name != 'pull_request'
|| github.event.pull_request.head.repo.full_name != github.repository)
strategy:
fail-fast: false
matrix:
include:
- arch: x64
os: windows-latest
- arch: arm64
os: windows-11-arm
defaults:
run:
shell: bash
steps:
# The repository contains symlinks, which Git checks out as plain files on Windows
# by default, breaking the build
- name: Enable symlinks
run: git config --global core.symlinks true
- uses: actions/checkout@v4
with:
submodules: recursive
lfs: true
- name: Install Node
uses: actions/setup-node@v4
with:
node-version: 24
# Git Bash has unzip but not zip, which fetch_xulrunner needs to repack omni.ja
- name: Install zip
run: choco install zip --no-progress -y
- name: Cache xulrunner
id: xulrunner-cache
uses: actions/cache@v4
with:
path: app/xulrunner/firefox-win-${{ matrix.arch }}
key: xulrunner-win-${{ matrix.arch }}-${{ hashFiles('app/config.sh', 'app/scripts/fetch_xulrunner') }}
- name: Fetch xulrunner
if: steps.xulrunner-cache.outputs.cache-hit != 'true'
run: app/scripts/fetch_xulrunner -p w -a ${{ matrix.arch }}
- name: Cache Node modules
id: node-cache
uses: actions/cache@v4
with:
path: node_modules
key: node-modules-win-24-${{ hashFiles('package-lock.json') }}
- name: Install Node modules
if: steps.node-cache.outputs.cache-hit != 'true'
run: npm install
# Committed symlinks point into node_modules, which doesn't exist at checkout time,
# so Git creates the directory ones with the wrong symlink type on Windows. Recreate
# them now that the targets exist.
- name: Recreate symlinks
run: |
git ls-files -s | awk '$1 == 120000 { print $4 }' | xargs rm
git checkout -- .
- name: Build Zotero
run: npm run build
# Currently necessary for document-worker Webpack: https://stackoverflow.com/a/69746937
env:
NODE_OPTIONS: --openssl-legacy-provider
# The step timeout turns a startup hang into a failure
- name: Run tests
timeout-minutes: 15
run: test/runtests.sh -f -r 3 -b -x app/staging/Zotero_win-${{ matrix.arch }}/zotero.exe db file
utilities:
name: Utilities Tests
runs-on: ubuntu-latest
if: >
github.event_name != 'pull_request'
|| github.event.pull_request.head.repo.full_name != github.repository
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Node
uses: actions/setup-node@v4
with:
node-version: 24
- name: Cache utilities Node modules
id: utilities-node-cache
uses: actions/cache@v4
with:
path: chrome/content/zotero/xpcom/utilities/node_modules
key: utilities-node-modules-24-${{ hashFiles('chrome/content/zotero/xpcom/utilities/package-lock.json') }}
- name: Install utilities Node modules
if: steps.utilities-node-cache.outputs.cache-hit != 'true'
run: npm install --prefix chrome/content/zotero/xpcom/utilities
- name: Run utilities tests
run: |
npm test --prefix chrome/content/zotero/xpcom/utilities -- -j resource/schema/global/schema.json
# Build deployment ZIPs from main, version branches (e.g., 9.0, 10.0), and *-hotfix branches
deploy:
name: Build, Upload
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.repository == 'zotero/zotero'
steps:
- name: Check if deployment branch
id: check-deploy
if: env.ACT != 'true'
run: |
branch="${GITHUB_REF#refs/heads/}"
if [[ "$branch" == "main" || "$branch" =~ ^[0-9]+\.[0-9]+$ || "$branch" == *-hotfix ]]; then
echo "deploy=true" >> "$GITHUB_OUTPUT"
fi
- uses: actions/checkout@v4
if: steps.check-deploy.outputs.deploy == 'true'
with:
submodules: recursive
lfs: true
- name: Install Node
if: steps.check-deploy.outputs.deploy == 'true'
uses: actions/setup-node@v4
with:
node-version: 24
- name: Cache Node modules
id: node-cache
if: steps.check-deploy.outputs.deploy == 'true'
uses: actions/cache@v4
with:
path: node_modules
key: node-modules-24-${{ hashFiles('package-lock.json') }}
- name: Install Node modules
if: steps.check-deploy.outputs.deploy == 'true' && steps.node-cache.outputs.cache-hit != 'true'
run: npm install
- name: Build Zotero
if: steps.check-deploy.outputs.deploy == 'true'
run: npm run build
# Currently necessary for document-worker Webpack: https://stackoverflow.com/a/69746937
env:
NODE_OPTIONS: --openssl-legacy-provider
- name: Create deployment ZIP
if: steps.check-deploy.outputs.deploy == 'true'
run: |
cd build
zip -r ../build.zip *
cd ..
- uses: ruby/setup-ruby@v1
if: steps.check-deploy.outputs.deploy == 'true'
with:
ruby-version: '3.3'
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Upload deployment ZIP
if: |
env.ACT != 'true'
&& github.repository == 'zotero/zotero'
&& github.event_name == 'push'
&& (github.ref == 'refs/heads/master' || endsWith(github.ref, '-hotfix') || github.ref == 'refs/heads/gh-actions-ci-test')
if: steps.check-deploy.outputs.deploy == 'true'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
mkdir build-zip
cd build
zip -r ../build-zip/$GITHUB_SHA.zip *
cd ..
sudo gem install --no-document dpl dpl-s3
dpl --provider=s3 --bucket=zotero-download --local-dir=build-zip --upload-dir=ci/client --acl=public-read --skip_cleanup=true
- name: Run tests
run: xvfb-run test/runtests.sh -x firefox-x86_64/firefox -f
cp build.zip build-zip/$GITHUB_SHA.zip
gem install --no-document dpl -v '>= 2.0'
dpl s3 --bucket zotero-download --local_dir build-zip --upload_dir ci/client --acl public_read

3
.gitignore vendored
View file

@ -1,5 +1,6 @@
.DS_Store
node_modules
build
build/
.signatures.json
tmp
app/win/codesign

21
.gitmodules vendored
View file

@ -18,10 +18,6 @@
path = test/resource/mocha
url = https://github.com/mochajs/mocha.git
branch = master
[submodule "test/resource/chai-as-promised"]
path = test/resource/chai-as-promised
url = https://github.com/domenic/chai-as-promised.git
branch = master
[submodule "resource/schema/global"]
path = resource/schema/global
url = https://github.com/zotero/zotero-schema.git
@ -30,12 +26,12 @@
path = resource/SingleFile
url = https://github.com/gildas-lormeau/SingleFile.git
[submodule "pdf-reader"]
path = pdf-reader
url = https://github.com/zotero/pdf-reader.git
path = reader
url = https://github.com/zotero/reader.git
branch = master
[submodule "pdf-worker"]
path = pdf-worker
url = https://github.com/zotero/pdf-worker.git
path = document-worker
url = https://github.com/zotero/document-worker.git
branch = master
[submodule "note-editor"]
path = note-editor
@ -47,3 +43,12 @@
[submodule "chrome/content/zotero/xpcom/translate"]
path = chrome/content/zotero/xpcom/translate
url = https://github.com/zotero/translate.git
[submodule "app/modules/zotero-word-for-mac-integration"]
path = app/modules/zotero-word-for-mac-integration
url = https://github.com/zotero/zotero-word-for-mac-integration.git
[submodule "app/modules/zotero-word-for-windows-integration"]
path = app/modules/zotero-word-for-windows-integration
url = https://github.com/zotero/zotero-word-for-windows-integration.git
[submodule "app/modules/zotero-libreoffice-integration"]
path = app/modules/zotero-libreoffice-integration
url = https://github.com/zotero/zotero-libreoffice-integration.git

110
CLAUDE.md Normal file
View file

@ -0,0 +1,110 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Zotero is a Firefox-based desktop research management application. It runs as a XUL/XHTML application on a Mozilla platform (not Electron, not a web app). The UI uses a mix of XUL/XHTML, custom elements (Web Components), and React components.
## Build & Development Commands
```bash
npm install # Install dependencies
npm run build # Full build (Babel transpile JS/JSX, compile SCSS, browserify, symlink)
npm run clean-build # Clean build output and rebuild
```
### Running Tests
Tests run inside a built Zotero application instance via `test/runtests.sh`:
```bash
test/runtests.sh # Run all tests
test/runtests.sh item # Run a single test file (omit "Test" and .js extension)
test/runtests.sh item collections # Run multiple test files
test/runtests.sh -g "pattern" # Run only tests matching a grep pattern
test/runtests.sh -f # Stop after first failure
test/runtests.sh -s item # Start at a specific test file
test/runtests.sh -e item # End at a specific test file
test/runtests.sh -c # Open JS console, don't quit on completion
test/runtests.sh -b # Skip bundled translator/style installation (for faster startup when not necessary)
test/runtests.sh -d 5 # Enable debug logging (level 1-5; default is 3)
```
Tests use Mocha + Chai (assert style) + Sinon. Test files live in `test/tests/` and follow the naming convention `<module>Test.js`. Test helpers are in `test/content/support.js`.
The test runner automatically triggers `npm run build` if the watch process isn't running, so it's not necessary to manually run a build before running tests.
Tips:
- Pass flags before test names (e.g., `test/runtests.sh -f item`).
- `-f` should almost always be used, since test failures can cause later spurious test failures.
- To view debug logging for a specific test when running multiple tests, add `Zotero.Debug.init(1)` at the beginning of the test and run with `-d 5`.
### Linting
```bash
npx eslint <file> # Lint a specific file
```
ESLint v9 flat config is in `eslint.config.mjs`. Uses `@zotero/eslint-config`, Babel parser, and React plugin. Currently, the code base is not fully linted, so only worry about issues with new or modified code lines.
## Architecture
### Core Layers
- **XPCOM modules** (`chrome/content/zotero/xpcom/`) -- Core business logic. Loaded sequentially by `chrome/content/zotero/zotero.mjs`. All modules attach to the global `Zotero` namespace (e.g., `Zotero.Items`, `Zotero.Sync.Runner`).
- **Data model** (`chrome/content/zotero/xpcom/data/`) -- ORM-like classes for database entities. `Zotero.DataObject` is the base class; `Zotero.Item`, `Zotero.Collection`, `Zotero.Search`, `Zotero.Library`, etc. extend it. Plural classes (`Zotero.Items`, `Zotero.Collections`) manage object caches and queries. Data objects use an async `saveTx()` pattern for persistence.
- **Database** (`chrome/content/zotero/xpcom/db.js`) -- SQLite via Mozilla's mozStorage API. Accessed through `Zotero.DB.queryAsync()`, `Zotero.DB.executeTransaction()`.
- **Sync system** (`chrome/content/zotero/xpcom/sync/`) -- `syncRunner.js` orchestrates sync. `syncEngine.js` handles object-level sync logic. `syncAPIClient.js` communicates with the Zotero API server. `syncLocal.js` manages local sync state. Similar `storage*` files for file syncing, along with zfs.js (Zotero Storage) and webdav.js (WebDAV).
- **HTTP server** (`chrome/content/zotero/xpcom/server/`) -- Local HTTP server for browser connector integration and local API.
### UI Layers
- **Main window**: `chrome/content/zotero/zoteroPane.xhtml` + `zoteroPane.js`
- **Custom elements** (`chrome/content/zotero/elements/`) -- XUL custom elements inheriting from `XULElementBase` (defined in `elements/base.js`), which provides lifecycle helpers (`init()`, `destroy()`, `content` getter for templates). Registered via `customElements.define()`.
- **React components** (`chrome/content/zotero/components/`) -- Used for complex interactive UI (tag selector, virtualized table, item tree, collection tree). Major tree views are `itemTree.jsx` and `collectionTree.jsx`.
- **SCSS styles** (`scss/`) -- Compiled to CSS. Platform-specific overrides in `scss/mac/`, `scss/win/`, `scss/linux/`.
- **Localization** -- Fluent (`.ftl` files) in `chrome/locale/en-US/zotero/`. Accessed via `data-l10n-id` attributes or `Zotero.getString()` for legacy `.properties` strings. All new strings must be added to `.ftl` files -- do not add new strings to `.properties` or `.dtd` files.
### Submodules
Several features are developed in separate repos and included as Git submodules:
- `reader/` -- PDF/EPUB/snapshot reader with annotations
- `note-editor/` -- Rich text note editor
- `document-worker/` -- PDF processing (extraction, manipulation)
- `translators/` -- 760+ web translators for importing metadata from websites
- `styles/` -- CSL citation styles
- `chrome/content/zotero/xpcom/utilities/` -- Shared utility library
- `chrome/content/zotero/xpcom/translate/` -- Translation framework
- `resource/SingleFile/` -- Web page archiving
### Build System (`js-build/`)
Custom Node.js build system (not Webpack). `js-build/config.js` defines what gets built:
- **JS/JSX files** in `chrome/`, `components/`, `defaults/`, `test/` are transpiled via Babel (React JSX, CommonJS modules)
- **SCSS files** in `scss/` and `chrome/skin/` are compiled with Dart Sass
- **Browserify** bundles select npm packages (react-select, sinon, url) for use in the XUL environment
- **Symlinks** connect source files and submodules into the `build/` directory
- The built app reads from `build/`, not directly from source
## Code Style
- Tabs for indentation, not spaces
- Use `let` instead of `const` except for true scalar constants (e.g., `const MAX_SECONDS = 5 * 60;`)
- No cuddled braces (opening brace on same line, but `else`/`catch`/etc. on their own line)
- Use two hyphens `--` in comments, not an em dash
- Indent blank lines to match surrounding indentation level
- Objects attach to the `Zotero` global namespace rather than using ES module exports
- Async code uses `async`/`await` throughout
- Mozilla/XPCOM APIs are available globally: `Cc`, `Ci`, `Cu`, `Cr`, `Services`, `ChromeUtils`, `IOUtils`, `PathUtils`
## Translators
See `translators/CLAUDE.md` for guidelines. Key rules: **never** generate translators from scratch, **never** generate UUIDs, **never** generate test cases -- all of these must be done through Zotero's Scaffold tool.

View file

@ -2,7 +2,7 @@
## Bug Reports and Feature Requests
Zotero does not use GitHub Issues for bug reports or feature requests. Please post all such requests to the [Zotero Forums](https://forums.zotero.org), where Zotero developers and many others can help. See [How Zotero Support Works](https://www.zotero.org/support/zotero_support) for more information.
Zotero does not use GitHub Issues for bug reports, feature requests, or support questions. Please post all such requests to the [Zotero Forums](https://forums.zotero.org), where Zotero developers and many others can help. See [How Zotero Support Works](https://www.zotero.org/support/zotero_support) for more information.
For confirmed bugs or agreed-upon changes, Zotero developers will create new issues in the relevant repositories.

View file

@ -1,9 +1,9 @@
Zotero
======
[![Build Status](https://travis-ci.org/zotero/zotero.svg?branch=master)](https://travis-ci.org/zotero/zotero)
[![CI](https://github.com/zotero/zotero/actions/workflows/ci.yml/badge.svg)](https://github.com/zotero/zotero/actions/workflows/ci.yml)
[Zotero](https://www.zotero.org/) is a free, easy-to-use tool to help you collect, organize, cite, and share your research sources.
Please post feature requests or bug reports to the [Zotero Forums](https://forums.zotero.org/). If you're having trouble with Zotero, see [Getting Help](https://www.zotero.org/support/getting_help).
For more information on how to use this source code, see the [Zotero wiki](https://www.zotero.org/support/dev/source_code).
For more information on how to use this source code, see the [Zotero documentation](https://www.zotero.org/support/dev/source_code).

12
app/.gitignore vendored Normal file
View file

@ -0,0 +1,12 @@
*~
cache
config-custom.sh
dist
lastrev
staging
tmp
xulrunner
win/resource_hacker
win/firefox-*.win32.zip
win/firefox-*.win64.zip
win/firefox-*.win64-aarch64.zip

4
app/README.md Normal file
View file

@ -0,0 +1,4 @@
# Zotero Standalone build utility
These files are used to bundle the [Zotero core](https://github.com/zotero/zotero) into distributable bundles for Mac, Windows, and Linux.
Instructions for building and packaging are available on the [Zotero wiki](https://www.zotero.org/support/dev/client_coding/building_the_standalone_client).

View file

@ -0,0 +1,18 @@
[App]
Vendor=Zotero
Name=Zotero
Version={{VERSION}}
BuildID={{BUILDID}}
Copyright=Copyright (c) 2006-2025 Contributors
ID=zotero@zotero.org
[Gecko]
MinVersion=153.0
MaxVersion=153.99.*
[XRE]
EnableExtensionManager=1
EnableProfileMigrator=1
[AppUpdate]
URL=https://www.zotero.org/download/client/update/%VERSION%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/update.xml

View file

@ -0,0 +1 @@
<!ENTITY brandShortName "Zotero">

View file

@ -0,0 +1,8 @@
-brand-shorter-name = Zotero
-brand-short-name = Zotero
-brand-full-name = Zotero
-brand-product-name = Zotero
-vendor-short-name = Zotero
-app-name = Zotero
-subscription-name = Zotero Storage
trademarkInfo = Zotero is a trademark of the Corporation for Digital Scholarship.

View file

@ -0,0 +1,3 @@
brandShorterName=Zotero
brandShortName=Zotero
brandFullName=Zotero

View file

@ -0,0 +1,3 @@
locale branding en-US chrome/en-US/locale/branding/
content branding chrome/branding/content/
skin browser preferences chrome/skin/

View file

@ -0,0 +1,104 @@
let { CommandLineOptions, TestOptions } = ChromeUtils.importESModule("chrome://zotero/content/modules/commandLineOptions.mjs");
// Only allow BrowserContentHandler to open a new window if this is the initial launch,
// meaning our CLH isn't registered yet.
if (cmdLine.state != Ci.nsICommandLine.STATE_INITIAL_LAUNCH) {
cmdLine.preventDefault = true;
}
// Force debug output to window
if (cmdLine.handleFlag("ZoteroDebug", false)) {
CommandLineOptions.forceDebugLog = 2;
}
// Force debug output to text console
else if (cmdLine.handleFlag("ZoteroDebugText", false)) {
CommandLineOptions.forceDebugLog = 1;
}
// Pressing Ctrl-C via the terminal is interpreted as a crash, and after three crashes
// Firefox starts up in automatic safe mode (troubleshooting mode). To avoid this, we clear the crash
// counter when using one of the debug-logging flags, which generally imply terminal usage.
if (CommandLineOptions.forceDebugLog) {
Services.prefs.getBranch("toolkit.startup.").clearUserPref("recent_crashes");
}
CommandLineOptions.forceDataDir = cmdLine.handleFlagWithParam("datadir", false);
// Set here, to be acted upon in xpcom/commandLineHandler.js
CommandLineOptions.file = cmdLine.handleFlagWithParam("file", false);
CommandLineOptions.url = cmdLine.handleFlagWithParam("url", false);
if (CommandLineOptions.url) {
CommandLineOptions.url = cmdLine.resolveURI(CommandLineOptions.url);
}
var processTestOptions = false;
if (cmdLine.handleFlag("ZoteroTest", false)) {
CommandLineOptions.test = true;
processTestOptions = true;
}
if (cmdLine.handleFlag("ZoteroAutomatedTest", false)) {
CommandLineOptions.automatedTest = true;
}
if (cmdLine.handleFlag("ZoteroSkipBundledFiles", false)) {
CommandLineOptions.skipBundledFiles = true;
}
if (processTestOptions) {
TestOptions.tests = cmdLine.handleFlagWithParam("test", false);
TestOptions.noquit = cmdLine.handleFlag("noquit", false);
TestOptions.makeTestData = cmdLine.handleFlag("makeTestData", false);
TestOptions.noquit = !TestOptions.makeTestData && TestOptions.noquit;
TestOptions.runTests = !TestOptions.makeTestData;
TestOptions.bail = cmdLine.handleFlag("bail", false);
TestOptions.startAt = cmdLine.handleFlagWithParam("startAtTestFile", false);
TestOptions.stopAt = cmdLine.handleFlagWithParam("stopAtTestFile", false);
TestOptions.shard = cmdLine.handleFlagWithParam("shard", false);
TestOptions.grep = cmdLine.handleFlagWithParam("grep", false);
TestOptions.timeout = cmdLine.handleFlagWithParam("ZoteroTestTimeout", false);
TestOptions.retries = cmdLine.handleFlagWithParam("retries", false) || 0;
Services.ww.openWindow(
null,
"chrome://zotero-unit/content/runtests.html",
"_blank",
"chrome,dialog=no,all",
Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray)
);
cmdLine.preventDefault = true;
}
if (cmdLine.handleFlag("debugger", false)) {
(async function () {
try {
let portOrPath = Services.prefs.getBranch('').getIntPref('devtools.debugger.remote-port');
const { DevToolsLoader } = ChromeUtils.importESModule(
"resource://devtools/shared/loader/Loader.sys.mjs"
);
const loader = new DevToolsLoader({
freshCompartment: true,
});
const { DevToolsServer } = loader.require("devtools/server/devtools-server");
const { SocketListener } = loader.require("devtools/shared/security/socket");
if (DevToolsServer.initialized) {
dump("Debugger server already initialized\n\n");
return;
}
DevToolsServer.init();
DevToolsServer.registerAllActors();
DevToolsServer.allowChromeProcess = true;
const socketOptions = { portOrPath };
const listener = new SocketListener(DevToolsServer, socketOptions);
await listener.open();
if (!DevToolsServer.listeningSockets) {
throw new Error("No listening sockets");
}
dump(`Debugger server started on ${portOrPath}\n\n`);
}
catch (e) {
dump(e + "\n\n");
Components.utils.reportError(e);
}
})();
}

View file

@ -0,0 +1,242 @@
/*
# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Firefox Preferences System.
#
# The Initial Developer of the Original Code is
# Ben Goodger.
# Portions created by the Initial Developer are Copyright (C) 2005
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Ben Goodger <ben@mozilla.org>
# Kevin Gerich <webmail@kmgerich.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
*/
.windowDialog {
padding: 12px;
font: -moz-dialog;
}
.paneSelector {
list-style-image: url("chrome://browser/skin/preferences/Options.png");
}
/* ----- GENERAL BUTTON ----- */
radio[pane=paneGeneral],
radio[pane=paneMain] {
-moz-image-region: rect(0px, 32px, 32px, 0px);
}
/* ----- TABS BUTTON ----- */
radio[pane=paneTabs] {
-moz-image-region: rect(0px, 64px, 32px, 32px);
}
/* ----- CONTENT BUTTON ----- */
radio[pane=paneContent] {
-moz-image-region: rect(0px, 96px, 32px, 64px);
}
/* ----- APPLICATIONS BUTTON ----- */
radio[pane=paneApplications] {
-moz-image-region: rect(0px, 128px, 32px, 96px);
}
/* ----- PRIVACY BUTTON ----- */
radio[pane=panePrivacy] {
-moz-image-region: rect(0px, 160px, 32px, 128px);
}
/* ----- SECURITY BUTTON ----- */
radio[pane=paneSecurity] {
-moz-image-region: rect(0px, 192px, 32px, 160px);
}
/* ----- ADVANCED BUTTON ----- */
radio[pane=paneAdvanced] {
-moz-image-region: rect(0px, 224px, 32px, 192px);
}
/* ----- SYNC BUTTON ----- */
radio[pane=paneSync] {
list-style-image: url("chrome://browser/skin/preferences/Options-sync.png");
}
/* ----- APPLICATIONS PREFPANE ----- */
#BrowserPreferences[animated="true"] #handlersView {
height: 25em;
}
#BrowserPreferences[animated="false"] #handlersView {
-moz-box-flex: 1;
}
description {
font: small-caption;
font-weight: normal;
line-height: 1.3em;
margin-bottom: 4px !important;
}
prefpane .groupbox-body {
-moz-appearance: none;
padding: 8px 4px 4px 4px;
}
#paneTabs > groupbox {
margin: 0;
}
#tabPrefsBox {
margin: 12px 4px;
}
prefpane .groupbox-title {
background: url("chrome://global/skin/50pct_transparent_grey.png") repeat-x bottom left;
margin-bottom: 4px;
}
tabpanels {
padding: 20px 7px 7px;
}
caption {
-moz-padding-start: 5px;
padding-top: 4px;
padding-bottom: 2px;
}
#paneMain description,
#paneContent description,
#paneAdvanced description,
#paneSecurity description {
font: -moz-dialog;
}
#paneContent {
padding-top: 8px;
}
#paneContent row {
padding: 2px 4px;
-moz-box-align: center;
}
#popupPolicyRow,
#enableSoftwareInstallRow,
#enableImagesRow {
margin-bottom: 4px !important;
padding-bottom: 4px !important;
border-bottom: 1px solid #ccc;
}
#browserUseCurrent,
#browserUseBookmark,
#browserUseBlank {
margin-top: 10px;
}
#advancedPrefs {
margin: 0 8px;
}
#privacyPrefs {
padding: 0 4px;
}
#privacyPrefs > tabpanels {
padding: 18px 10px 10px;
}
#OCSPDialogPane {
font: message-box !important;
}
/**
* Privacy Pane
*/
/* styles for the link elements copied from .text-link in global.css */
.inline-link {
color: LinkText;
text-decoration: underline;
}
.inline-link:not(:focus) {
outline: 1px dotted transparent;
}
/**
* Update Preferences
*/
#autoInstallOptions {
-moz-margin-start: 20px;
}
.updateControls {
-moz-margin-start: 10px;
}
/**
* Clear Private Data
*/
#SanitizeDialogPane > groupbox {
margin-top: 0;
}
/* ----- SYNC PANE ----- */
#syncDesc {
padding: 0 8em;
}
#accountCaptionImage {
list-style-image: url("chrome://mozapps/skin/profile/profileicon.png");
}
#syncAddDeviceLabel {
margin-top: 1em;
margin-bottom: 1em;
}
#syncEnginesList {
height: 10em;
}

View file

@ -0,0 +1 @@
en-US,ar,bg-BG,br,ca-AD,cs-CZ,da-DK,de,el-GR,en-AU,en-CA,en-GB,en-NZ,es-ES,et-EE,eu-ES,fa,fi-FI,fr-FR,gl-ES,hu-HU,id-ID,is-IS,it-IT,ja-JP,km,ko-KR,lt-LT,nb-NO,nl-NL,pl-PL,pt-BR,pt-PT,ro-RO,ru-RU,sk-SK,sl-SI,sr-RS,sv-SE,ta,th-TH,tr-TR,uk-UA,vi-VN,zh-CN,zh-TW

172
app/assets/prefs.js Normal file
View file

@ -0,0 +1,172 @@
// We only want a single window, I think
pref("toolkit.singletonWindowType", "navigator:browser");
// For debugging purposes, show errors in console by default
pref("javascript.options.showInConsole", true);
// Don't retrieve unrequested links when performing standalone translation
pref("network.prefetch-next", false);
// Don't make DNS requests for links in snapshots
pref("network.dns.disablePrefetch", true);
// Don't open TCP connection when clicking on a link in a snapshot
pref("network.http.speculative-parallel-limit", 0);
// Let operations run as long as necessary
pref("dom.max_chrome_script_run_time", 0);
pref("intl.locale.requested", '');
pref("intl.regional_prefs.use_os_locales", false);
// Fix error initializing login manager after this was changed in Firefox 57
// Could also disable this with MOZ_LOADER_SHARE_GLOBAL, supposedly
pref("jsloader.shareGlobal", false);
// Needed due to https://bugzilla.mozilla.org/show_bug.cgi?id=1181977
pref("browser.hiddenWindowChromeURL", "chrome://zotero/content/standalone/hiddenWindow.xhtml");
// Use basicViewer for opening new DOM windows from content (for TinyMCE)
pref("browser.chromeURL", "chrome://zotero/content/standalone/basicViewer.xhtml");
// We need these to get the save dialog working with contentAreaUtils.js
pref("browser.download.useDownloadDir", false);
pref("browser.download.manager.showWhenStarting", false);
pref("browser.download.folderList", 1);
// Don't show add-on selection dialog
pref("extensions.shownSelectionUI", true);
pref("extensions.autoDisableScope", 11);
pref("network.protocol-handler.expose-all", false);
pref("network.protocol-handler.expose.zotero", true);
pref("network.protocol-handler.expose.http", true);
pref("network.protocol-handler.expose.https", true);
// Never go offline
pref("offline.autoDetect", false);
pref("network.manage-offline-status", false);
// Without this, we will throw up dialogs if asked to translate strange pages
pref("browser.xul.error_pages.enabled", true);
// Without this, scripts may decide to open popups
pref("dom.disable_open_during_load", true);
// Don't show security warning. The "warn_viewing_mixed" warning just lets the user know that some
// page elements were loaded over an insecure connection. This doesn't matter if all we're doing is
// scraping the page, since we don't provide any information to the site.
pref("security.warn_viewing_mixed", false);
// Temporarily allow plugins to load their own scripts from jar:file: URIs with loadSubScript()
// without passing allowUnsafeURL (Mozilla bug 1974213). This will be disabled once plugins have
// had time to update.
pref("security.allow_unsafe_subscript_loads", true);
// We do need synchronous XHR
pref("network.xhr.block_sync_system_requests", false);
// Preferences for add-on discovery
pref("extensions.getAddons.cache.enabled", false);
//pref("extensions.getAddons.maxResults", 15);
//pref("extensions.getAddons.get.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/%API_VERSION%/search/guid:%IDS%?src=thunderbird&appOS=%OS%&appVersion=%VERSION%&tMain=%TIME_MAIN%&tFirstPaint=%TIME_FIRST_PAINT%&tSessionRestored=%TIME_SESSION_RESTORED%");
//pref("extensions.getAddons.search.browseURL", "https://addons.mozilla.org/%LOCALE%/%APP%/search?q=%TERMS%");
//pref("extensions.getAddons.search.url", "https://services.addons.mozilla.org/%LOCALE%/%APP%/api/%API_VERSION%/search/%TERMS%/all/%MAX_RESULTS%/%OS%/%VERSION%?src=thunderbird");
//pref("extensions.webservice.discoverURL", "https://www.zotero.org/support/plugins");
// Check Windows certificate store for custom CAs
pref("security.enterprise_roots.enabled", true);
// Disable add-on signature checking with unbranded Firefox build
pref("xpinstall.signatures.required", false);
// Allow legacy extensions (though this might not be necessary)
pref("extensions.legacy.enabled", true);
// Allow installing XPIs from any host
pref("xpinstall.whitelist.required", false);
// Allow installing XPIs when using a custom CA
pref("extensions.install.requireBuiltInCerts", false);
pref("extensions.update.requireBuiltInCerts", false);
// Don't connect to the Mozilla extensions blocklist
pref("extensions.blocklist.enabled", false);
// Avoid warning in console when opening Tools -> Add-ons
pref("extensions.getAddons.link.url", "");
// Disable places
pref("places.history.enabled", false);
// Probably not used, but prevent an error in the console
pref("app.support.baseURL", "https://www.zotero.org/support/");
// Disable Telemetry, Health Report, error reporting, and remote settings
pref("toolkit.telemetry.unified", false);
pref("toolkit.telemetry.enabled", false);
pref("datareporting.policy.dataSubmissionEnabled", false);
pref("toolkit.crashreporter.enabled", false);
pref("extensions.remoteSettings.disabled", true);
pref("extensions.update.url", "");
// Don't try to load the "Get Add-ons" tab on first load of Add-ons window
pref("extensions.ui.lastCategory", "addons://list/extension");
// Don't show "Using experimental APIs requires a privileged add-on" warning
pref("extensions.experiments.enabled", true);
// Not set on Windows in Firefox anymore since it's a per-installation pref,
// but we override that in fetch_xulrunner
pref("app.update.auto", true);
// URL user can browse to manually if for some reason all update installation
// attempts fail.
pref("app.update.url.manual", "https://www.zotero.org/download");
// A default value for the "More information about this update" link
// supplied in the "An update is available" page of the update wizard.
pref("app.update.url.details", "https://www.zotero.org/support/changelog");
// Interval: Time between checks for a new version (in seconds)
// default=1 day
pref("app.update.interval", 86400);
// The minimum delay in seconds for the timer to fire.
// default=2 minutes
pref("app.update.timerMinimumDelay", 120);
// Whether or not we show a dialog box informing the user that the update was
// successfully applied. This is off in Firefox by default since we show a
// upgrade start page instead! Other apps may wish to show this UI, and supply
// a whatsNewURL field in their brand.properties that contains a link to a page
// which tells users what's new in this new update.
// update channel for this build
pref("app.update.channel", "default");
// This should probably not be a preference that's used in toolkit....
pref("browser.preferences.instantApply", false);
// Allow elements to be displayed full-screen
pref("full-screen-api.enabled", true);
// Allow chrome access in DevTools
// This enables the input field in the Browser Console tool
pref("devtools.chrome.enabled", true);
// Default mousewheel action with Alt/Option is History Back/Forward in Firefox
// We don't have History navigation and users want to scroll the tree with Option
// key held down
pref("mousewheel.with_alt.action", 1);
// Use the system print dialog instead of the new tab-based print dialog in Firefox
pref("print.prefer_system_dialog", true);
// Disable libvpx decoding/encoding
pref("media.webm.enabled", false);
pref("media.encoder.webm.enabled", false);
pref("media.mediasource.webm.enabled", false);
pref("media.mediasource.webm.audio.enabled", false);
pref("media.mediasource.vp9.enabled", false);
pref("media.ffvpx.enabled", false);
pref("media.ffvpx.mp3.enabled", false);
pref("media.rdd-vpx.enabled", false);
pref("media.rdd-ffvpx.enabled", false);
pref("media.utility-ffvpx.enabled", false);
// Allow collectionTree scrolling when Control is highlighting collections on win
pref("mousewheel.with_control.action", 1);

View file

@ -0,0 +1,188 @@
%if 0
/*
# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Firefox Preferences System.
#
# The Initial Developer of the Original Code is
# Ben Goodger.
# Portions created by the Initial Developer are Copyright (C) 2005
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Ben Goodger <ben@mozilla.org>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
*/
%endif
/* Global Styles */
#BrowserPreferences radio[pane] {
list-style-image: url("chrome://browser/skin/preferences/Options.png");
}
radio[pane=paneMain] {
-moz-image-region: rect(0px, 32px, 32px, 0px)
}
radio[pane=paneTabs] {
-moz-image-region: rect(0px, 64px, 32px, 32px)
}
radio[pane=paneContent] {
-moz-image-region: rect(0px, 96px, 32px, 64px)
}
radio[pane=paneApplications] {
-moz-image-region: rect(0px, 128px, 32px, 96px)
}
radio[pane=panePrivacy] {
-moz-image-region: rect(0px, 160px, 32px, 128px)
}
radio[pane=paneSecurity] {
-moz-image-region: rect(0px, 192px, 32px, 160px)
}
radio[pane=paneAdvanced] {
-moz-image-region: rect(0px, 224px, 32px, 192px)
}
%ifdef MOZ_SERVICES_SYNC
radio[pane=paneSync] {
list-style-image: url("chrome://browser/skin/preferences/Options-sync.png") !important;
}
%endif
/* Applications Pane */
#BrowserPreferences[animated="true"] #handlersView {
height: 25em;
}
#BrowserPreferences[animated="false"] #handlersView {
-moz-box-flex: 1;
}
/* Privacy Pane */
/* styles for the link elements copied from .text-link in global.css */
.inline-link {
color: LinkText;
text-decoration: underline;
}
.inline-link:not(:focus) {
outline: 1px dotted transparent;
}
/* Modeless Window Dialogs */
.windowDialog,
.windowDialog prefpane {
padding: 0px;
}
.contentPane {
margin: 9px 8px 5px 8px;
}
.actionButtons {
margin: 0px 3px 6px 3px !important;
}
/* Cookies Manager */
#cookiesChildren::-moz-tree-image(domainCol) {
width: 16px;
height: 16px;
margin: 0px 2px;
list-style-image: url("chrome://mozapps/skin/places/defaultFavicon.png");
}
#paneApplications {
margin-left: 4px;
margin-right: 4px;
padding-left: 0;
padding-right: 0;
}
#linksOpenInBox {
margin-top: 5px;
}
#paneAdvanced {
padding-bottom: 10px;
}
#advancedPrefs {
margin-left: 0;
margin-right: 0;
}
#cookiesChildren::-moz-tree-image(domainCol, container) {
list-style-image: url("moz-icon://stock/gtk-directory?size=menu");
}
#cookieInfoBox {
border: 1px solid ThreeDShadow;
border-radius: 0px;
margin: 4px;
padding: 0px;
}
/* bottom-most box containing a groupbox in a prefpane. Prevents the bottom
of the groupbox from being cutoff */
.bottomBox {
padding-bottom: 4px;
}
/**
* Clear Private Data
*/
#SanitizeDialogPane > groupbox {
margin-top: 0;
}
%ifdef MOZ_SERVICES_SYNC
/* Sync Pane */
#syncDesc {
padding: 0 8em;
}
#accountCaptionImage {
list-style-image: url("chrome://mozapps/skin/profile/profileicon.png");
}
#syncAddDeviceLabel {
margin-top: 1em;
margin-bottom: 1em;
}
#syncEnginesList {
height: 10em;
}
%endif

4
app/assets/updater.ini Normal file
View file

@ -0,0 +1,4 @@
; This file is in the UTF-8 encoding
[Strings]
Title=Zotero Update
Info=Zotero is installing your updates and will start in a few moments…

View file

@ -0,0 +1,178 @@
/*
# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Firefox Preferences System.
#
# The Initial Developer of the Original Code is
# Ben Goodger.
# Portions created by the Initial Developer are Copyright (C) 2005
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Ben Goodger <ben@mozilla.org>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
*/
/* Global Styles */
#BrowserPreferences radio[pane] {
list-style-image: url("chrome://browser/skin/preferences/Options.png");
padding: 5px 3px 1px;
}
radio[pane=paneMain] {
-moz-image-region: rect(0, 32px, 32px, 0);
}
radio[pane=paneTabs] {
-moz-image-region: rect(0, 64px, 32px, 32px);
}
radio[pane=paneContent] {
-moz-image-region: rect(0, 96px, 32px, 64px);
}
radio[pane=paneApplications] {
-moz-image-region: rect(0, 128px, 32px, 96px);
}
radio[pane=panePrivacy] {
-moz-image-region: rect(0, 160px, 32px, 128px);
}
radio[pane=paneSecurity] {
-moz-image-region: rect(0, 192px, 32px, 160px);
}
radio[pane=paneAdvanced] {
-moz-image-region: rect(0, 224px, 32px, 192px);
}
%ifdef MOZ_SERVICES_SYNC
radio[pane=paneSync] {
list-style-image: url("chrome://browser/skin/preferences/Options-sync.png") !important;
}
%endif
/* Applications Pane */
#BrowserPreferences[animated="true"] #handlersView {
height: 25em;
}
#BrowserPreferences[animated="false"] #handlersView {
-moz-box-flex: 1;
}
/* Privacy Pane */
/* styles for the link elements copied from .text-link in global.css */
.inline-link {
color: LinkText;
text-decoration: underline;
}
.inline-link:not(:focus) {
outline: 1px dotted transparent;
}
/* Modeless Window Dialogs */
.windowDialog,
.windowDialog prefpane {
padding: 0;
}
.contentPane {
margin: 9px 8px 5px;
}
.actionButtons {
margin: 0 3px 6px !important;
}
/* Cookies Manager */
#cookiesChildren::-moz-tree-image(domainCol) {
width: 16px;
height: 16px;
margin: 0 2px;
list-style-image: url("chrome://mozapps/skin/places/defaultFavicon.png") !important;
}
#cookiesChildren::-moz-tree-image(domainCol, container) {
list-style-image: url("chrome://global/skin/icons/folder-item.png") !important;
-moz-image-region: rect(0, 32px, 16px, 16px);
}
#cookiesChildren::-moz-tree-image(domainCol, container, open) {
-moz-image-region: rect(16px, 32px, 32px, 16px);
}
#cookieInfoBox {
border: 1px solid ThreeDShadow;
border-radius: 0;
margin: 4px;
padding: 0;
}
/* Advanced Pane */
/* Adding padding-bottom prevents the bottom of the tabpanel from being cutoff
when browser.preferences.animateFadeIn = true */
#advancedPrefs {
padding-bottom: 8px;
}
/* bottom-most box containing a groupbox in a prefpane. Prevents the bottom
of the groupbox from being cutoff */
.bottomBox {
padding-bottom: 4px;
}
%ifdef MOZ_SERVICES_SYNC
/* Sync Pane */
#syncDesc {
padding: 0 8em;
}
.syncGroupBox {
padding: 10px;
}
#accountCaptionImage {
list-style-image: url("chrome://mozapps/skin/profile/profileicon.png");
}
#syncAddDeviceLabel {
margin-top: 1em;
margin-bottom: 1em;
}
#syncEnginesList {
height: 11em;
}
%endif

1210
app/build.sh Executable file

File diff suppressed because it is too large Load diff

73
app/config.sh Normal file
View file

@ -0,0 +1,73 @@
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Version of Gecko to build with
GECKO_VERSION_MAC="153.3.0esr"
GECKO_VERSION_LINUX="153.3.0esr"
GECKO_VERSION_WIN="153.3.0esr"
RUST_VERSION=1.94.0
# URL prefix for custom builds of Firefox components
custom_components_url="https://download.zotero.org/dev/firefox-components/"
custom_components_hash_mac="6b586ed383a480fed9d9786ad18a6e6d90b140739e5e4491096df291ec887571"
custom_components_hash_win_x64="db7c9556bd0f9e36120069391ce66cc199ed1ec4e2fdd3b931f71e35b4586d2b"
custom_components_hash_win_arm64="fd0f44b38a471009ce1cdd926f7f48be43ed773dad350c62383b8a7235da8711"
custom_components_hash_win32="694944349fdfd91296f272a68ac5d03183f02d47fdaa7ba9f2b1c74747652aa2"
APP_NAME="Zotero"
APP_ID="zotero\@zotero.org"
# Whether to sign builds
SIGN=0
# OS X Developer ID certificate information
DEVELOPER_ID=F0F1FE48DB909B263AC51C8215374D87FDC12121
# Keychain and keychain password, if not building via the GUI
KEYCHAIN=""
KEYCHAIN_PASSWORD=""
NOTARIZATION_BUNDLE_ID=""
NOTARIZATION_USER=""
NOTARIZATION_TEAM_ID=""
NOTARIZATION_PASSWORD=""
# Name of a notarytool keychain profile (see `xcrun notarytool store-credentials`), e.g., for an
# App Store Connect API key -- used instead of the Apple ID settings above if set
NOTARIZATION_PROFILE=""
# Paths for Windows installer build
NSIS_DIR='C:\Program Files (x86)\NSIS\'
SIGNTOOL_DELAY=5
# Directory for unpacked binaries
STAGE_DIR="$DIR/staging"
# Directory for packed binaries
DIST_DIR="$DIR/dist"
SOURCE_REPO_URL="https://github.com/zotero/zotero"
S3_BUCKET="zotero-download"
S3_CI_ZIP_PATH="ci/client"
S3_DIST_PATH="client"
DEPLOY_HOST="deploy.zotero"
DEPLOY_PATH="www/www-production/public/download/client"
BUILD_PLATFORMS=""
NUM_INCREMENTALS=6
if [ "`uname`" = "Darwin" ]; then
shopt -s expand_aliases
fi
if [ "`uname -o 2> /dev/null`" = "Cygwin" ]; then
export WIN_NATIVE=1
else
export WIN_NATIVE=0
fi
# Make utilities (mar/mbsdiff) available in the path
PATH="$DIR/xulrunner/bin:$PATH"
if [ -f "$DIR/config-custom.sh" ]; then
. "$DIR/config-custom.sh"
fi
unset DIR

44
app/linux/build Executable file
View file

@ -0,0 +1,44 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$APP_ROOT_DIR/config.sh"
if [ -z "${1:-}" ]; then
echo "Usage: $0 x64|arm64" >&2
exit 1
fi
gecko_path=~/src/firefox
arch=$1
if [ ! -d "$gecko_path" ]; then
echo "$gecko_path is not a directory" >&2
exit 1
fi
# Install required Rust version
rustup toolchain install $RUST_VERSION
if [ $arch = "x64" ]; then
rust_target=x86_64
elif [ $arch = "arm64" ]; then
rust_target=aarch64
else
echo "Unknown architecture $arch" >&2
exit 1
fi
rustup target add $rust_target-unknown-linux-gnu
rm "$gecko_path/mozconfig"
touch "$gecko_path/mozconfig"
if [ $arch == "arm64" ]; then
echo "ac_add_options --target=aarch64-linux-gnu" >> "$gecko_path/mozconfig"
fi
cat "$SCRIPT_DIR/mozconfig" >> "$gecko_path/mozconfig"
cd "$gecko_path"
./mach build
./mach package

BIN
app/linux/icons/icon128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

BIN
app/linux/icons/icon32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

BIN
app/linux/icons/icon64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View file

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<polygon style="fill: #000000" points="13.863 2.73 13.027 1 2.137 1 2.137 3.8 2.137 3.921 8.822 3.921 1.289 13.233 2.137 15 13.863 15 13.863 12.142 13.863 12.021 6.448 12.021 13.863 2.73"/>
</svg>

After

Width:  |  Height:  |  Size: 283 B

25
app/linux/mozconfig Normal file
View file

@ -0,0 +1,25 @@
ac_add_options --enable-bootstrap
mk_add_options AUTOCLOBBER=1
# These don't all affect the stub, but they can't hurt, and we'll want them if
# we switch to custom XUL builds
ac_add_options MOZ_ENABLE_JS_DUMP=1
ac_add_options MOZ_ENABLE_FORKSERVER=
ac_add_options MOZ_TELEMETRY_REPORTING=
ac_add_options MOZ_DATA_REPORTING=
ac_add_options --disable-tests
ac_add_options --disable-debug
ac_add_options --disable-debug-symbols
ac_add_options --disable-webrtc
# This causes aarch64 build of 140.0esr to fail
#ac_add_options --disable-eme
export MOZILLA_OFFICIAL=1
export RELEASE_OR_BETA=1
MOZ_REQUIRE_SIGNING=
ac_add_options --enable-official-branding
# Build updater without MAR signature verification
ac_add_options --enable-unverified-updates

13
app/linux/set_launcher_icon Executable file
View file

@ -0,0 +1,13 @@
#!/bin/bash -e
#
# Run this to update the launcher file with the current path to the application icon
#
APPDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
if [ -w "$APPDIR"/zotero.desktop ]; then
sed -i -e "s@^Icon=.*@Icon=$APPDIR/icons/icon128.png@" "$APPDIR"/zotero.desktop
else
echo "$APPDIR"/zotero.desktop is not writable
exit 1
fi

43
app/linux/update_updater Executable file
View file

@ -0,0 +1,43 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$SCRIPT_DIR"
if [ $# -ne 1 ]; then
echo "Usage: $0 <firefox-version>"
exit 1
fi
version="$1"
for arch in x86_64 aarch64; do
package="firefox-${version}.en-US.linux-${arch}.tar.xz"
if [ $arch = 'aarch64' ]; then
arch="arm64"
fi
if [ ! -f "$package" ]; then
echo "Error: Package not found: $package"
exit 1
fi
echo "Extracting updater from $package..."
tar --extract --xz --file="$package" --to-stdout "firefox/updater" > "updater-$arch"
# Add missing RUNPATH to custom fx140 builds, which is missing for unclear reasons.
# Without this, the updater fails looking for libmozsqlite3.so.
patchelf --set-rpath '$ORIGIN' "updater-$arch"
done
echo "Creating updater.tar.xz..."
if [ `uname` = "Darwin" ]; then
tar=gtar
else
tar=tar
fi
$tar --owner=0 --group=0 --numeric-owner --no-xattrs --mode=0755 -cJvf updater.tar.xz updater-x86_64 updater-arm64
rm updater-x86_64 updater-arm64
echo "Done: updater.tar.xz created"

3
app/linux/updater.tar.xz Normal file
View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a1f368bb36408d61d4b8f9dda561738686e626513346e138d55a0ef58055a6fc
size 123776

20
app/linux/zotero Executable file
View file

@ -0,0 +1,20 @@
#!/bin/bash
# Increase open files limit
#
# Mozilla file functions (OS.File.move()/copy(), NetUtil.asyncFetch/asyncCopy()) can leave file
# descriptors open for a few seconds (even with an explicit inputStream.close() in the case of
# the latter), so a source installation that copies ~500 translators and styles (with fds for
# source and target) can exceed the default 1024 limit.
# Current hard-limit on Ubuntu 16.10 is 4096
ulimit -n 4096
# Allow profile downgrade for Zotero
export MOZ_ALLOW_DOWNGRADE=1
# Don't create dedicated profile (default-esr)
export MOZ_LEGACY_PROFILES=1
# Use wayland backend when available
export MOZ_ENABLE_WAYLAND=1
CALLDIR="$(dirname "$(readlink -f "$0")")"
"$CALLDIR/zotero-bin" -app "$CALLDIR/app/application.ini" "$@"

9
app/linux/zotero.desktop Executable file
View file

@ -0,0 +1,9 @@
[Desktop Entry]
Name=Zotero
Exec=bash -c "$(dirname $(realpath $(echo %k | sed -e 's/^file:\\/\\///')))/zotero -url %U"
Icon=zotero.ico
Type=Application
Terminal=false
Categories=Office;
MimeType=text/plain;x-scheme-handler/zotero;application/x-research-info-systems;text/x-research-info-systems;text/ris;application/x-endnote-refer;application/x-inst-for-Scientific-info;application/mods+xml;application/rdf+xml;application/x-bibtex;text/x-bibtex;application/marc;application/vnd.citationstyles.style+xml
X-GNOME-SingleWindow=true

Binary file not shown.

204
app/mac/Contents/Info.plist Normal file
View file

@ -0,0 +1,204 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDocumentTypes</key>
<array>
<!-- Import formats -->
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>ris</string>
</array>
<!--<key>CFBundleTypeIconFile</key>
<string>document.icns</string>-->
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/x-research-info-systems</string>
<string>text/x-research-info-systems</string>
<string>text/ris</string>
<string>ris</string>
<string>application/x-endnote-refer</string>
</array>
<key>CFBundleTypeName</key>
<string>Research Information Systems Document</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>ciw</string>
<string>isi</string>
</array>
<!--<key>CFBundleTypeIconFile</key>
<string>document.icns</string>-->
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/x-inst-for-Scientific-info</string>
</array>
<key>CFBundleTypeName</key>
<string>ISI Common Export Format Document</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>mods</string>
</array>
<!--<key>CFBundleTypeIconFile</key>
<string>document.icns</string>-->
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/mods+xml</string>
</array>
<key>CFBundleTypeName</key>
<string>Metadata Object Description Schema Document</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>rdf</string>
</array>
<!--<key>CFBundleTypeIconFile</key>
<string>document.icns</string>-->
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/rdf+xml</string>
</array>
<key>CFBundleTypeName</key>
<string>Resource Description Framework Document</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>bib</string>
<string>bibtex</string>
</array>
<!--<key>CFBundleTypeIconFile</key>
<string>document.icns</string>-->
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/x-bibtex</string>
<string>text/x-bibtex</string>
</array>
<key>CFBundleTypeName</key>
<string>BibTeX Document</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>mrc</string>
<string>marc</string>
</array>
<!--<key>CFBundleTypeIconFile</key>
<string>document.icns</string>-->
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/marc</string>
</array>
<key>CFBundleTypeName</key>
<string>MARC Document</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<!-- Citation styles -->
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>csl</string>
<string>csl.txt</string>
</array>
<!--<key>CFBundleTypeIconFile</key>
<string>document.icns</string>-->
<key>CFBundleTypeMIMETypes</key>
<array>
<string>application/vnd.citationstyles.style+xml</string>
</array>
<key>CFBundleTypeName</key>
<string>CSL Citation Style</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<!-- Hopefully, we don't become the default app for these -->
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>xml</string>
</array>
<!--<key>CFBundleTypeIconFile</key>
<string>document.icns</string>-->
<key>CFBundleTypeName</key>
<string>XML Document</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>txt</string>
</array>
<!--<key>CFBundleTypeIconFile</key>
<string>document.icns</string>-->
<key>CFBundleTypeName</key>
<string>Text File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>zotero</string>
<key>CFBundleGetInfoString</key>
<string>Zotero {{VERSION}}, © 2006-2018 Contributors</string>
<key>CFBundleIconName</key>
<string>AppIcon</string>
<key>CFBundleIdentifier</key>
<string>org.zotero.zotero</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Zotero</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>{{VERSION_NUMERIC}}</string>
<key>CFBundleSignature</key>
<string>ZOTR</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<!--<key>CFBundleURLIconFile</key>
<string>document.icns</string>-->
<key>CFBundleURLName</key>
<string>zotero URL</string>
<key>CFBundleURLSchemes</key>
<array>
<string>zotero</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>{{VERSION_NUMERIC}}</string>
<key>NSAppleScriptEnabled</key>
<true/>
<key>CGDisableCoalescedUpdates</key>
<true/>
<key>NSHighResolutionCapable</key>
<true/>
<key>NSSupportsAutomaticGraphicsSwitching</key>
<true/>
<key>LSMinimumSystemVersion</key>
<string>10.9.0</string>
</dict>
</plist>

1
app/mac/Contents/PkgInfo Normal file
View file

@ -0,0 +1 @@
APPLZOTR

Binary file not shown.

BIN
app/mac/DSStore Normal file

Binary file not shown.

93
app/mac/build-and-unify Executable file
View file

@ -0,0 +1,93 @@
#!/bin/bash
set -e
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$APP_ROOT_DIR/config.sh"
fx_app_name=Firefox.app
# Get Mozilla source directory from command line
if [ -z "${1:-}" ]; then
echo "Usage: $0 /path/to/firefox" >&2
exit 1
fi
GECKO_PATH="$(cd "$1" && pwd)"
mach=$GECKO_PATH/mach
BUILD_DIR=`mktemp -d`
function cleanup {
rm -rf $BUILD_DIR
}
trap cleanup EXIT
set -x
export MOZ_BUILD_DATE=`date "+%Y%m%d%H%M%S"`
# Install required Rust version
rustup toolchain install $RUST_VERSION
rustup target add --toolchain $RUST_VERSION aarch64-apple-darwin x86_64-apple-darwin
rustup default $RUST_VERSION
cp "$SCRIPT_DIR/mozconfig" "$GECKO_PATH"
# Build Firefox for Intel and Apple Silicon
export Z_ARCH=x64
$mach build
$mach package
export Z_ARCH=aarch64
$mach build
$mach package
cd $BUILD_DIR
# Unify into Universal build
# From https://searchfox.org/mozilla-central/rev/97c902e8f92b15dc63eb584bfc594ecb041242a4/taskcluster/scripts/misc/unify.sh
for i in x86_64 aarch64; do
$mach python -m mozbuild.action.unpack_dmg "$GECKO_PATH"/obj-$i-apple-darwin/dist/*.dmg $i
done
mv x86_64 x64
$mach python "$GECKO_PATH/toolkit/mozapps/installer/unify.py" x64/*.app aarch64/*.app
cp x64/$fx_app_name/Contents/MacOS/firefox zotero
xz zotero
mv zotero.xz "$APP_ROOT_DIR/mac/zotero.xz"
# Package custom Firefox components for fetch_xulrunner. Add XUL to this list if needed.
# Upload the archive to ${custom_components_url}mac/ and set custom_components_hash_mac
# in config.sh to the hash printed below.
custom_components=(libmozglue.dylib)
mkdir MacOS
for component in "${custom_components[@]}"; do
cp "x64/$fx_app_name/Contents/MacOS/$component" MacOS/
done
tar cfJ MacOS.tar.xz MacOS
components_hash=$(shasum -a 256 MacOS.tar.xz | cut -d ' ' -f 1)
components_file="$APP_ROOT_DIR/mac/$components_hash.tar.xz"
mv MacOS.tar.xz "$components_file"
echo "Custom Firefox components: $components_file"
echo "custom_components_hash_mac=\"$components_hash\""
# Save a copy of ChannelPrefs.framework
#
# Frameworks need to be signed, and we can't sign source builds, so store a signed copy with
# 'default' replaced with 'source'. Deployed builds will then replace 'source' with
# 'release'/'beta'/'dev'.
rm -rf "$APP_ROOT_DIR/mac/ChannelPrefs.framework"
cp -R x64/$fx_app_name/Contents/Frameworks/ChannelPrefs.framework "$APP_ROOT_DIR/mac/ChannelPrefs.framework"
pushd "$APP_ROOT_DIR/mac"
./set-channel-prefs-channel ChannelPrefs.framework/ChannelPrefs default source
security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" ~/Library/Keychains/$KEYCHAIN.keychain-db
/usr/bin/codesign --force --options runtime --sign "$DEVELOPER_ID" ChannelPrefs.framework
/usr/bin/codesign -vvvv ChannelPrefs.framework
tar cfvJ ChannelPrefs.framework.tar.xz ChannelPrefs.framework
rm -rf ChannelPrefs.framework
popd
# Uncomment to build updater
#cd x64/$fx_app_name/Contents/MacOS/
#"$APP_ROOT_DIR/mac/updater_renamer"
#cat updater.app/Contents/Resources/English.lproj/InfoPlist.strings
#tar cfvJ "$APP_ROOT_DIR/mac/updater.tar.xz" updater.app/

34
app/mac/entitlements.xml Normal file
View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
Entitlements to apply during codesigning of production builds.
-->
<plist version="1.0">
<dict>
<!-- Firefox needs to create executable pages (without MAP_JIT) -->
<key>com.apple.security.cs.allow-unsigned-executable-memory</key><true/>
<!-- Allow loading third party libraries. Needed for Flash and CDMs -->
<!-- Disabled for Zotero -->
<key>com.apple.security.cs.disable-library-validation</key><false/>
<!-- Firefox needs to access the microphone on sites the user allows -->
<!-- Disabled for Zotero -->
<key>com.apple.security.device.audio-input</key><false/>
<!-- Firefox needs to access the camera on sites the user allows -->
<!-- Disabled for Zotero -->
<key>com.apple.security.device.camera</key><false/>
<!-- Firefox needs to access the location on sites the user allows -->
<!-- Disabled for Zotero -->
<key>com.apple.security.personal-information.location</key><false/>
<!-- For SmartCardServices(7) -->
<!-- Disabled for Zotero -->
<key>com.apple.security.smartcard</key><false/>
<!-- Added for Zotero to control Word and bring windows to the front -->
<key>com.apple.security.automation.apple-events</key><true/>
</dict>
</plist>

35
app/mac/mozconfig Normal file
View file

@ -0,0 +1,35 @@
if [ "$Z_ARCH" == "x64" ]; then
ac_add_options --target=x86_64-apple-darwin
elif [ "$Z_ARCH" == "aarch64" ]; then
ac_add_options --target=aarch64-apple-darwin
fi
ac_add_options --enable-bootstrap
ac_add_options --with-macos-sdk=$HOME/src/MacOSX26.5.sdk
mk_add_options AUTOCLOBBER=1
# These don't all affect the stub, but they can't hurt, and we'll want them if
# we switch to custom XUL builds
ac_add_options MOZ_ENABLE_JS_DUMP=1
ac_add_options MOZ_ENABLE_FORKSERVER=
ac_add_options MOZ_TELEMETRY_REPORTING=
ac_add_options MOZ_DATA_REPORTING=
ac_add_options --disable-tests
ac_add_options --disable-debug
ac_add_options --disable-debug-symbols
ac_add_options --disable-webrtc
ac_add_options --disable-eme
export MOZILLA_OFFICIAL=1
export RELEASE_OR_BETA=1
MOZ_REQUIRE_SIGNING=
# Official builds require source info, which Mozilla only detects automatically from
# Mercurial checkouts
export MOZ_SOURCE_REPO=https://github.com/mozilla-firefox/firefox
export MOZ_SOURCE_CHANGESET=$(git -C "$topsrcdir" rev-parse HEAD)
ac_add_options --enable-official-branding
# Build updater without MAR signature verification
ac_add_options --enable-unverified-updates

1508
app/mac/mozilla-115.patch Normal file

File diff suppressed because it is too large Load diff

242
app/mac/mozilla-153.patch Normal file
View file

@ -0,0 +1,242 @@
diff --git a/browser/app/nsBrowserApp.cpp b/browser/app/nsBrowserApp.cpp
--- a/browser/app/nsBrowserApp.cpp
+++ b/browser/app/nsBrowserApp.cpp
@@ -193,19 +193,31 @@ static bool HasFlag(int argc, char* argv[], const char* s) {
}
return false;
}
#endif
constinit Bootstrap::UniquePtr gBootstrap;
static int do_main(int argc, char* argv[], char* envp[]) {
+ // Allow profile downgrade for Zotero
+ setenv("MOZ_ALLOW_DOWNGRADE", "1", 1);
+ // Don't create dedicated profile (default-esr)
+ setenv("MOZ_LEGACY_PROFILES", "1", 1);
+
// Allow firefox.exe to launch XULRunner apps via -app <application.ini>
// Note that -app must be the *first* argument.
- const char* appDataFile = getenv("XUL_APP_FILE");
+ UniqueFreePtr<char> iniPath = BinaryPath::GetApplicationIni();
+ if (!iniPath) {
+ Output("Couldn't find application.ini.\n");
+ return 255;
+ }
+ char *appDataFile = iniPath.get();
+
+
if ((!appDataFile || !*appDataFile) && (argc > 1 && IsFlag(argv[1], "app"))) {
if (argc == 2) {
Output("Incorrect number of arguments passed to -app");
return 255;
}
appDataFile = argv[2];
char appEnv[MAXPATHLEN];
diff --git a/xpcom/build/BinaryPath.h b/xpcom/build/BinaryPath.h
--- a/xpcom/build/BinaryPath.h
+++ b/xpcom/build/BinaryPath.h
@@ -126,16 +126,56 @@ class BinaryPath {
} else {
rv = NS_ERROR_FAILURE;
}
CFRelease(executableURL);
return rv;
}
+ static nsresult GetApplicationIni(char aResult[MAXPATHLEN])
+ {
+ // Works even if we're not bundled.
+ CFBundleRef appBundle = CFBundleGetMainBundle();
+ if (!appBundle) {
+ return NS_ERROR_FAILURE;
+ }
+
+ CFURLRef iniURL = CFBundleCopyResourceURL(appBundle, CFSTR("application.ini"),
+ NULL, CFSTR("app"));
+ if (!iniURL) {
+ return NS_ERROR_FAILURE;
+ }
+
+ nsresult rv;
+ if (CFURLGetFileSystemRepresentation(iniURL, false, (UInt8*)aResult,
+ MAXPATHLEN)) {
+ // Sanitize path in case the app was launched from Terminal via
+ // './firefox' for example.
+ size_t readPos = 0;
+ size_t writePos = 0;
+ while (aResult[readPos] != '\0') {
+ if (aResult[readPos] == '.' && aResult[readPos + 1] == '/') {
+ readPos += 2;
+ } else {
+ aResult[writePos] = aResult[readPos];
+ readPos++;
+ writePos++;
+ }
+ }
+ aResult[writePos] = '\0';
+ rv = NS_OK;
+ } else {
+ rv = NS_ERROR_FAILURE;
+ }
+
+ CFRelease(iniURL);
+ return rv;
+ }
+
#elif defined(ANDROID)
static nsresult Get(char aResult[MAXPATHLEN]) {
// On Android, we use the MOZ_ANDROID_LIBDIR variable that is set by the
// Java bootstrap code.
const char* libDir = getenv("MOZ_ANDROID_LIBDIR");
if (!libDir) {
return NS_ERROR_FAILURE;
}
@@ -281,16 +321,29 @@ class BinaryPath {
if (NS_FAILED(Get(path))) {
return nullptr;
}
UniqueFreePtr<char> result;
result.reset(strdup(path));
return result;
}
+#if defined(XP_MACOSX)
+ static UniqueFreePtr<char> GetApplicationIni()
+ {
+ char path[MAXPATHLEN];
+ if (NS_FAILED(GetApplicationIni(path))) {
+ return nullptr;
+ }
+ UniqueFreePtr<char> result;
+ result.reset(strdup(path));
+ return result;
+ }
+#endif
+
#ifdef MOZILLA_INTERNAL_API
static nsresult GetFile(nsIFile** aResult) {
nsCOMPtr<nsIFile> lf;
# ifdef XP_WIN
wchar_t exePath[MAXPATHLEN];
nsresult rv = GetW(exePath);
# else
char exePath[MAXPATHLEN];
diff --git a/mozglue/build/AudioQueueSanitizer.cpp b/mozglue/build/AudioQueueSanitizer.cpp
new file mode 100644
index 000000000000..9efa3255c472
--- /dev/null
+++ b/mozglue/build/AudioQueueSanitizer.cpp
@@ -0,0 +1,91 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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/. */
+
+// Work around a use-after-free in the macOS 27 system speech synthesizer.
+//
+// When an utterance finishes, the AudioQueue player in the private
+// TextToSpeech framework (used by both NSSpeechSynthesizer and
+// AVSpeechSynthesizer) enqueues a short de-click ramp that starts from a
+// sample read out of a buffer it has already freed. With the system
+// allocator, which zeroes freed memory, that sample is 0 and the ramp is
+// silent. mozjemalloc poisons freed memory with 0xE5 instead, which reads
+// as -1.36e23 in float32, so every utterance ends with a ~10 ms full-scale
+// burst.
+//
+// We can't fix the framework, so we interpose AudioQueueEnqueueBuffer and
+// zero any float samples that are non-finite or far outside the nominal
+// [-1, 1] range before they reach CoreAudio. Real audio never gets close
+// to kMaxSampleMagnitude, so this only ever affects garbage.
+//
+// dyld only honors __interpose tuples in images loaded at launch, which is
+// why this needs to be in mozglue rather than in XUL (loaded with dlopen)
+// alongside OSXSpeechSynthesizerService.
+
+#include <AudioToolbox/AudioToolbox.h>
+#include <math.h>
+
+namespace {
+
+constexpr float kMaxSampleMagnitude = 16.0f;
+
+void SanitizeBuffer(AudioQueueRef aQueue, AudioQueueBufferRef aBuffer) {
+ AudioStreamBasicDescription format;
+ UInt32 size = sizeof(format);
+ if (AudioQueueGetProperty(aQueue, kAudioQueueProperty_StreamDescription,
+ &format, &size) != noErr) {
+ return;
+ }
+ if (format.mFormatID != kAudioFormatLinearPCM ||
+ !(format.mFormatFlags & kAudioFormatFlagIsFloat) ||
+ format.mBitsPerChannel != 32) {
+ return;
+ }
+
+ float* samples = static_cast<float*>(aBuffer->mAudioData);
+ UInt32 count = aBuffer->mAudioDataByteSize / sizeof(float);
+ for (UInt32 i = 0; i < count; i++) {
+ // Written so that NaN also fails the comparison.
+ if (!(fabsf(samples[i]) <= kMaxSampleMagnitude)) {
+ samples[i] = 0.0f;
+ }
+ }
+}
+
+OSStatus SanitizingEnqueueBuffer(
+ AudioQueueRef aQueue, AudioQueueBufferRef aBuffer, UInt32 aNumPackets,
+ const AudioStreamPacketDescription* aPacketDescs) {
+ SanitizeBuffer(aQueue, aBuffer);
+ return AudioQueueEnqueueBuffer(aQueue, aBuffer, aNumPackets, aPacketDescs);
+}
+
+OSStatus SanitizingEnqueueBufferWithParameters(
+ AudioQueueRef aQueue, AudioQueueBufferRef aBuffer, UInt32 aNumPackets,
+ const AudioStreamPacketDescription* aPacketDescs, UInt32 aTrimFrames,
+ UInt32 aTrimFramesAtEnd, UInt32 aNumParamValues,
+ const AudioQueueParameterEvent* aParamValues,
+ const AudioTimeStamp* aStartTime, AudioTimeStamp* aActualStartTime) {
+ SanitizeBuffer(aQueue, aBuffer);
+ return AudioQueueEnqueueBufferWithParameters(
+ aQueue, aBuffer, aNumPackets, aPacketDescs, aTrimFrames,
+ aTrimFramesAtEnd, aNumParamValues, aParamValues, aStartTime,
+ aActualStartTime);
+}
+
+struct Interpose {
+ const void* mReplacement;
+ const void* mReplacee;
+};
+
+__attribute__((used, section("__DATA,__interpose"))) const Interpose
+ kInterposes[] = {
+ {reinterpret_cast<const void*>(&SanitizingEnqueueBuffer),
+ reinterpret_cast<const void*>(&AudioQueueEnqueueBuffer)},
+ {reinterpret_cast<const void*>(&SanitizingEnqueueBufferWithParameters),
+ reinterpret_cast<const void*>(
+ &AudioQueueEnqueueBufferWithParameters)},
+};
+
+} // namespace
diff --git a/mozglue/build/moz.build b/mozglue/build/moz.build
index f8f01e999e54..111fe5af1b0d 100644
--- a/mozglue/build/moz.build
+++ b/mozglue/build/moz.build
@@ -41,6 +41,14 @@ if CONFIG["OS_TARGET"] == "WINNT":
"winmm.dll",
]
+if CONFIG["OS_TARGET"] == "Darwin" and FORCE_SHARED_LIB:
+ SOURCES += [
+ "AudioQueueSanitizer.cpp",
+ ]
+ OS_LIBS += [
+ "-framework AudioToolbox",
+ ]
+
if CONFIG["MOZ_WIDGET_TOOLKIT"]:
if CONFIG["MOZ_MEMORY"] and FORCE_SHARED_LIB:
pass

1581
app/mac/pkg-dmg Executable file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,69 @@
#!/bin/bash
# Replace channel in ChannelPrefs, with appropriate null-byte padding
#
# ChannelPrefs.framework needs to be signed, which we can't do during normal source builds, so we
# use this to replace 'default' in our custom framework with 'source\0' and store that, and then
# when making real builds we replace 'source\0' with 'release'/'beta'/'dev'/'test' (padded to 7 chars)
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$APP_ROOT_DIR/config.sh"
if [ -z "${1:-}" ] || [ -z "${2:-}" ] || [ -z "${3:-}" ]; then
echo "Usage: $0 /path/to/ChannelPrefs.framework/ChannelPrefs from_channel to_channel" >&2
exit 1
fi
binary=$1
from_channel=$2
to_channel=$3
# `strings` has a 4-character minimum by default, but we need 3 for 'dev'
# `-arch all` scans all slices of the universal binary rather than just the host architecture
strings_cmd="strings -n 3 -arch all"
if [ ${#to_channel} -gt 7 ]; then
echo "Channel length cannot exceed 7 characters -- aborting" >&2
exit 1
fi
if [ $($strings_cmd "$binary" | grep -c "$from_channel") -ne 2 ] ; then
echo "$from_channel not found twice in ChannelPrefs" >&2
echo >&2
$strings_cmd "$binary" >&2
exit 1
fi
original_size=$(wc -c "$binary" | awk '{print $1}')
perl -pi -e '
binmode(STDIN);
binmode(STDOUT);
use bytes;
my @channels = qw(release beta dev test source); # List of valid channels
# Channels from Bash
my $from_channel = "'"$from_channel"'";
my $to_channel = "'"$to_channel"'";
if (grep { $_ eq $to_channel } @channels) {
# Pad channels with null bytes
$from_channel .= "\0" x (7 - length($from_channel));
$to_channel .= "\0" x (7 - length($to_channel));
} else {
die "Unknown update channel: $to_channel\n";
}
s/$from_channel/$to_channel/g;
' "$binary"
new_size=$(wc -c "$binary" | awk '{print $1}')
if [ $original_size -ne $new_size ]; then
echo "File size of ChannelPrefs has changed -- aborting" >&2
exit 1
fi
if [ $($strings_cmd "$binary" | grep -c "$to_channel") -ne 2 ] ; then
echo "$to_channel not found twice in ChannelPrefs" >&2
$strings_cmd "$binary" >&2
exit 1
fi
$strings_cmd "$binary"

3
app/mac/updater.tar.xz Normal file
View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:361730d7cea854b38c6968143555c5f5fe251e1c95f265a6133514ee72ea2c53
size 98904

10
app/mac/updater_renamer Executable file
View file

@ -0,0 +1,10 @@
#!/usr/bin/env python3
# Convert localized app name from "Firefox Software Update" to "Zotero Software Update"
#
# plist is UTF-16
f='updater.app/Contents/Resources/English.lproj/InfoPlist.strings'
with open(f, 'r', encoding='utf-16') as inputfile:
newText = inputfile.read().replace('Firefox', 'Zotero')
with open(f, 'w', encoding='utf-16') as outputfile:
outputfile.write(newText)

BIN
app/mac/zotero.xz Executable file

Binary file not shown.

@ -0,0 +1 @@
Subproject commit 2e78b1010ad49b4dde70ec9f0094b34a7b6f8965

@ -0,0 +1 @@
Subproject commit 300886d1984de7a0006d7a48310baa0c8c99bea0

@ -0,0 +1 @@
Subproject commit c0aa6e4bef039d94e17e81cb28b1fe9170c45b96

View file

@ -0,0 +1,64 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
ROOT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
. "$APP_ROOT_DIR/config.sh"
CHANNEL="release"
BRANCH="10.0"
BUILD_ONLY=0
if [ "`uname`" = "Darwin" ]; then
export SAFARI_APPEX="$ROOT_DIR/../safari-web-extension-builds/ZoteroSafariExtension.appex"
export SAFARI_EXT_RESOURCES="$ROOT_DIR/../safari-web-extension-builds/release/safari"
export SAFARI_APP_EXTENSION="$ROOT_DIR/../safari-app-extension-builds/release/ZoteroSafariExtension.appex"
if [ ! -d "$SAFARI_APPEX" ]; then
echo "Safari extension stub not found at $SAFARI_APPEX -- aborting" >&2
exit 1
fi
if [ ! -f "$SAFARI_EXT_RESOURCES/manifest.json" ]; then
echo "Safari web extension not found in $SAFARI_EXT_RESOURCES -- aborting" >&2
exit 1
fi
if [ ! -d "$SAFARI_APP_EXTENSION" ]; then
echo "Safari App Extension not found at $SAFARI_APP_EXTENSION -- aborting" >&2
exit 1
fi
fi
while getopts "b" opt; do
case $opt in
b)
BUILD_ONLY=1
;;
esac
shift $((OPTIND-1)); OPTIND=1
done
cd "$SCRIPT_DIR"
./check_requirements
hash=`./get_repo_branch_hash $BRANCH`
./check_app_matches_commit $hash
source_dir=`./get_commit_files $hash`
build_dir=`mktemp -d`
function cleanup {
rm -rf "$source_dir"
rm -rf "$build_dir"
}
trap cleanup EXIT
./prepare_build -s "$source_dir" -o "$build_dir" -c $CHANNEL -m $hash
VERSION="`cat \"$build_dir/version\"`"
./build_for_deploy -d "$build_dir" -p $BUILD_PLATFORMS -c $CHANNEL
if [ $BUILD_ONLY -eq 1 ]; then
echo
echo "Build only -- skipping deploy."
echo "To deploy, run on the deploy server:"
echo " $DEPLOY_PATH/deploy $CHANNEL $VERSION $BUILD_PLATFORMS"
else
ssh $DEPLOY_HOST "$DEPLOY_PATH/deploy" $CHANNEL "$VERSION" $BUILD_PLATFORMS
fi

55
app/scripts/add_omni_file Executable file
View file

@ -0,0 +1,55 @@
#!/bin/bash
set -euo pipefail
#
# Zip a file directly into app/omni.ja in staging/
#
# Zip paths are relative to the current directory, so this should be run from
# the client build/ directory
#
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
function usage {
cat >&2 <<DONE
Usage: $0 path/to/file
DONE
exit 1
}
if [ -z "${1:-}" ]; then
usage
fi
files="$@"
for file in $files; do
if [ ! -f "$file" ]; then
echo "Error: $file not found!"
exit 1
fi
done
mac_path="$STAGE_DIR/Zotero.app/Contents/Resources"
win_path="$STAGE_DIR/Zotero_win-x64"
linux_path="$STAGE_DIR/Zotero_linux-x86_64"
added=0
build_id=$(date +%Y%m%d%H%M%S)
for path in "$mac_path" "$win_path" "$linux_path"; do
if [ -d "$path" ]; then
echo "$path/app/omni.ja"
echo "Updating $(basename $(dirname $(dirname $path)))"
zip "$path/app/omni.ja" $files
# Bump BuildID so that startup caches are invalidated
perl -pi -e "s/^BuildID=.*/BuildID=$build_id/" "$path/app/application.ini"
added=1
fi
done
if [ $added -eq 0 ]; then
echo "No directories found in staging!"
exit 1
fi

62
app/scripts/add_version_info Executable file
View file

@ -0,0 +1,62 @@
#!/usr/bin/env python3
"""
Update a builds manifest with info on a given build
"""
import argparse
import os
import re
import sys
import shutil
import json
import traceback
MAJOR = None
parser = argparse.ArgumentParser(
description='Update a builds manifest with info on a given build',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-f', '--file', required=True, help="path to updates.json")
parser.add_argument('-v', '--version', required=True, help='version number of build')
parser.add_argument('-b', '--build_id', required=True, help="build ID ('20160801142343')")
args = parser.parse_args()
def main():
try:
file = args.file
version = args.version
short_version = re.match(r'\d+\.\d+', version).group(0)
# Back up JSON file
shutil.copy2(file, file + '.bak')
# Read in existing file
with open(file) as f:
updates = json.loads(f.read())
updates.append({
'version': version,
'buildID': args.build_id,
'detailsURL': f'https://www.zotero.org/support/{short_version}_changelog',
'major': MAJOR
})
# Keep last 5 entries
updates = updates[-5:]
# Write new file
updates = json.dumps(updates, indent=2)
with open(file, 'w') as f:
f.write(updates + "\n")
print(updates)
return 0
except Exception as err:
sys.stderr.write("\n" + traceback.format_exc())
return 1
if __name__ == '__main__':
sys.exit(main())

View file

@ -0,0 +1,64 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
ROOT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
. "$APP_ROOT_DIR/config.sh"
CHANNEL="beta"
BRANCH="main"
BUILD_ONLY=0
if [ "`uname`" = "Darwin" ]; then
export SAFARI_APPEX="$ROOT_DIR/../safari-web-extension-builds/ZoteroSafariExtension.appex"
export SAFARI_EXT_RESOURCES="$ROOT_DIR/../safari-web-extension-builds/beta/safari"
export SAFARI_APP_EXTENSION="$ROOT_DIR/../safari-app-extension-builds/beta/ZoteroSafariExtension.appex"
if [ ! -d "$SAFARI_APPEX" ]; then
echo "Safari extension stub not found at $SAFARI_APPEX -- aborting" >&2
exit 1
fi
if [ ! -f "$SAFARI_EXT_RESOURCES/manifest.json" ]; then
echo "Safari web extension not found in $SAFARI_EXT_RESOURCES -- aborting" >&2
exit 1
fi
if [ ! -d "$SAFARI_APP_EXTENSION" ]; then
echo "Safari App Extension not found at $SAFARI_APP_EXTENSION -- aborting" >&2
exit 1
fi
fi
while getopts "b" opt; do
case $opt in
b)
BUILD_ONLY=1
;;
esac
shift $((OPTIND-1)); OPTIND=1
done
cd "$SCRIPT_DIR"
./check_requirements
hash=`./get_repo_branch_hash $BRANCH`
./check_app_matches_commit $hash
source_dir=`./get_commit_files $hash`
build_dir=`mktemp -d`
function cleanup {
rm -rf "$source_dir"
rm -rf "$build_dir"
}
trap cleanup EXIT
./prepare_build -s "$source_dir" -o "$build_dir" -c $CHANNEL -m $hash
VERSION="`cat \"$build_dir/version\"`"
./build_for_deploy -d "$build_dir" -p $BUILD_PLATFORMS -c $CHANNEL
if [ $BUILD_ONLY -eq 1 ]; then
echo
echo "Build only -- skipping deploy."
echo "To deploy, run on the deploy server:"
echo " $DEPLOY_PATH/deploy $CHANNEL $VERSION $BUILD_PLATFORMS"
else
ssh $DEPLOY_HOST "$DEPLOY_PATH/deploy" $CHANNEL "$VERSION" $BUILD_PLATFORMS
fi

98
app/scripts/build_and_run Executable file
View file

@ -0,0 +1,98 @@
#!/bin/bash -e
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
ROOT_DIR="$(dirname $APP_ROOT_DIR)"
# Set ZOTERO_PROFILE environment variable to choose profile
profile_args=()
if [ -n "${ZOTERO_PROFILE:-}" ]; then
profile_args=(-p "$ZOTERO_PROFILE")
fi
FORCE_FULL=0
NO_REBUILD=0
SKIP_BUNDLED_FILES=0
DEBUGGER=0
while getopts "rfnbd" opt; do
case $opt in
r)
# Deprecated -- rebuilding is now the default
echo "-r is deprecated -- rebuilding is now the default (use -n to skip)" >&2
;;
f)
FORCE_FULL=1
;;
n)
NO_REBUILD=1
;;
b)
SKIP_BUNDLED_FILES=1
;;
d)
DEBUGGER=1
;;
\?)
exit 1
;;
esac
done
# Remove options from $@
shift $((OPTIND-1))
if [ $NO_REBUILD -eq 0 ]; then
PARAMS=""
if [ $DEBUGGER -eq 1 ]; then
PARAMS="-t"
fi
if [ $FORCE_FULL -eq 1 ]; then
PARAMS="$PARAMS -f"
fi
# Check if build watch is running
# If not, run now
if ! ps u | grep js-build/build.js | grep -v grep > /dev/null; then
echo "Running JS build process"
echo
cd $ROOT_DIR
# TEMP: --openssl-legacy-provider avoids a build error in pdf.js
NODE_OPTIONS=--openssl-legacy-provider node js-build/build.js
echo
fi
"$SCRIPT_DIR/dir_build" $PARAMS
fi
PARAMS=""
if [ $SKIP_BUNDLED_FILES -eq 1 ]; then
PARAMS="$PARAMS -ZoteroSkipBundledFiles"
fi
if [ $DEBUGGER -eq 1 ]; then
PARAMS="$PARAMS -jsdebugger"
else
PARAMS="$PARAMS -jsconsole"
fi
if [ "`uname`" = "Darwin" ]; then
command="Zotero.app/Contents/MacOS/zotero"
elif [ "`uname`" = "Linux" ]; then
if [[ "`uname -m`" = "aarch64" ]]; then
command="Zotero_linux-arm64/zotero"
else
command="Zotero_linux-x86_64/zotero"
fi
elif [ "`uname -o 2> /dev/null`" = "Cygwin" ]; then
command="Zotero_win-x64/zotero.exe"
else
echo "Unknown platform" >&2
exit 1
fi
echo
"$APP_ROOT_DIR/staging/$command" "${profile_args[@]}" -ZoteroDebugText $PARAMS "$@"

167
app/scripts/build_for_deploy Executable file
View file

@ -0,0 +1,167 @@
#!/bin/bash
#
# Builds Zotero and uploads to S3 and deploy server, but does not make the build live.
# To make the build live, run the deploy script on the deploy server (or via SSH).
#
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
function usage {
cat >&2 <<DONE
Usage: $0 -d SOURCE_DIR -c CHANNEL -p PLATFORMS
-d SOURCE_DIR Source directory to build from
-c CHANNEL Release channel ('release', 'beta', 'dev')
-p PLATFORMS Platforms to build (m=Mac, w=Windows, l=Linux)
-i INCREMENTALS Number of incremental builds to create
DONE
exit 1
}
SOURCE_DIR=""
CHANNEL=""
PLATFORMS=""
while getopts "d:c:p:i:" opt; do
case $opt in
d)
SOURCE_DIR="$OPTARG"
if [ ! -d "$SOURCE_DIR" ]; then
echo "$SOURCE_DIR not found"
exit 1
fi
;;
c)
CHANNEL="$OPTARG"
;;
p)
PLATFORMS="$OPTARG"
;;
i)
NUM_INCREMENTALS="$OPTARG"
;;
*)
usage
;;
esac
shift $((OPTIND-1)); OPTIND=1
done
if [[ -z "$SOURCE_DIR" ]] || [[ -z "$CHANNEL" ]] || [[ -z "$PLATFORMS" ]]; then
usage
fi
"$SCRIPT_DIR"/check_requirements
VERSION="`cat \"$SOURCE_DIR\"/version`"
if [ -z "$VERSION" ]; then
echo "Error getting version from $SOURCE_DIR/version"
exit 1
fi
# Enforce signing unless a test build or macOS, which doesn't start otherwise
if [[ "$CHANNEL" != "test" || $PLATFORMS = "m" ]]; then
SIGN="-e"
else
SIGN=""
fi
# Build Zotero
"$ROOT_DIR/build.sh" -d "$SOURCE_DIR" -p $PLATFORMS -c $CHANNEL $SIGN
BUILD_ID=`cat "$DIST_DIR/build_id"`
if [ -z "$BUILD_ID" ]; then
echo "Error getting build id"
exit 1
fi
TEMP_DIR=`mktemp -d`
# Clean up on exit
function cleanup {
rm -rf "$TEMP_DIR"
}
trap cleanup EXIT
# Build full update
"$ROOT_DIR/update-packaging/build_autoupdate.sh" -f -c $CHANNEL -p $PLATFORMS -l $VERSION
# Build incremental updates for each platform
for i in `seq 0 1 $((${#PLATFORMS}-1))`
do
case ${PLATFORMS:i:1} in
m)
platform=mac
platform_name=Mac
;;
w)
platform=win
platform_name=Windows
;;
l)
platform=linux
platform_name=Linux
;;
*)
echo "$0: Invalid platform option ${PLATFORMS:i:1}"
usage
;;
esac
echo
echo "Getting $platform_name incrementals"
INCREMENTALS="`\"$SCRIPT_DIR/manage_incrementals\" -c $CHANNEL -p ${PLATFORMS:i:1} -n $NUM_INCREMENTALS`"
# Fetch pinned incrementals from deploy server and merge
PINNED_FILE="$DEPLOY_PATH/manifests/$CHANNEL/pinned-incrementals-$platform"
PINNED=""
if ssh $DEPLOY_HOST "test -f $PINNED_FILE"; then
PINNED="`ssh $DEPLOY_HOST cat $PINNED_FILE`"
fi
# Combine and deduplicate
INCREMENTALS="`echo -e "$INCREMENTALS\n$PINNED" | sort -u | grep -v '^$' || true`"
echo "$INCREMENTALS"
echo
if [ -n "$INCREMENTALS" ]; then
for from in $INCREMENTALS; do
echo "Building incremental update for $platform_name from $from to $VERSION"
"$ROOT_DIR/update-packaging/build_autoupdate.sh" -i "$from" -c "$CHANNEL" -p ${PLATFORMS:i:1} -l $VERSION
echo
done
fi
done
# Upload builds to S3
"$SCRIPT_DIR/upload_builds" $CHANNEL $VERSION
# Upload file lists and build info for each platform
channel_deploy_path="$DEPLOY_PATH/manifests/$CHANNEL"
mkdir "$TEMP_DIR/version_info"
chmod g+ws "$TEMP_DIR/version_info"
cp "$DIST_DIR"/files-* "$TEMP_DIR/version_info"
chmod g+w "$TEMP_DIR"/version_info/files-*
# Generate build-{os}.json for each platform
SHORT_VERSION=$(echo "$VERSION" | grep -oE '^[0-9]+\.[0-9]+')
DETAILS_URL="https://www.zotero.org/support/${SHORT_VERSION}_changelog"
for i in `seq 0 1 $((${#PLATFORMS}-1))`
do
case ${PLATFORMS:i:1} in
m) os_name="mac" ;;
w) os_name="win" ;;
l) os_name="linux" ;;
esac
printf '{\n "buildID": "%s",\n "detailsURL": "%s"\n}\n' "$BUILD_ID" "$DETAILS_URL" \
> "$TEMP_DIR/version_info/build-${os_name}.json"
chmod g+w "$TEMP_DIR/version_info/build-${os_name}.json"
done
rsync -rv "$TEMP_DIR/version_info/" $DEPLOY_HOST:"$channel_deploy_path/$VERSION/"
rm -rf "$STAGE_DIR"/*
echo
echo "Build $VERSION uploaded successfully."
echo "To deploy, run on the deploy server:"
echo " ./deploy $CHANNEL $VERSION $PLATFORMS"

View file

@ -0,0 +1,37 @@
#!/bin/bash
set -euo pipefail
# Check that app/ in this checkout matches app/ in the commit being built.
#
# The build-and-deploy scripts run the build scripts and config from the local
# checkout but build source files from the tip of the remote branch, so a stale
# checkout can silently build with the wrong Gecko version or omni patches.
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
if [ -z "${1:-}" ]; then
echo "Usage: $0 commit-hash" >&2
exit 1
fi
hash=$1
cd "$ROOT_DIR"
if ! git cat-file -e "$hash^{commit}" 2>/dev/null; then
git fetch -q origin
fi
if ! git cat-file -e "$hash^{commit}" 2>/dev/null; then
echo "Commit $hash not found locally after fetching -- aborting" >&2
exit 1
fi
if ! git diff --quiet HEAD "$hash" -- app/; then
echo >&2
echo "app/ files in this checkout differ from app/ in $hash:" >&2
echo >&2
git --no-pager diff --stat HEAD "$hash" -- app/ >&2
echo >&2
echo "Update this checkout (e.g., 'git pull') and try again" >&2
exit 1
fi

158
app/scripts/check_requirements Executable file
View file

@ -0,0 +1,158 @@
#!/bin/bash
set -uo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
ROOT_DIR="$(dirname "$APP_ROOT_DIR")"
. "$APP_ROOT_DIR/config.sh"
. "$SCRIPT_DIR/utils.sh"
cd "$ROOT_DIR"
platform=`get_current_platform`
FAIL_CMD='echo -e \033[31;1mFAIL\033[0m'
FAIL_CMD_INLINE='echo -n -e \033[31;1mFAIL\033[0m'
FAILED=0
hdr_start=`tput smul`
hdr_stop=`tput rmul`
echo "${hdr_start}Checking build requirements:${hdr_stop}"
echo
echo -n "Checking for Node.js: "
which node || { $FAIL_CMD_INLINE; FAILED=1; }
node_version=$(node -v | cut -c 2-)
echo -n "Checking Node version: $node_version"
if [ $(echo $node_version | cut -d '.' -f1 ) -ge "18" ]; then
echo
else
echo -n " -- must be 18 or later "
{ $FAIL_CMD; FAILED=1; }
fi
echo -n "Checking for Git LFS: "
which git-lfs || { $FAIL_CMD_INLINE; FAILED=1; }
echo "Checking for Git LFS checkouts: "
lfs_files=$(git lfs ls-files -n 2> /dev/null) || { $FAIL_CMD; FAILED=1; }
for lfs_file in $lfs_files; do
echo -n " - $lfs_file: "
file_type=$(file -b $lfs_file)
echo -n $file_type" "
if [ -z "$(echo -n $file_type | grep XZ)" ]; then
{ $FAIL_CMD_INLINE; FAILED=1; echo " -- run 'git lfs install; git lfs pull'"; }
fi
echo
done
echo -n "Checking for perl: "
which perl || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for python3: "
which python3 || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for curl: "
which curl || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for zip: "
which zip || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for unzip: "
which unzip || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for xz: "
which xz || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for awk: "
which awk || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for rsync: "
which rsync || { $FAIL_CMD; FAILED=1; }
if [ $platform = "w" ]; then
echo -n "Checking for 7z: "
which 7z || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for rcedit: "
which rcedit || { $FAIL_CMD; FAILED=1; echo " -- Install with fetch_rcedit"; }
fi
if [ $platform = "w" ]; then
echo
echo "${hdr_start}Checking Windows packaging requirements:${hdr_stop}"
echo
echo -n "Checking for upx: "
which upx || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for uuidgen: "
which uuidgen || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for code-signing script: "
if [ -x "$APP_ROOT_DIR/win/codesign" ]; then
echo "$APP_ROOT_DIR/win/codesign"
else
$FAIL_CMD
FAILED=1
fi
echo -n "Checking for Unicode NSIS: "
if [ -x "`cygpath -u \"${NSIS_DIR}makensis.exe\"`" ]; then
echo "`cygpath -u \"${NSIS_DIR}makensis.exe\"`"
else
$FAIL_CMD
FAILED=1
fi
plugin_path=$(cd "$NSIS_DIR\\Plugins\\x86-unicode" && pwd)
plugins="AppAssocReg ApplicationID InvokeShellVerb nsProcess ShellLink UAC"
echo "Checking for NSIS plugins in $plugin_path"
for i in $plugins; do
echo -n " $i.dll: "
if [ -f "$plugin_path/$i.dll" ]; then
echo OK
else
$FAIL_CMD
FAILED=1
fi
done
fi
if [ $platform = "m" ]; then
echo
echo "${hdr_start}Checking Mac packaging requirements:${hdr_stop}"
echo
echo -n "Checking for codesign: "
which /usr/bin/codesign || { $FAIL_CMD; FAILED=1; }
fi
echo
echo "${hdr_start}Checking distribution requirements:${hdr_stop}"
echo
echo -n "Checking for Mozilla ARchive (MAR) tool: "
which mar || { $FAIL_CMD; FAILED=1; echo " -- Install with fetch_mar_tools"; }
echo -n "Checking for mbsdiff: "
which mbsdiff || { $FAIL_CMD; FAILED=1; echo " -- Install with fetch_mar_tools"; }
echo -n "Checking for rsync: "
which rsync || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for sha512sum/shasum: "
which sha512sum 2>/dev/null || which shasum 2>/dev/null || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for AWS CLI: "
which aws || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for AWS S3 access: "
aws s3 ls $S3_BUCKET/$S3_DIST_PATH | sed 's/^[[:blank:]]*//' || { $FAIL_CMD; FAILED=1; }
echo -n "Checking for deploy host directory access: "
ssh $DEPLOY_HOST ls -d $DEPLOY_PATH || { $FAIL_CMD; FAILED=1; }
exit $FAILED

40
app/scripts/codesign_local Executable file
View file

@ -0,0 +1,40 @@
#!/bin/bash
set -euo pipefail
# Perform ad-hoc code signing of Zotero.app for local usage
#
# Currently we sign only the Word dylib, since that's necessary for Zotero developers to work on
# Word integration on Apple Silicon. If we discover other problems, we can uncomment some of the
# other lines. If you're making a custom build, you can modify this file to sign the entire build
# instead of just the bare minimum needed for development.
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
if [ -z "${1:-}" ]; then
echo "Usage: $0 path/to/staging/Zotero.app"
exit 1
fi
APPDIR=$1
DEVELOPER_ID="-"
entitlements_file="$ROOT_DIR/mac/entitlements.xml"
#/usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" \
# "$APPDIR/Contents/MacOS/XUL" \
# "$APPDIR/Contents/MacOS/updater.app/Contents/MacOS/org.mozilla.updater"
#find "$APPDIR/Contents" -name '*.dylib' -exec /usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" {} \;
#find "$APPDIR/Contents" -name '*.app' -exec /usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" {} \;
#/usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" "$APPDIR/Contents/MacOS/zotero"
# Skip signing of Safari extension, since it's not present for local builds
# Sign final app package
#echo
#/usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" "$APPDIR"
# Verify app
#/usr/bin/codesign --verify -vvvv "$APPDIR"
find "$APPDIR/Contents" -name 'libZoteroWordIntegration.dylib' -exec /usr/bin/codesign --force --options runtime --entitlements "$entitlements_file" --sign "$DEVELOPER_ID" {} \;

View file

@ -0,0 +1,76 @@
# Any copyright is dedicated to the Public Domain.
# http://creativecommons.org/publicdomain/zero/1.0/
# Creates the precomplete file containing the remove and rmdir application
# update instructions which is used to remove files and directories that are no
# longer present in a complete update. The current working directory is used for
# the location to enumerate and to create the precomplete file.
import io
import os
def get_build_entries(root_path):
"""Iterates through the root_path, creating a list for each file and
directory. Excludes any file paths ending with channel-prefs.js.
"""
rel_file_path_set = set()
rel_dir_path_set = set()
for root, dirs, files in os.walk(root_path):
for file_name in files:
parent_dir_rel_path = root[len(root_path) + 1 :]
rel_path_file = os.path.join(parent_dir_rel_path, file_name)
rel_path_file = rel_path_file.replace("\\", "/")
if not (
rel_path_file.endswith("channel-prefs.js")
or rel_path_file.endswith("update-settings.ini")
or "/ChannelPrefs.framework/" in rel_path_file
or rel_path_file.startswith("ChannelPrefs.framework/")
or "/UpdateSettings.framework/" in rel_path_file
or rel_path_file.startswith("UpdateSettings.framework/")
or "distribution/" in rel_path_file
):
rel_file_path_set.add(rel_path_file)
for dir_name in dirs:
parent_dir_rel_path = root[len(root_path) + 1 :]
rel_path_dir = os.path.join(parent_dir_rel_path, dir_name)
rel_path_dir = rel_path_dir.replace("\\", "/") + "/"
if rel_path_dir.find("distribution/") == -1:
rel_dir_path_set.add(rel_path_dir)
rel_file_path_list = list(rel_file_path_set)
rel_file_path_list.sort(reverse=True)
rel_dir_path_list = list(rel_dir_path_set)
rel_dir_path_list.sort(reverse=True)
return rel_file_path_list, rel_dir_path_list
def generate_precomplete(root_path):
"""Creates the precomplete file containing the remove and rmdir
application update instructions. The given directory is used
for the location to enumerate and to create the precomplete file.
"""
rel_path_precomplete = "precomplete"
# If inside a Mac bundle use the root of the bundle for the path.
if os.path.basename(root_path) == "Resources":
root_path = os.path.abspath(os.path.join(root_path, "../../"))
rel_path_precomplete = "Contents/Resources/precomplete"
precomplete_file_path = os.path.join(root_path, rel_path_precomplete)
# Open the file so it exists before building the list of files and open it
# in binary mode to prevent OS specific line endings.
precomplete_file = io.open(precomplete_file_path, mode="wt", newline="\n")
rel_file_path_list, rel_dir_path_list = get_build_entries(root_path)
for rel_file_path in rel_file_path_list:
precomplete_file.write('remove "' + rel_file_path + '"\n')
for rel_dir_path in rel_dir_path_list:
precomplete_file.write('rmdir "' + rel_dir_path + '"\n')
precomplete_file.close()
if __name__ == "__main__":
generate_precomplete(os.getcwd())

View file

@ -0,0 +1,41 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
ROOT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
. "$APP_ROOT_DIR/config.sh"
CHANNEL="dev"
BRANCH="main"
if [ "`uname`" = "Darwin" ]; then
export SAFARI_APPEX="$ROOT_DIR/../safari-web-extension-builds/ZoteroSafariExtension.appex"
export SAFARI_EXT_RESOURCES="$ROOT_DIR/../safari-web-extension-builds/dev/safari"
if [ ! -d "$SAFARI_APPEX" ]; then
echo "Safari extension stub not found at $SAFARI_APPEX -- aborting" >&2
exit 1
fi
if [ ! -f "$SAFARI_EXT_RESOURCES/manifest.json" ]; then
echo "Safari web extension not found in $SAFARI_EXT_RESOURCES -- aborting" >&2
exit 1
fi
fi
cd "$SCRIPT_DIR"
./check_requirements
hash=`./get_repo_branch_hash $BRANCH`
./check_app_matches_commit $hash
source_dir=`./get_commit_files $hash`
build_dir=`mktemp -d`
function cleanup {
rm -rf "$source_dir"
rm -rf "$build_dir"
}
trap cleanup EXIT
./prepare_build -s "$source_dir" -o "$build_dir" -c $CHANNEL -m $hash
VERSION="`cat \"$build_dir/version\"`"
./build_for_deploy -d "$build_dir" -p $BUILD_PLATFORMS -c $CHANNEL -i 1
ssh $DEPLOY_HOST "$DEPLOY_PATH/deploy" $CHANNEL "$VERSION" $BUILD_PLATFORMS

175
app/scripts/dir_build Executable file
View file

@ -0,0 +1,175 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
ROOT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
. "$APP_ROOT_DIR/config.sh"
. "$SCRIPT_DIR/utils.sh"
function usage {
cat >&2 <<DONE
Usage: $0 [options]
If -p is omitted, platform (and, for Windows/Linux, architecture) default to the host system.
Architecture is ignored for Mac builds, which are always shipped as universal binaries.
Options
-p PLATFORM Platform to build (m=Mac, w=Windows, l=Linux)
-a ARCH Target architecture (arm64, x64, win32) — **Windows/Linux only**
-t add devtools
-f force a full rebuild instead of updating the staged build in place
DONE
exit 1
}
platform=""
arch=""
devtools=0
force_full=0
while getopts "tp:a:f" opt; do
case $opt in
t)
devtools=1
;;
p)
for (( i=0; i<${#OPTARG}; i++ )); do
case ${OPTARG:i:1} in
m) platform="m";;
w) platform="w";;
l) platform="l";;
*)
echo "$0: Invalid platform option ${OPTARG:i:1}" >&2
usage
;;
esac
done
;;
a)
arch="$OPTARG"
;;
f)
force_full=1
;;
\?)
usage
;;
esac
done
# Derive platform from host if not provided
if [[ -z $platform ]]; then
case "$(uname -s)" in
Darwin) platform="m" ;;
Linux) platform="l" ;;
CYGWIN*|MINGW*) platform="w" ;;
esac
fi
# Handle architecture rules
if [[ $platform = "m" ]]; then
# No arch for Mac — ignore anything provided
if [[ -n $arch ]]; then
echo "Ignoring -a $arch for Mac build (universal binary)" >&2
fi
arch=""
else
# Windows / Linux: derive arch if not supplied
if [[ -z $arch ]]; then
# An x64 build of Git for Windows runs emulated on Windows on ARM, where it
# reports x86_64 from `uname -m`, while `uname -s` reports the native
# architecture
if [[ $platform = "w" && "$(uname -s)" == *ARM64* ]]; then
arch="arm64"
else
case "$(uname -m)" in
arm64|aarch64) arch="arm64" ;;
x86_64) arch="x64" ;;
esac
fi
fi
fi
CHANNEL="source"
# Remove stale symlinks left behind in build/ when source files are deleted,
# which would otherwise break the build
if [ -d "$ROOT_DIR/build" ]; then
# With -L, -type l matches only broken symlinks
stale_links=$(find -L "$ROOT_DIR/build" -type l -print)
if [ -n "$stale_links" ]; then
echo "Removing stale symlinks from build/:" >&2
echo "$stale_links" >&2
while IFS= read -r link; do
rm "$link"
done <<< "$stale_links"
fi
fi
# Try to update the staged build in place instead of doing a full rebuild
if [[ $force_full -eq 0 ]]; then
incr_cmd=("$SCRIPT_DIR/incremental_update" -p "$platform")
[[ -n $arch ]] && incr_cmd+=( -a "$arch" )
[[ $devtools -eq 1 ]] && incr_cmd+=( -t )
set +e
"${incr_cmd[@]}"
incr_status=$?
set -e
if [ $incr_status -ne 2 ]; then
exit $incr_status
fi
fi
hash=$(git -C "$ROOT_DIR" rev-parse --short HEAD)
build_dir=$(mktemp -d)
manifest_tmp=""
cleanup() {
rm -rf "$build_dir"
if [ -n "$manifest_tmp" ]; then
rm -f "$manifest_tmp"
fi
}
trap cleanup EXIT
# Snapshot the state of build/ and app/ before the build for later incremental
# updates
app_hash=""
if [ -d "$ROOT_DIR/build" ]; then
manifest_tmp=$(mktemp)
generate_build_manifest "$ROOT_DIR/build" > "$manifest_tmp"
app_hash=$(generate_app_hash "$APP_ROOT_DIR")
fi
"$SCRIPT_DIR/prepare_build" -s "$ROOT_DIR/build" -o "$build_dir" -c "$CHANNEL" -m "$hash"
build_cmd=("$APP_ROOT_DIR/build.sh" -d "$build_dir" -p "$platform" -c "$CHANNEL" -s -q)
[[ -n $arch ]] && build_cmd+=( -a "$arch" )
[[ $devtools -eq 1 ]] && build_cmd+=( -t )
"${build_cmd[@]}"
# Save manifest for future incremental updates
if [ -n "$manifest_tmp" ]; then
if [[ -z "${ZOTERO_TEST:-}" ]] || [[ "${ZOTERO_TEST:-}" == "0" ]]; then
include_tests=0
else
include_tests=1
fi
{
echo "#format=2"
echo "#include_tests=$include_tests"
echo "#devtools=$devtools"
echo "#app_hash=$app_hash"
cat "$manifest_tmp"
} > "$STAGE_DIR/.build-manifest"
fi
# Ad-hoc-sign the Word dylib so it works on Apple Silicon. This only needs to
# happen when the staged build is fully rebuilt -- incremental updates don't
# touch the dylib.
if [[ $platform = "m" ]] && [[ "$(uname -s)" = "Darwin" ]]; then
"$SCRIPT_DIR/codesign_local" "$STAGE_DIR/Zotero.app"
fi
echo Done

22
app/scripts/fetch_mar_tools Executable file
View file

@ -0,0 +1,22 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
cd "$APP_ROOT_DIR"
mkdir -p "xulrunner/bin"
if [ "`uname`" = "Darwin" ]; then
# Mozilla has Linux executables where the Mac files should be, so supply our own Mac builds
curl -o "xulrunner/bin/mar" https://zotero-download.s3.us-east-1.amazonaws.com/tools/mac/102.11.0esr/mar
curl -o "xulrunner/bin/mbsdiff" https://zotero-download.s3.us-east-1.amazonaws.com/tools/mac/102.11.0esr/mbsdiff
elif [ "`uname -o 2> /dev/null`" = "Cygwin" ]; then
# Mozilla doesn't seem to provide Windows versions via its file server anymore, so supply our own
curl -o "xulrunner/bin/mar.exe" https://zotero-download.s3.us-east-1.amazonaws.com/tools/win/102.11.0esr/mar.exe
curl -o "xulrunner/bin/mbsdiff.exe" https://zotero-download.s3.us-east-1.amazonaws.com/tools/win/102.11.0esr/mbsdiff.exe
else
curl -o "xulrunner/bin/mar" https://ftp.mozilla.org/pub/firefox/nightly/2022/05/2022-05-30-09-39-43-mozilla-central/mar-tools/linux64/mar
curl -o "xulrunner/bin/mbsdiff" https://ftp.mozilla.org/pub/firefox/nightly/2022/05/2022-05-30-09-39-43-mozilla-central/mar-tools/linux64/mbsdiff
fi
chmod 755 xulrunner/bin/mar xulrunner/bin/mbsdiff

11
app/scripts/fetch_rcedit Executable file
View file

@ -0,0 +1,11 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
cd "$ROOT_DIR"
mkdir -p "xulrunner/bin"
curl -L -o "xulrunner/bin/rcedit.exe" https://github.com/electron/rcedit/releases/download/v1.1.1/rcedit-x86.exe
chmod 755 xulrunner/bin/rcedit

855
app/scripts/fetch_xulrunner Executable file
View file

@ -0,0 +1,855 @@
#!/bin/bash
set -euo pipefail
# Copyright (c) 2011 Zotero
# Center for History and New Media
# George Mason University, Fairfax, Virginia, USA
# http://zotero.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$APP_ROOT_DIR/config.sh"
. "$SCRIPT_DIR/utils.sh"
cd "$APP_ROOT_DIR"
usage() {
cat >&2 <<'DONE'
Usage: fetch_xulrunner.sh -p <m|w|l> [-a ARCH]
Required
-p PLATFORM m (Mac), w (Windows), l (Linux)
Optional / Conditional
-a ARCH - Mac: disallowed (builds are universal)
- Windows: x64 | arm64 | win32
- Linux: x64 (or x86_64) | arm64
If omitted on Windows/Linux, all standard archs are fetched.
DONE
exit 1
}
BUILD_MAC=0
BUILD_WIN=0
BUILD_LINUX=0
arch=""
while getopts 'p:a:' opt; do
case $opt in
p)
for (( i=0; i<${#OPTARG}; i++ )); do
case ${OPTARG:i:1} in
m) BUILD_MAC=1;;
w) BUILD_WIN=1;;
l) BUILD_LINUX=1;;
*) echo "Invalid platform: ${OPTARG:i:1}"; echo; usage;;
esac
done;;
a) arch="$OPTARG";;
*) usage;;
esac
shift $((OPTIND-1)); OPTIND=1
done
# Require at least one platform
if [[ $BUILD_MAC == 0 ]] && [[ $BUILD_WIN == 0 ]] && [[ $BUILD_LINUX == 0 ]]; then
usage
fi
# Sanity‑check arch flag vs platform selections
if [[ $BUILD_MAC == 1 ]]; then
[[ -n $arch ]] && { echo "-a is not allowed for Mac" >&2; echo; usage; }
fi
if [[ $BUILD_WIN == 1 || $BUILD_LINUX == 1 ]]; then
# arch optional; if provided validate & map aliases now
if [[ -n $arch ]]; then
if [[ $BUILD_WIN == 1 && $BUILD_LINUX == 1 ]]; then
echo "-a cannot be used when building both Windows and Linux simultaneously" >&2; echo; usage
fi
if [[ $BUILD_WIN == 1 ]]; then
case $arch in
x64) arch="win-x64" ;;
arm64) arch="win-arm64" ;;
win32|win-x64|win-arm64) ;;
*) echo "Invalid Windows arch: $arch" >&2; echo; usage;;
esac
fi
if [[ $BUILD_LINUX == 1 ]]; then
[[ $arch == x64 ]] && arch="x86_64"
case $arch in x86_64|arm64) ;; *) echo "Invalid Linux arch: $arch" >&2; echo; usage;; esac
fi
fi
fi
function get_utf16_chars {
str=$(echo -n "$1" | xxd -p | fold -w 2 | sed -r 's/(.+)/\\\\x{\1}\\\\x{00}/')
# Add NUL padding
if [ -n "${2:-}" ]; then
# Multiply characters x 2 for UTF-16
for i in `seq 1 $(($2 * 2))`; do
str+=$(echo '\\x{00}')
done
fi
echo $str | xargs | sed 's/ //g'
}
#
# Make various modifications to the stock Firefox app
#
function modify_omni {
platform=$1
mkdir omni
mv omni.ja omni
cd omni
# omni.ja is an "optimized" ZIP file, so use a script from Mozilla to avoid a warning from unzip
# here and to make it work after rezipping below
python3 "$APP_ROOT_DIR/scripts/optimizejars.py" --deoptimize ./ ./ ./
rm -f omni.ja.log
unzip omni.ja
rm omni.ja
rm -r chrome/pdfjs
rm -r modules/narrate
#rm -r modules/translation
rm actors/AboutTranslations{Parent,Child}.sys.mjs
rm actors/CookieBanner{Parent,Child}.sys.mjs
rm actors/PictureInPictureChild.sys.mjs
rm actors/ThumbnailsChild.sys.mjs
rm actors/Translations{Engine,}{Parent,Child}.sys.mjs
rm actors/AudioPlayback{Parent,Child}.sys.mjs
replace_line 'BROWSER_CHROME_URL:.+' 'BROWSER_CHROME_URL: "chrome:\/\/zotero\/content\/zoteroPane.xhtml",' modules/AppConstants.sys.mjs
# Used by OSKeyStore as the master-key label, visible in macOS Keychain Access.
# Verify that OSKeyStore still derives the label from MOZ_APP_BASENAME, so a
# future Mozilla change to a hardcoded string doesn't silently rebrand the
# keychain entry back to "Firefox Encrypted Storage".
replace_line 'MOZ_APP_BASENAME: "Firefox"' 'MOZ_APP_BASENAME: "Zotero"' modules/AppConstants.sys.mjs
check_line 'STORE_LABEL: AppConstants\.MOZ_APP_BASENAME \+ " Encrypted Storage"' modules/OSKeyStore.sys.mjs
# https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/internals/preferences.html
#
# It's not clear that most of these do anything anymore when not compiled in, but just in case
replace_line 'MOZ_REQUIRE_SIGNING:' 'MOZ_REQUIRE_SIGNING: false \&\&' modules/AppConstants.sys.mjs
replace_line 'MOZ_DATA_REPORTING:' 'MOZ_DATA_REPORTING: false \&\&' modules/AppConstants.sys.mjs
replace_line 'MOZ_TELEMETRY_REPORTING:' 'MOZ_TELEMETRY_REPORTING: false \&\&' modules/AppConstants.sys.mjs
replace_line 'MOZ_CRASHREPORTER:' 'MOZ_CRASHREPORTER: false \&\&' modules/AppConstants.sys.mjs
replace_line 'MOZ_UPDATE_CHANNEL:.+' 'MOZ_UPDATE_CHANNEL: "none",' modules/AppConstants.sys.mjs
replace_line '"https:\/\/[^\/]+mozilla.com.+"' '""' modules/AppConstants.sys.mjs
# Don't use Mozilla Maintenance Service on Windows
replace_line 'MOZ_MAINTENANCE_SERVICE:' 'MOZ_MAINTENANCE_SERVICE: false \&\&' modules/AppConstants.sys.mjs
# Continue using app.update.auto in prefs.js on Windows
replace_line 'PER_INSTALLATION_PREFS_PLATFORMS = \["win"\]' 'PER_INSTALLATION_PREFS_PLATFORMS = []' modules/UpdateUtils.sys.mjs
# Prompt if major update is available instead of installing automatically on restart
replace_line 'if \(!updateAuto\) \{' 'if (update.type == "major") {
LOG("UpdateService:_selectAndInstallUpdate - prompting because it is a major update");
AUSTLMY.pingCheckCode(this._pingSuffix, AUSTLMY.CHK_SHOWPROMPT_PREF);
Services.obs.notifyObservers(update, "update-available", "show-prompt");
return;
}
if (!updateAuto) {' modules/UpdateService.sys.mjs
# Avoid console warning about resource://gre/modules/FxAccountsCommon.js
replace_line 'const logins = this._data.logins;' 'const logins = this._data.logins; if (this._data.logins.length != -1) return;' modules/LoginStore.sys.mjs
# Prevent error during network requests
replace_line 'async lazyInit\(\) \{' 'async lazyInit() { if (this.features) return false;' modules/UrlClassifierExceptionListService.sys.mjs
# Silence CrashManager "Could not get children of [...]/Crash Reports/events" spam
replace_line '\/\/ Missing events folders are allowed' '\/\/ Missing events folders are allowed (silence warning)
if (ex) return entries;' modules/CrashManager.sys.mjs
# Several services pull in services-settings (which we strip) and throw
# at profile-after-change. Remove their #init() methods to prevent errors.
replace_line 'async #init\(\) \{' 'async #init() {} async _unused_init() {' modules/EssentialDomainsRemoteSettings.sys.mjs
replace_line 'async #init\(\) \{' 'async #init() {} async _unused_init() {' modules/SimpleURIUnknownSchemesRemoteObserver.sys.mjs
# RemotePermissionService uses a top-level import, so even loading the
# module throws
replace_line 'import \{ RemoteSettings \} from "resource:\/\/services-settings\/remote-settings.sys.mjs";' \
'const RemoteSettings = () => ({ on() {}, get: async () => [] });' \
modules/RemotePermissionService.sys.mjs
replace_line 'pref\("network.captive-portal-service.enabled".+' 'pref("network.captive-portal-service.enabled", false);' greprefs.js
replace_line 'pref\("network.connectivity-service.enabled".+' 'pref("network.connectivity-service.enabled", false);' greprefs.js
replace_line 'pref\("toolkit.telemetry.server".+' 'pref("toolkit.telemetry.server", "");' greprefs.js
replace_line 'pref\("toolkit.telemetry.unified".+' 'pref("toolkit.telemetry.unified", false);' greprefs.js
replace_line 'pref\("media.gmp-manager.url".+' 'pref("media.gmp-manager.url", "");' greprefs.js
#
# # Disable transaction timeout
# perl -pi -e 's/let timeoutPromise/\/*let timeoutPromise/' modules/Sqlite.jsm
# perl -pi -e 's/return Promise.race\(\[transactionPromise, timeoutPromise\]\);/*\/return transactionPromise;/' modules/Sqlite.jsm
# rm -f jsloader/resource/gre/modules/Sqlite.jsm
#
# Disable unwanted components
remove_line '(RemoteSettings|services-|telemetry|Telemetry|URLDecorationAnnotationsService)' components/components.manifest
file="modules/ActorManagerParent.sys.mjs"
# Remove deleted actors
# Entries in the JSWINDOWACTORS/JSPROCESSACTORS literals:
remove_between '^ AudioPlayback: \{' '^ },' $file
remove_between '^ CookieBanner: \{' '^ },' $file
remove_between '^ Thumbnails: \{' '^ },' $file
remove_between '^ Translations: \{' '^ },' $file
remove_between '^ TranslationsEngine: \{' '^ },' $file
# Entries added conditionally after the literals:
remove_between '^ JSWINDOWACTORS\.AboutTranslations = \{' '^ \};' $file
remove_between '^ JSWINDOWACTORS\.PictureInPictureLauncher = \{' '^ \};' $file
remove_between '^ JSWINDOWACTORS\.PictureInPictureToggle = \{' '^ \};' $file
remove_between '^ JSWINDOWACTORS\.PictureInPicture = \{' '^ \};' $file
# Do not trigger LoginManager event that logs an error on autocomplete submission
remove_line 'DOMInputPasswordAdded: \{\},' $file
# On Mac/Linux, ignore relative paths in PATH in Subprocess.pathSearch(), used when a bare command is passed to Utilities.Internal.subprocess()
if [[ $platform != win* ]]; then
replace_line 'let path = PathUtils.join\(dir, bin\);' 'if (!dir.startsWith("\/")) continue; let path = PathUtils.join(dir, bin);' modules/subprocess/subprocess_unix.sys.mjs
fi
# Remove unwanted files
pushd modules
rm Bookmarks*
rm FxAccounts*
echo '' > FingerprintingWebCompatService.sys.mjs
echo '' > PartitioningExceptionListService.sys.mjs
rm Places*
echo '' > PlacesExpiration.sys.mjs
echo '' > PlacesFrecencyRecalculator.sys.mjs
rm -rf services-settings/*
touch services-settings/remote-settings.sys.mjs
# Causes a startup error -- try an empty file or a shim instead?
#rm Telemetry*
rm URLDecorationAnnotationsService.sys.mjs
popd
pushd chrome/toolkit/content/mozapps/extensions
rm -rf default-theme
popd
# fcntl() is variadic, but js-ctypes declares it with a fixed third argument, which violates
# the ABI on every platform. It's harmless on Linux, where variadic and fixed integer
# arguments are passed in the same registers, but Apple's arm64 ABI passes variadic
# arguments on the stack, so the flag goes into a register the callee never reads and
# fcntl() takes it from an uninitialized stack slot instead. F_SETFD can therefore set
# FD_CLOFORK (bit 1, added in macOS 26) rather than FD_CLOEXEC, closing the pipe in the
# forked child and breaking Subprocess spawns, and F_SETFL can silently fail to set
# O_NONBLOCK. Since the value comes from leftover stack contents, this varies by build and
# call path instead of failing consistently -- don't assume it's fixed just because a given
# build works. This change should stay until this is fixed upstream.
if [[ $platform != win* ]]; then
replace_line 'ctypes\.int \/\* \.\.\. \*\/,' '"...",' modules/subprocess/subprocess_shared_unix.js
replace_line 'libc\.fcntl\(fds\[0\], LIBC\.F_SETFD, LIBC\.FD_CLOEXEC\);' 'libc.fcntl(fds[0], LIBC.F_SETFD, ctypes.int(LIBC.FD_CLOEXEC));' modules/subprocess/subprocess_unix.worker.js
replace_line 'libc\.fcntl\(fds\[1\], LIBC\.F_SETFD, LIBC\.FD_CLOEXEC\);' 'libc.fcntl(fds[1], LIBC.F_SETFD, ctypes.int(LIBC.FD_CLOEXEC));' modules/subprocess/subprocess_unix.worker.js
replace_line 'libc\.fcntl\(fds\[1\], LIBC\.F_SETFL, LIBC\.O_NONBLOCK\);' 'libc.fcntl(fds[1], LIBC.F_SETFL, ctypes.int(LIBC.O_NONBLOCK));' modules/subprocess/subprocess_unix.worker.js
replace_line 'libc\.fcntl\(fds\[0\], LIBC\.F_SETFL, LIBC\.O_NONBLOCK\);' 'libc.fcntl(fds[0], LIBC.F_SETFL, ctypes.int(LIBC.O_NONBLOCK));' modules/subprocess/subprocess_unix.sys.mjs
replace_line 'libc\.fcntl\(fds\[0\], LIBC\.F_SETFD, LIBC\.FD_CLOEXEC\);' 'libc.fcntl(fds[0], LIBC.F_SETFD, ctypes.int(LIBC.FD_CLOEXEC));' modules/subprocess/subprocess_unix.sys.mjs
replace_line 'libc\.fcntl\(fds\[1\], LIBC\.F_SETFD, LIBC\.FD_CLOEXEC\);' 'libc.fcntl(fds[1], LIBC.F_SETFD, ctypes.int(LIBC.FD_CLOEXEC));' modules/subprocess/subprocess_unix.sys.mjs
fi
# This file loads remote-settings.sys.mjs, but if it's empty Zotero crashes
replace_line 'async #init\(\) \{' 'async #init() { if (true) { return; }' modules/URLQueryStrippingListService.sys.mjs
# Clear most WebExtension manifest properties
replace_line 'manifest = normalized.value;' 'manifest = normalized.value;
if (this.type == "extension") {
if (!manifest.applications?.zotero?.id) {
this.manifestError("applications.zotero.id not provided");
}
if (!manifest.applications?.zotero?.update_url) {
this.manifestError("applications.zotero.update_url not provided");
}
if (!manifest.applications?.zotero?.strict_max_version) {
this.manifestError("applications.zotero.strict_max_version not provided");
}
manifest.browser_specific_settings = undefined;
manifest.content_scripts = [];
manifest.permissions = [];
manifest.host_permissions = [];
manifest.web_accessible_resources = undefined;
manifest.experiment_apis = {};
}' modules/Extension.sys.mjs
# Use applications.zotero instead of applications.gecko
replace_line 'let bss = manifest.applications\?.gecko' 'let bss = manifest.applications?.zotero' modules/addons/XPIInstall.sys.mjs
replace_line 'manifest.applications\?.gecko' 'manifest.applications?.zotero' modules/Extension.sys.mjs
# When installing addon, use app version instead of toolkit version for targetApplication
replace_line "id: TOOLKIT_ID," "id: '$APP_ID'," modules/addons/XPIInstall.sys.mjs
# Set strictCompatibility to false in beta/dev/source builds to skip strict_max_version check
replace_line 'addon.strictCompatibility = true;' \
'let version = Services.appinfo.version;
addon.strictCompatibility = !version.includes("-beta") && !version.includes("-dev") && !version.includes("SOURCE");' modules/addons/XPIInstall.sys.mjs
# In beta/dev/source builds, ignore the persisted strictCompatibility flag for already-installed
# plugins, so plugins installed on a stable build (where the flag was set to true) aren't marked
# incompatible after upgrading. The manifest isn't re-parsed on app upgrade, so the flag set at
# install time sticks around.
replace_line '!this\.addon\.strictCompatibility' \
'(!this.addon.strictCompatibility || Services.appinfo.version.includes("-beta") || Services.appinfo.version.includes("-dev") || Services.appinfo.version.includes("SOURCE"))' modules/addons/XPIInstall.sys.mjs
replace_line '!this\.strictCompatibility &&' \
'(!this.strictCompatibility || Services.appinfo.version.includes("-beta") || Services.appinfo.version.includes("-dev") || Services.appinfo.version.includes("SOURCE")) &&' modules/addons/XPIDatabase.sys.mjs
# Accept zotero@chnm.gmu.edu for target application to allow Zotero 6 plugins to remain
# installed in Zotero 7
replace_line "if \(targetApp.id == Services.appinfo.ID\) \{" "if (targetApp.id == 'zotero\@chnm.gmu.edu') targetApp.id = '$APP_ID'; if (targetApp.id == Services.appinfo.ID) {" modules/addons/XPIDatabase.sys.mjs
# TEMP: Skip addons without ids until we figure out what's going on with the default theme.
# This fixes plugin updating and other things.
replace_line 'return addons;' 'return addons.filter(addon => addon.id);' modules/addons/XPIDatabase.sys.mjs
# For updates, look for applications.zotero instead of applications.gecko in manifest.json and
# use the app id and version for strict_min_version/strict_max_version comparisons
replace_line 'gecko: \{\},' 'zotero: {},' modules/addons/AddonUpdateChecker.sys.mjs
replace_line 'if \(!\("gecko" in applications\)\) \{' 'if (!("zotero" in applications)) {' modules/addons/AddonUpdateChecker.sys.mjs
replace_line '"gecko not in application entry' '"zotero not in application entry' modules/addons/AddonUpdateChecker.sys.mjs
replace_line 'let app = getProperty\(applications, "gecko", "object"\);' 'let app = getProperty(applications, "zotero", "object");' modules/addons/AddonUpdateChecker.sys.mjs
replace_line "id: TOOLKIT_ID," "id: '$APP_ID'," modules/addons/AddonUpdateChecker.sys.mjs
replace_line 'lazy.AddonManagerPrivate.webExtensionsMinPlatformVersion' '"7.0"' modules/addons/AddonUpdateChecker.sys.mjs
replace_line 'result.targetApplications.push' 'false && result.targetApplications.push' modules/addons/AddonUpdateChecker.sys.mjs
# In beta/dev/source builds, don't set strictCompatibility on parsed update entries so that
# AddonUpdateChecker doesn't reject an available update whose maxVersion is lower than the
# current (non-stable) app version.
replace_line 'result\.strictCompatibility = appEntry\.maxVersion != "\*";' \
'let appVer = Services.appinfo.version; result.strictCompatibility = appEntry.maxVersion != "*" && !appVer.includes("-beta") && !appVer.includes("-dev") && !appVer.includes("SOURCE");' modules/addons/AddonUpdateChecker.sys.mjs
# Set uninstall flag to true if the update config has it set
replace_line 'targetApplications: \[appEntry\],' \
'targetApplications: \[appEntry\],
uninstall: getProperty(update, "uninstall", "boolean"),' modules/addons/AddonUpdateChecker.sys.mjs
# Prevent automatic installation of default theme
# (chrome/toolkit/content/mozapps/extensions/default-theme, removed above)
replace_line 'this.maybeInstallBuiltinAddon\(' 'if (false) this.maybeInstallBuiltinAddon(' modules/addons/XPIProvider.sys.mjs
# Don't log a warning when checking 'distribution/extensions' for addons
replace_line 'logger.warn\(`Checking' 'logger.debug(`Checking' modules/addons/XPIProvider.sys.mjs
# Allow addon installation by bypassing confirmation dialogs. If we want a confirmation dialog,
# we need to either add gXPInstallObserver from browser-addons.js [1][2] or provide our own with
# Ci.amIWebInstallPrompt [3].
#
# [1] https://searchfox.org/mozilla-esr102/rev/5a6d529652045050c5cdedc0558238949b113741/browser/base/content/browser.js#1902-1923
# [2] https://searchfox.org/mozilla-esr102/rev/5a6d529652045050c5cdedc0558238949b113741/browser/base/content/browser-addons.js#201
# [3] https://searchfox.org/mozilla-esr102/rev/5a6d529652045050c5cdedc0558238949b113741/toolkit/mozapps/extensions/AddonManager.sys.mjs#3114-3124
replace_line 'if \(info.addon.installPermissions\) \{' 'if (false) {' modules/AddonManager.sys.mjs
replace_line '\} else if \(info.addon.sitePermissions\) \{' '} else if (false) {' modules/AddonManager.sys.mjs
replace_line '\} else if \(requireConfirm\) \{' '} else if (false) {' modules/AddonManager.sys.mjs
# Make addon listener methods wait for promises, to allow calling asynchronous plugin `shutdown`
# and `uninstall` methods in our `onInstalling` handler
replace_line 'callAddonListeners\(aMethod' 'async callAddonListeners(aMethod' modules/AddonManager.sys.mjs
# Don't need this one to be async, but we can't easily avoid modifying its `listener[aMethod].apply()` call
replace_line 'callManagerListeners\(aMethod' 'async callManagerListeners(aMethod' modules/AddonManager.sys.mjs
replace_line 'AddonManagerInternal.callAddonListeners.apply\(AddonManagerInternal, aArgs\);' \
'return AddonManagerInternal.callAddonListeners.apply(AddonManagerInternal, aArgs);' modules/AddonManager.sys.mjs
replace_line 'listener\[aMethod\].apply\(listener, aArgs\);' \
'let maybePromise = listener[aMethod].apply(listener, aArgs);
if (maybePromise && maybePromise.then) await maybePromise;' modules/AddonManager.sys.mjs
replace_line 'AddonManagerPrivate.callAddonListeners' 'await AddonManagerPrivate.callAddonListeners' modules/addons/XPIInstall.sys.mjs
replace_line 'let uninstall = \(\) => \{' 'let uninstall = async () => {' modules/addons/XPIInstall.sys.mjs
replace_line 'cancelUninstallAddon\(aAddon\)' 'async cancelUninstallAddon(aAddon)' modules/addons/XPIInstall.sys.mjs
# Check for `uninstall` flag in update config and uninstall the addon if set
replace_line 'if \(update && !this.addon.location.locked\) \{' \
'if (update && !this.addon.location.locked) {
if (update.uninstall) {
let aId = this.addon.id;
logger.debug(`AddonUpdateChecker: uninstall addon \${aId} with uninstall flag`);
let addon = await AddonManager.getAddonByID(aId);
if (addon && (addon.permissions & AddonManager.PERM_CAN_UNINSTALL)) {
try {
addon.uninstall();
} catch (err) {
logger.error(`AddonUpdateChecker: error uninstalling addon \${aId} with uninstall flag`, err);
}
sendUpdateAvailableMessages(this, null);
return;
}
else {
logger.error(`AddonUpdateChecker: addon \${aId} with uninstall flag not found or cannot be uninstalled`);
sendUpdateAvailableMessages(this, null);
return;
}
}
' modules/addons/XPIInstall.sys.mjs
# Prevent login manager from trying to load FxAccountsCommon.sys.mjs
replace_line 'return login.hostname == lazy.FXA_PWDMGR_HOST;' 'return false;' modules/storage-json.sys.mjs
# No idea why this is necessary, but without it initialization fails with "TypeError: "constructor" is read-only"
replace_line 'LoginStore.prototype.constructor = LoginStore;' '\/\/LoginStore.prototype.constructor = LoginStore;' modules/LoginStore.sys.mjs
#
# # Allow proxy password saving
# perl -pi -e 's/get _inPrivateBrowsing\(\) \{/get _inPrivateBrowsing() {if (true) { return false; }/' components/nsLoginManagerPrompter.js
#
# # Change text in update dialog
# perl -pi -e 's/A security and stability update for/A new version of/' chrome/en-US/locale/en-US/mozapps/update/updates.properties
# perl -pi -e 's/updateType_major=New Version/updateType_major=New Major Version/' chrome/en-US/locale/en-US/mozapps/update/updates.properties
# perl -pi -e 's/updateType_minor=Security Update/updateType_minor=New Version/' chrome/en-US/locale/en-US/mozapps/update/updates.properties
# perl -pi -e 's/update for &brandShortName; as soon as possible/update as soon as possible/' chrome/en-US/locale/en-US/mozapps/update/updates.dtd
#
# Set available locales
cp "$APP_ROOT_DIR/assets/multilocale.txt" res/multilocale.txt
# Use Zotero URL opening in Mozilla dialogs (e.g., app update dialog)
replace_line 'function openURL\(aURL\) \{' 'function openURL(aURL) {let {Zotero} = ChromeUtils.importESModule("chrome:\/\/zotero\/content\/zotero.mjs"); Zotero.launchURL(aURL); if (true) { return; }' chrome/toolkit/content/global/contentAreaUtils.js
#
# Modify Add-ons window
#
# Prevent display: block from overriding display: none on <hr>s
replace_line 'display: block !important;' 'display: block;' chrome/toolkit/content/global/elements/panel-list.css
file="chrome/toolkit/content/mozapps/extensions/aboutaddons.css"
echo >> $file
# Hide the search bar and the whole sidebar, since we only ever show plugins and the main pane
# is already headed "Manage Your Plugins"
echo '.main-search, #sidebar { display: none; }' >> $file
# Center the content in the window now that it isn't offset by the sidebar
echo '#full { grid-template-columns: 1fr; }' >> $file
echo '#content { max-width: calc(var(--page-main-content-width) + var(--main-margin-start)); margin-inline: auto; }' >> $file
echo '.main-heading { margin-top: 2em; }' >> $file
# Hide Details/Permissions tabs in addon details so we only show details
echo 'addon-details > button-group { display: none !important; }' >> $file
# Hide "Run on sites with restrictions" row and helper message
echo '.addon-detail-row-quarantined-domains { display: none; }' >> $file
echo '.addon-detail-help-row:has([data-l10n-id="addon-detail-quarantined-domains-help"]) { display: none; }' >> $file
# Hide "Report" button from plugin menu
echo 'addon-card addon-options hr:first-of-type { display: none }' >> $file
echo '[data-l10n-id="report-addon-button"] { display: none }' >> $file
# Hide "Debug Addons" and "Manage Extension Shortcuts"
echo 'panel-item[action="debug-addons"], panel-item[action="reset-update-states"] + hr, panel-item[action="manage-shortcuts"] { display: none }' >> $file
# Show cursor feedback on plugin homepage links
echo '.addon-detail-row-homepage .text-link { cursor: pointer; color: LinkText; }' >> $file
echo '.addon-detail-row-homepage .text-link:hover { text-decoration: underline; }' >> $file
file="chrome/toolkit/content/mozapps/extensions/aboutaddons-utils.mjs"
# Hide unsigned-addon warning
replace_line 'export function isUnsignedWarningMessageDisabled\(\) \{' \
'export function isUnsignedWarningMessageDisabled() {if (true) return true;' $file
# Use our own localized string for blocked plugin notification
replace_line 'details-notification-hard-blocked-\$\{typeSuffix\}' 'plugins-blocked-plugin' $file
# Hide Recommendations tab in sidebar and recommendations in main pane
replace_line 'function isDiscoverEnabled\(\) \{' 'function isDiscoverEnabled() {return false;' $file
file="chrome/toolkit/content/mozapps/extensions/components/addon-details.mjs"
# Hide Private Browsing setting in addon details
replace_line 'pbRow\.' '\/\/pbRow.' $file
replace_line 'let isAllowed = await isAllowedInPrivateBrowsing' '\/\/let isAllowed = await isAllowedInPrivateBrowsing' $file
# Open plugin links in external browser
replace_line 'let homepageURL = homepageRow.querySelector\(\"a\"\);' 'let homepageURL = homepageRow.querySelector(\"\.text-link\");' $file
replace_line 'homepageURL.href = addon.homepageURL;' 'homepageURL.setAttribute("href", addon.homepageURL);' $file
replace_line '<a target="_blank" dir="ltr"><\/a>' \
'<label target="_blank" class="text-link" dir="ltr"><\/label>' $file
file="chrome/toolkit/content/mozapps/extensions/components/addon-card.mjs"
# Use our own strings for the removal prompt
replace_line 'let \{ BrowserAddonUI \} = windowRoot.window;' '' $file
replace_line 'await BrowserAddonUI.promptRemoveExtension' 'promptRemoveExtension' $file
# Customize empty-list message
replace_line 'createEmptyListMessage\(\) {' 'createEmptyListMessage() {
var p = document.createElement("p");
p.id = "empty-list-message";
return p;' chrome/toolkit/content/mozapps/extensions/components/addon-list.mjs
# Add zotero.ftl to the addons page for our own localized strings
replace_line 'href="toolkit\/about\/aboutAddons.ftl"' 'href="toolkit\/about\/aboutAddons.ftl" \/>\n <link rel="localization" href="zotero.ftl"' \
chrome/toolkit/content/mozapps/extensions/aboutaddons.html
# TODO: Use our own strings, but for now fix the bundled English ones
replace_line 'Manage Your Extensions' 'Manage Your Plugins' localization/en-US/toolkit/about/aboutAddons.ftl
replace_line 'Add-on' 'Plugin' localization/en-US/toolkit/about/aboutAddons.ftl
replace_line 'add-ons' 'plugins' localization/en-US/toolkit/about/aboutAddons.ftl
replace_line 'Select add-on to install' 'Select plugin to install' localization/en-US/toolkit/about/aboutAddons.ftl
replace_line 'pref\("extensions.htmlaboutaddons.recommendations.enabled".+' 'pref("extensions.htmlaboutaddons.recommendations.enabled", false);' greprefs.js
# Hide Report option
replace_line 'pref\("extensions.abuseReport.enabled".+' 'pref("extensions.abuseReport.enabled", false);' greprefs.js
# The first displayed Services.prompt dialog's size jumps around because sizeToContent() is called twice
# Fix by preventing the first sizeToContent() call if the icon hasn't been loaded yet
replace_line 'window.sizeToContent\(\);' 'if (ui.infoIcon.complete) window.sizeToContent();' chrome/toolkit/content/global/commonDialog.js
replace_line 'ui.infoIcon.addEventListener' 'if (!ui.infoIcon.complete) ui.infoIcon.addEventListener' chrome/toolkit/content/global/commonDialog.js
# Import style into built-in dialogs
replace_line 'id=\"commonDialogWindow\"' \
'id=\"commonDialogWindow\" class=\"zotero-dialog\" drawintitlebar-platforms=\"mac\"' \
chrome/toolkit/content/global/commonDialog.xhtml
# commonDialog.css link is split across multiple lines, so we have to do a weird substitution,
# so check the one-line global.css to make sure the format hasn't changed
check_line '<html:link rel="stylesheet" href="chrome:\/\/global\/skin\/global.css" \/>' chrome/toolkit/content/global/commonDialog.xhtml
replace_line 'chrome:\/\/global\/skin\/commonDialog.css"' \
'chrome:\/\/global\/skin\/commonDialog.css"\/>
<html:link rel="stylesheet" href="chrome:\/\/zotero-platform\/content\/zotero.css"' \
chrome/toolkit/content/global/commonDialog.xhtml
# commonDialog.xhtml can be opened via Services.prompt in the Profile Manager, so check for a profile first
replace_line 'function commonDialogOnLoad\(\) \{' \
'function commonDialogOnLoad() {
try {
Services.dirsvc.get(\"ProfD\", Ci.nsIFile);
Services.scriptloader.loadSubScript(\"chrome:\/\/zotero\/content\/include.js\", this);
Services.scriptloader.loadSubScript(\"chrome:\/\/zotero\/content\/titlebar.js\", this);
Services.scriptloader.loadSubScript(\"chrome:\/\/zotero\/content\/customElements.js\", this);
} catch (e) {}' \
chrome/toolkit/content/global/commonDialog.js
# Use native checkbox instead of Firefox-themed version in prompt dialogs
replace_line '<xul:checkbox' '<xul:checkbox native=\"true\"' chrome/toolkit/content/global/commonDialog.xhtml
# The <browser> CE appends its autoscroll <popup> to document.documentElement, which doesn't work in zoteroPane.xhtml
# (in Firefox browser.xhtml, document.documentElement is <html>, which can contain <popup>s; in zoteroPane.xhtml, it's
# <window>, which can't)
# Fix by appending it to a <popupset> instead
replace_line 'document.documentElement.appendChild\(this._autoScrollPopup\);' 'let popupset = document.querySelector("popupset");
if (!popupset) {
popupset = document.createXULElement("popupset");
document.documentElement.appendChild(popupset);
}
popupset.appendChild(this._autoScrollPopup);' chrome/toolkit/content/global/elements/browser-custom-element.mjs
# Add the dropmarker for toolbarbuttons with wantdropmarker, which Firefox no longer creates
replace_line 'this.appendChild\(this.constructor.fragment.cloneNode\(true\)\);' \
'this.appendChild(this.constructor.fragment.cloneNode(true));
if (this.hasAttribute("wantdropmarker")) {
let dropmarker = document.createXULElement("dropmarker");
dropmarker.setAttribute("type", "menu");
dropmarker.className = "toolbarbutton-menu-dropmarker";
this.appendChild(dropmarker);
}' chrome/toolkit/content/global/elements/toolbarbutton.js
# Let clicks on the dropmarker pass through to the toolbarbutton, which only opens its menu
# when it's the original event target, as xul.css did when Firefox created the dropmarker
echo '.toolbarbutton-menu-dropmarker { pointer-events: none; }' >> chrome/toolkit/content/global/xul.css
# Remove non-native text input styles
remove_between 'html\|input\:where\(' '^}' chrome/toolkit/skin/classic/global/global-shared.css
# Prevent window dragging on scrollbars
echo 'scrollbar { -moz-window-dragging: no-drag; }' >> chrome/toolkit/res/scrollbars.css
# Provide a mechanism for non-UA stylesheets to override the overflow property
# of a text control's anonymous text node child
echo '::placeholder, ::-moz-text-control-editing-root, ::-moz-text-control-preview {
overflow: var(--moz-text-control-overflow);
}' >> chrome/toolkit/res/forms.css
# Size an autocomplete popup to the input that opened it, or to an ancestor that designates
# itself as the width container. Firefox sizes the popup to its content. (For creator inputs.)
replace_line '\/\/ invalidate\(\) depends on the width attribute' \
'let widthElement = aElement.closest(".autocomplete-popup-width-container") || aElement;
this.style.setProperty("--panel-width", Math.max(widthElement.getBoundingClientRect().width, 100) + "px");
\/\/ invalidate() depends on the width attribute' \
chrome/toolkit/content/global/elements/autocomplete-popup.js
zip -qr9XD omni.ja *
mv omni.ja ..
cd ..
python3 "$APP_ROOT_DIR/scripts/optimizejars.py" --optimize ./ ./ ./
rm -rf omni
# Unzip browser/omni.ja and leave unzipped
cd browser
mkdir omni
mv omni.ja omni
cd omni
ls -la
set +e
unzip omni.ja
set -e
rm omni.ja
# Remove Firefox update URLs
remove_line 'pref\("app.update.url.(manual|details)' defaults/preferences/firefox-branding.js
# Remove Firefox overrides (e.g., to use Firefox-specific strings for connection errors)
remove_line '(override)' chrome/chrome.manifest
# Remove WebExtension APIs
remove_line ext-browser.json components/components.manifest
# Don't open a second window if app is already open when launching .exe (Windows) or running via
# command line (macOS)
replace_line 'function dch_handle\(cmdLine\) \{' 'function dch_handle(cmdLine) {
if (cmdLine.state == Ci.nsICommandLine.STATE_REMOTE_AUTO) { return; }
' modules/BrowserContentHandler.sys.mjs
}
mkdir -p xulrunner
cd xulrunner
if [ $BUILD_MAC == 1 ]; then
GECKO_VERSION="$GECKO_VERSION_MAC"
DOWNLOAD_URL="https://ftp.mozilla.org/pub/firefox/releases/$GECKO_VERSION"
rm -rf Firefox.app
if [ -e "Firefox $GECKO_VERSION.app.zip" ]; then
echo "Using Firefox $GECKO_VERSION.app.zip"
unzip "Firefox $GECKO_VERSION.app.zip"
else
curl -fo Firefox.dmg "$DOWNLOAD_URL/mac/en-US/Firefox%20$GECKO_VERSION.dmg"
set +e
hdiutil detach -quiet /Volumes/Firefox 2>/dev/null
set -e
hdiutil attach -quiet Firefox.dmg
cp -a /Volumes/Firefox/Firefox.app .
# Store local copy of unmodified app
zip -r "Firefox $GECKO_VERSION.app.zip" Firefox.app
hdiutil detach -quiet /Volumes/Firefox
fi
# Download custom components (e.g., XUL), as an xz-compressed tarball of the MacOS folder with
# custom files in it
echo
rm -rf MacOS
if [ -n "$custom_components_hash_mac" ]; then
tarfile="Firefox $GECKO_VERSION MacOS.tar.xz"
if [[ "$(uname)" = "Darwin" ]]; then
shasum="shasum -a 256"
else
shasum=sha256sum
fi
download_components() {
echo "Downloading custom Firefox components"
echo
curl -fo "$tarfile" "${custom_components_url}mac/$custom_components_hash_mac.tar.xz"
}
verify_components_hash() {
echo "$custom_components_hash_mac $tarfile" | $shasum -c -
}
if [ ! -e "$tarfile" ]; then
download_components
fi
# Verify hash
echo
if ! verify_components_hash; then
echo "SHA hash mismatch. Redownloading custom Firefox components…"
rm -f "$tarfile"
download_components
echo
if ! verify_components_hash; then
echo "Hash still doesn't match. Aborting."
exit 1
fi
fi
echo
tar xvf "$tarfile"
echo
fi
pushd Firefox.app/Contents/Resources
modify_omni mac
popd
# Replace "FirefoxCP" with "ZoteroCP" for subprocesses ("Isolated Web Content", "Socket Process", "Web Content", etc.)
info_plist=Firefox.app/Contents/MacOS/plugin-container.app/Contents/Resources/English.lproj/InfoPlist.strings
from=$(get_utf16_chars "FirefoxCP")
to=$(get_utf16_chars "ZoteroCP")
perl -pi -e "s/$from/$to/" $info_plist
# Check for UTF-16 "ZoteroCP"
if ! grep -a -q "Z.o.t.e.r.o.C.P." $info_plist; then
echo '"ZoteroCP" not found in InfoPlist.strings after replacement'
exit 1
fi
rm -f Firefox.dmg
echo $("$SCRIPT_DIR/xulrunner_hash" -p m) > hash-mac
fi
if [ $BUILD_WIN == 1 ]; then
GECKO_VERSION="$GECKO_VERSION_WIN"
DOWNLOAD_URL="https://ftp.mozilla.org/pub/firefox/releases/$GECKO_VERSION"
if [[ -n $arch ]]; then
arch_list=("$(get_canonical_arch w $arch)")
else
arch_list=(win-x64 win-arm64 win32)
fi
for arch in "${arch_list[@]}"; do
xdir=firefox-$arch
rm -rf $xdir
mkdir $xdir
archived_file="Firefox Setup $GECKO_VERSION-$arch.exe"
if [ -e "$archived_file" ]; then
echo "Using $archived_file"
cp "$archived_file" "Firefox%20Setup%20$GECKO_VERSION.exe"
else
if [ $arch = "win-x64" ]; then
moz_arch=win64
elif [ $arch = "win-arm64" ]; then
moz_arch=win64-aarch64
else
moz_arch=$arch
fi
curl -fO "$DOWNLOAD_URL/$moz_arch/en-US/Firefox%20Setup%20$GECKO_VERSION.exe"
# Store local copy of unmodified app
cp "Firefox%20Setup%20$GECKO_VERSION.exe" "$archived_file"
fi
7z x Firefox%20Setup%20$GECKO_VERSION.exe -o$xdir 'core/*'
mv $xdir/core $xdir-core
rm -rf $xdir
mv $xdir-core $xdir
# Download custom components, as an architecture-specific ZIP containing xul.dll, etc.
echo
hash_arch_name="${arch/-/_}"
arch_var_name="custom_components_hash_${hash_arch_name}"
hash=${!arch_var_name:-}
if [ -n "$hash" ]; then
zipfile="Firefox $GECKO_VERSION-$arch Components.zip"
# ZIP filename doesn't include "esr" or "win-"
url="${custom_components_url}win/${GECKO_VERSION//esr}-${arch#win-}-$hash.zip"
if [[ "$(uname)" = "Darwin" ]]; then
shasum="shasum -a 256"
else
shasum=sha256sum
fi
download_zip() {
echo "Downloading custom Firefox components"
echo
echo $url
curl -fo "$zipfile" "$url"
}
verify_hash() {
echo "$hash $zipfile" | $shasum -c -
}
# Download if file doesn't exist
if [ ! -e "$zipfile" ]; then
download_zip
fi
echo
if ! verify_hash; then
echo "SHA hash mismatch. Redownloading ZIP…"
rm -f "$zipfile"
download_zip
echo
if ! verify_hash; then
echo "Hash still doesn't match. Aborting."
exit 1
fi
fi
echo
unzip -o "$zipfile" -d "$xdir"
echo
fi
pushd $xdir
#
# NOTE: Below is disabled, since the full UTF-16 string no longer appears directly in the DLL
# -- it's now truncated after "e594e8d1" for x64/win32 and doesn't appear at all for ARM64
#
# Replace "Mozilla-1de4eec8-1241-4177-a864-e594e8d1fb38" with "Zotero" for C:\ProgramData directory
#
# Mozilla uses a UUID in the path because they previously used just "Mozilla" and needed to
# recreate the folder with correct permissions for security reasons, but we never had a folder in
# ProgramData, so we can just create it as "Zotero". Instead of using a custom xul.dll, just
# replace the hard-coded string with "Zotero" and add a bunch of NULs.
#
#from=$(get_utf16_chars "Mozilla-1de4eec8-1241-4177-a864-e594e8d1fb38")
#to=$(get_utf16_chars "Zotero" 38)
#perl -pe "s/$from/$to/" < xul.dll > xul.dll.new
#mv xul.dll.new xul.dll
# Check for UTF-16 "Zotero" in DLL
#
# (The macOS strings command doesn't have an encoding option, so skip on macOS. You need to
# build on Windows to make an installer, so a Windows build from macOS likely isn't being
# deployed.)
#
#if [[ "`uname`" != "Darwin" ]] && [[ -z "$(strings -e l xul.dll | grep -m 1 Zotero)" ]]; then
# echo '"Zotero" not found in xul.dll after replacement'
# exit 1
#fi
# We re-sign DLL in build.sh, but presumably this file, which is for the Widevine CDM,
# isn't vaid anymore
rm xul.dll.sig
modify_omni $arch
# Disable skeleton UI window
# https://forums.zotero.org/discussion/comment/437636/#Comment_437636
replace_line 'pref\("browser\.startup\.preXulSkeletonUI", true\);' 'pref("browser.startup.preXulSkeletonUI", false);' defaults/preferences/firefox.js
popd
# Uncomment to create local copies for reuse
#cp "Firefox%20Setup%20$GECKO_VERSION.exe" "Firefox Setup $GECKO_VERSION-$arch.exe"
rm "Firefox%20Setup%20$GECKO_VERSION.exe"
echo
echo
echo "$( "$SCRIPT_DIR/xulrunner_hash" -p w -a "$arch" )" > "hash-$arch"
done
fi
if [ $BUILD_LINUX == 1 ]; then
GECKO_VERSION="$GECKO_VERSION_LINUX"
DOWNLOAD_URL="https://ftp.mozilla.org/pub/firefox/releases/$GECKO_VERSION"
if [[ -n $arch ]]; then
arch_list=("$arch")
else
arch_list=(x86_64 arm64)
fi
for arch in "${arch_list[@]}"; do
xdir="firefox-linux-$arch"
rm -rf $xdir
archived_file="firefox-$GECKO_VERSION-$arch.tar.xz"
if [ -e "$archived_file" ]; then
echo "Using $archived_file"
cp "$archived_file" "firefox-$GECKO_VERSION.tar.xz"
else
if [ $arch = "arm64" ]; then
moz_arch=aarch64
else
moz_arch=$arch
fi
curl -fO "$DOWNLOAD_URL/linux-$moz_arch/en-US/firefox-$GECKO_VERSION.tar.xz"
# Store local copy of unmodified app
cp "firefox-$GECKO_VERSION.tar.xz" "$archived_file"
fi
tar xvf firefox-$GECKO_VERSION.tar.xz
mv firefox $xdir
pushd $xdir
modify_omni $arch
popd
rm "firefox-$GECKO_VERSION.tar.xz"
echo "$( $SCRIPT_DIR/xulrunner_hash -p l -a "$arch" )" > "hash-linux-${arch}"
done
fi
echo Done

21
app/scripts/get_commit_files Executable file
View file

@ -0,0 +1,21 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
if [ -z "${1:-}" ]; then
echo "Commit hash not provided"
exit 1
fi
hash="$1"
tmpdir=`mktemp -d`
cd $tmpdir
curl -sS -f -L -o build.zip "https://$S3_BUCKET.s3.amazonaws.com/$S3_CI_ZIP_PATH/$hash.zip" >&2 \
|| (echo "ZIP file not found for commit '$hash'" && exit 1)
unzip build.zip >&2
rm build.zip
echo $tmpdir

View file

@ -0,0 +1,14 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
if [ -z "${1:-}" ]; then
echo "Usage: $0 branch"
exit 1
fi
branch=$1
git ls-remote --exit-code $SOURCE_REPO_URL $branch | cut -f 1

322
app/scripts/incremental_update Executable file
View file

@ -0,0 +1,322 @@
#!/bin/bash
set -euo pipefail
#
# Incrementally update a staged build in staging/ by zipping changed files from
# the client build/ directory directly into app/omni.ja, based on a manifest
# saved by dir_build after the last full build.
#
# Only files that are copied into omni.ja unmodified by build.sh can be updated
# this way. If any other file changed (or a file was removed), a full rebuild
# is required.
#
# Exit codes:
# 0 -- staged build was updated (or nothing changed)
# 2 -- a full rebuild is required
#
# This is normally run automatically by dir_build, not directly.
#
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
ROOT_DIR="$(dirname "$APP_ROOT_DIR")"
. "$APP_ROOT_DIR/config.sh"
. "$SCRIPT_DIR/utils.sh"
function usage {
cat >&2 <<DONE
Usage: $0 -p PLATFORM [-a ARCH] [-t]
Options
-p PLATFORM platform of the staged build to update (m=Mac, w=Windows, l=Linux)
-a ARCH target architecture (Windows/Linux only)
-t devtools requested
DONE
exit 1
}
platform=""
arch=""
devtools=0
while getopts "p:a:t" opt; do
case $opt in
p)
platform="$OPTARG"
;;
a)
arch="$OPTARG"
;;
t)
devtools=1
;;
*)
usage
;;
esac
done
if [ -z "$platform" ]; then
usage
fi
BUILD_SRC_DIR="$ROOT_DIR/build"
MANIFEST_FILE="$STAGE_DIR/.build-manifest"
function fall_back {
echo "$1 -- performing full build" >&2
exit 2
}
if [ ! -d "$BUILD_SRC_DIR" ]; then
fall_back "No build/ directory"
fi
if [ ! -f "$MANIFEST_FILE" ]; then
fall_back "No manifest from previous build"
fi
if [[ "$(sed -n 's/^#format=//p' "$MANIFEST_FILE")" != "2" ]]; then
fall_back "Unsupported manifest format"
fi
# Make sure a staged build exists for the requested platform
case $platform in
m)
app_dir="$STAGE_DIR/Zotero.app/Contents/Resources"
;;
w)
app_dir="$STAGE_DIR/Zotero_$(get_canonical_arch w "$arch")"
;;
l)
app_dir="$STAGE_DIR/Zotero_linux-$(get_canonical_arch l "$arch")"
;;
*)
fall_back "Unknown platform '$platform'"
;;
esac
if [ ! -f "$app_dir/app/omni.ja" ]; then
fall_back "No staged build for requested platform"
fi
# If the previous build didn't include tests or devtools and they're requested
# now, files are missing from the staged build
manifest_tests=$(sed -n 's/^#include_tests=//p' "$MANIFEST_FILE")
manifest_tests=${manifest_tests:-0}
manifest_devtools=$(sed -n 's/^#devtools=//p' "$MANIFEST_FILE")
manifest_devtools=${manifest_devtools:-0}
if [[ -z "${ZOTERO_TEST:-}" ]] || [[ "${ZOTERO_TEST:-}" == "0" ]]; then
want_tests=0
else
want_tests=1
fi
if [[ $want_tests -eq 1 ]] && [[ $manifest_tests != "1" ]]; then
fall_back "Tests requested but not included in staged build"
fi
if [[ $devtools -eq 1 ]] && [[ $manifest_devtools != "1" ]]; then
fall_back "Devtools requested but not included in staged build"
fi
# If anything changed in app/ (build scripts, assets, bundled modules, Firefox
# runtime), a full rebuild is required
manifest_app_hash=$(sed -n 's/^#app_hash=//p' "$MANIFEST_FILE")
app_hash=$(generate_app_hash "$APP_ROOT_DIR")
if [[ -z "$manifest_app_hash" ]] || [[ "$app_hash" != "$manifest_app_hash" ]]; then
fall_back "Files in app/ changed"
fi
file_list=$(mktemp)
new_stats=$(mktemp)
carried=$(mktemp)
candidates=$(mktemp)
removed=$(mktemp)
cand_entries=$(mktemp)
trap 'rm -f "$file_list" "$new_stats" "$carried" "$candidates" "$removed" "$cand_entries"' EXIT
cd "$BUILD_SRC_DIR"
# Quickly find files that may have changed based on size/mtime, so that only
# those have to be hashed. Unmodified manifest entries are carried over,
# new/modified files become candidates, and files no longer present are
# considered removed.
build_manifest_file_list > "$file_list"
stat_file_list < "$file_list" > "$new_stats"
awk -F'\t' -v carried="$carried" -v candidates="$candidates" -v removed="$removed" '
NR==FNR {
if (/^#/) next
hash[$3] = $1
stat[$3] = $2
next
}
{
if (!($2 in stat)) {
print > candidates
}
else {
if ($1 == stat[$2]) {
print hash[$2] "\t" $0 > carried
}
else {
print > candidates
}
delete stat[$2]
}
}
END {
for (path in stat) print path > removed
}
' "$MANIFEST_FILE" "$new_stats"
# Hash the candidates and compare to the previous hashes to find real changes
# -- A = added, C = changed, R = removed
if [ -s "$candidates" ]; then
paste \
<(cut -f2 "$candidates" | sed 's,^,./,' | tr '\n' '\0' | hash_file_list | cut -f1) \
"$candidates" \
> "$cand_entries"
fi
changes=$(
if [ -s "$cand_entries" ]; then
awk -F'\t' '
NR==FNR {
if (/^#/) next
old[$3] = $1
next
}
{
if (!($3 in old)) print "A\t" $3
else if (old[$3] != $1) print "C\t" $3
}
' "$MANIFEST_FILE" "$cand_entries"
fi
if [ -s "$removed" ]; then
awk '{print "R\t" $0}' "$removed"
fi
)
# Make sure all changed files can be zipped directly into omni.ja, and skip
# ones that aren't included in the staged build
zip_files=()
ftl_files=()
test_copy_files=()
while IFS=$'\t' read -r status path; do
if [ -z "$status" ]; then
continue
fi
if [ "$status" == "R" ]; then
case "$path" in
test/*)
# Ignore removed test files if tests weren't included
if [[ $manifest_tests != "1" ]]; then
continue
fi
;;
esac
fall_back "$path was removed"
fi
case "$path" in
# Copied into localization/ subdirectories by build.sh
chrome/locale/*/zotero/mozilla/*)
fall_back "Can't update $path in place"
;;
# Pruned by prepare_build
chrome/content/zotero/locale/csl/*)
fall_back "Can't update $path in place"
;;
# Copied to localization/<locale>/ in addition to the chrome path
chrome/locale/*/zotero/*.ftl)
zip_files+=("$path")
ftl_files+=("$path")
;;
chrome/*|components/*|resource/*)
zip_files+=("$path")
;;
# Appended to the main chrome.manifest by build.sh
test/chrome.manifest)
fall_back "Can't update $path in place"
;;
test/*)
# If tests weren't included in the staged build, ignore changes
# to test files
if [[ $manifest_tests == "1" ]]; then
zip_files+=("$path")
case "$path" in
# Also copied to tests/ at the top level of the app
test/tests/*)
test_copy_files+=("$path")
;;
esac
fi
;;
*)
fall_back "Can't update $path in place"
;;
esac
done <<< "$changes"
# Find all staged omni.ja files to update (multiple can exist -- e.g., all
# Windows architectures)
omni_files=()
while IFS= read -r file; do
omni_files+=("$file")
done < <(find "$STAGE_DIR" -path '*/app/omni.ja')
if [ ${#zip_files[@]} -gt 0 ]; then
echo "Changed files:"
for path in "${zip_files[@]}"; do
echo " $path"
done
cd "$BUILD_SRC_DIR"
for omni_file in "${omni_files[@]}"; do
echo "Updating ${omni_file#"$STAGE_DIR"/}"
zip -qX "$omni_file" "${zip_files[@]}"
done
# Copy .ftl files to their localization/ paths
if [ ${#ftl_files[@]} -gt 0 ]; then
l10n_dir=$(mktemp -d)
for path in "${ftl_files[@]}"; do
locale=${path#chrome/locale/}
locale=${locale%%/*}
mkdir -p "$l10n_dir/localization/$locale"
cp -L "$path" "$l10n_dir/localization/$locale/$(basename "$path")"
done
pushd "$l10n_dir" > /dev/null
for omni_file in "${omni_files[@]}"; do
zip -qrX "$omni_file" localization
done
popd > /dev/null
rm -rf "$l10n_dir"
fi
# Copy test files to tests/ directories
if [ ${#test_copy_files[@]} -gt 0 ]; then
for path in "${test_copy_files[@]}"; do
for omni_file in "${omni_files[@]}"; do
dest="${omni_file%/app/omni.ja}/tests/${path#test/tests/}"
mkdir -p "$(dirname "$dest")"
cp -L "$path" "$dest"
done
done
fi
# Bump BuildID so that startup caches are invalidated even without
# -purgecaches
build_id=$(date +%Y%m%d%H%M%S)
for omni_file in "${omni_files[@]}"; do
perl -pi -e "s/^BuildID=.*/BuildID=$build_id/" "$(dirname "$omni_file")/application.ini"
done
echo "Updated staged build with ${#zip_files[@]} changed file(s)"
elif [ -n "$changes" ]; then
echo "No staged files changed"
else
echo "No changes since last build"
fi
{
echo "#format=2"
echo "#include_tests=$manifest_tests"
echo "#devtools=$manifest_devtools"
echo "#app_hash=$app_hash"
LC_ALL=C sort -t$'\t' -k3 "$carried" "$cand_entries"
} > "$MANIFEST_FILE.tmp"
mv "$MANIFEST_FILE.tmp" "$MANIFEST_FILE"

88
app/scripts/manage_incrementals Executable file
View file

@ -0,0 +1,88 @@
#!/bin/bash
#
# Manage list of deployed version numbers for a channel in order to generate incremental builds
#
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
function usage {
cat >&2 <<DONE
Usage:
-c CHANNEL Release channel (e.g., 'beta'); defaults to 'release'
-p PLATFORM Platform (m=Mac, w=Windows, l=Linux)
-a VERSION Add version to incrementals list; cannot be used with -n
-n NUM_VERSIONS Number of previous versions to return; cannot be used with -a
DONE
exit 1
}
CHANNEL="release"
PLATFORM=""
VERSION=""
NUM_VERSIONS=""
while getopts "c:p:a:n:" opt; do
case $opt in
c)
CHANNEL="$OPTARG"
;;
p)
case "$OPTARG" in
m) PLATFORM=mac;;
w) PLATFORM=win;;
l) PLATFORM=linux;;
*)
echo "$0: Invalid platform option $OPTARG"
usage
;;
esac
;;
a)
VERSION="$OPTARG"
;;
n)
NUM_VERSIONS="$OPTARG"
;;
*)
usage
;;
esac
shift $((OPTIND-1)); OPTIND=1
done
if [[ -z "$PLATFORM" ]]; then
usage
fi
if [[ -z "$VERSION" ]] && [[ -z "$NUM_VERSIONS" ]]; then
usage
fi
if [[ "$VERSION" ]] && [[ "$NUM_VERSIONS" ]]; then
usage
fi
INCR_FILENAME="incrementals-$PLATFORM"
REMOTE_PATH="$DEPLOY_PATH/manifests/$CHANNEL/$INCR_FILENAME"
INCR_PATH="$DIST_DIR/$INCR_FILENAME"
mkdir -p "$DIST_DIR"
scp $DEPLOY_HOST:"$REMOTE_PATH" "$INCR_PATH" >&2
# Add version to file and reupload
if [ "$VERSION" ]; then
echo "Adding $VERSION to incrementals-$PLATFORM"
echo $VERSION >> "$INCR_PATH"
scp "$INCR_PATH" $DEPLOY_HOST:"$REMOTE_PATH"
# Show last n versions
elif [ "$NUM_VERSIONS" -gt 0 ]; then
# TEMP: Don't include 6.0 versions
#tail -n $NUM_VERSIONS "$INCR_PATH"
set +e
tail -n $NUM_VERSIONS "$INCR_PATH" | grep -v '^6\.0'
set -e
fi
rm "$INCR_PATH"

22
app/scripts/notarization_info Executable file
View file

@ -0,0 +1,22 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
. "$SCRIPT_DIR/utils.sh"
function usage {
echo "Usage: $0 id"
exit 1
}
id=${1:-}
if [[ -z "$id" ]]; then
usage
fi
prepare_notary_auth
xcrun notarytool log "$id" "${notary_auth[@]}" notary_log.json
cat notary_log.json

View file

@ -0,0 +1,19 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
function usage {
echo "Usage: $0 file"
exit 1
}
file=${1:-}
if [[ -z "$file" ]]; then
usage
fi
echo "Stapling $file"
xcrun stapler staple $file

22
app/scripts/notarize_mac_app Executable file
View file

@ -0,0 +1,22 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
. "$SCRIPT_DIR/utils.sh"
function usage {
echo "Usage: $0 file"
exit 1
}
file=${1:-}
if [[ -z "$file" ]]; then
usage
fi
prepare_notary_auth
echo "Uploading ${file##*/} to Apple for notarization" >&2
xcrun notarytool submit $file "${notary_auth[@]}" --wait

376
app/scripts/optimizejars.py Normal file
View file

@ -0,0 +1,376 @@
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is mozilla.org code
#
# The Initial Developer of the Original Code is
# Mozilla Foundation.
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Taras Glek <tglek@mozilla.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
import sys, os, subprocess, struct, re
local_file_header = [
("signature", "uint32"),
("min_version", "uint16"),
("general_flag", "uint16"),
("compression", "uint16"),
("lastmod_time", "uint16"),
("lastmod_date", "uint16"),
("crc32", "uint32"),
("compressed_size", "uint32"),
("uncompressed_size", "uint32"),
("filename_size", "uint16"),
("extra_field_size", "uint16"),
("filename", "filename_size"),
("extra_field", "extra_field_size"),
("data", "compressed_size")
]
cdir_entry = [
("signature", "uint32"),
("creator_version", "uint16"),
("min_version", "uint16"),
("general_flag", "uint16"),
("compression", "uint16"),
("lastmod_time", "uint16"),
("lastmod_date", "uint16"),
("crc32", "uint32"),
("compressed_size", "uint32"),
("uncompressed_size", "uint32"),
("filename_size", "uint16"),
("extrafield_size", "uint16"),
("filecomment_size", "uint16"),
("disknum", "uint16"),
("internal_attr", "uint16"),
("external_attr", "uint32"),
("offset", "uint32"),
("filename", "filename_size"),
("extrafield", "extrafield_size"),
("filecomment", "filecomment_size"),
]
cdir_end = [
("signature", "uint32"),
("disk_num", "uint16"),
("cdir_disk", "uint16"),
("disk_entries", "uint16"),
("cdir_entries", "uint16"),
("cdir_size", "uint32"),
("cdir_offset", "uint32"),
("comment_size", "uint16"),
]
type_mapping = { "uint32":"I", "uint16":"H"}
def format_struct (format):
string_fields = {}
fmt = "<"
for (name,value) in iter(format):
try:
fmt += type_mapping[value][0]
except KeyError:
string_fields[name] = value
return (fmt, string_fields)
def size_of(format):
return struct.calcsize(format_struct(format)[0])
class MyStruct:
def __init__(self, format, string_fields):
self.__dict__["struct_members"] = {}
self.__dict__["format"] = format
self.__dict__["string_fields"] = string_fields
def addMember(self, name, value):
self.__dict__["struct_members"][name] = value
def __getattr__(self, item):
try:
return self.__dict__["struct_members"][item]
except:
pass
print("no %s" %item)
print(self.__dict__["struct_members"])
raise AttributeError
def __setattr__(self, item, value):
if item in self.__dict__["struct_members"]:
self.__dict__["struct_members"][item] = value
else:
raise AttributeError
def pack(self):
extra_data = b""
values = []
string_fields = self.__dict__["string_fields"]
struct_members = self.__dict__["struct_members"]
format = self.__dict__["format"]
for (name,_) in format:
if name in string_fields:
if not isinstance(struct_members[name], bytes):
struct_members[name] = struct_members[name].encode('utf-8')
extra_data = extra_data + struct_members[name]
else:
values.append(struct_members[name]);
return struct.pack(format_struct(format)[0], *values) + extra_data
ENDSIG = 0x06054b50
def assert_true(cond, msg):
if not cond:
raise Exception(msg)
exit(1)
class BinaryBlob:
def __init__(self, f):
self.data = open(f, "rb").read()
self.offset = 0
self.length = len(self.data)
def readAt(self, pos, length):
self.offset = pos + length
return self.data[pos:self.offset]
def read_struct (self, format, offset = None):
if offset == None:
offset = self.offset
(fstr, string_fields) = format_struct(format)
size = struct.calcsize(fstr)
data = self.readAt(offset, size)
ret = struct.unpack(fstr, data)
retstruct = MyStruct(format, string_fields)
i = 0
for (name,_) in iter(format):
member_desc = None
if not name in string_fields:
member_data = ret[i]
i = i + 1
else:
# zip has data fields which are described by other struct fields, this does
# additional reads to fill em in
member_desc = string_fields[name]
member_data = self.readAt(self.offset, retstruct.__getattr__(member_desc))
retstruct.addMember(name, member_data)
# sanity check serialization code
data = self.readAt(offset, self.offset - offset)
out_data = retstruct.pack()
assert_true(out_data == data, "Serialization fail %d !=%d"% (len(out_data), len(data)))
return retstruct
def optimizejar(jar, outjar, inlog = None):
if inlog is not None:
inlog = open(inlog).read().rstrip()
# in the case of an empty log still move the index forward
if len(inlog) == 0:
inlog = []
else:
inlog = inlog.split("\n")
outlog = []
jarblob = BinaryBlob(jar)
dirend = jarblob.read_struct(cdir_end, jarblob.length - size_of(cdir_end))
assert_true(dirend.signature == ENDSIG, "no signature in the end");
cdir_offset = dirend.cdir_offset
readahead = 0
if inlog is None and cdir_offset == 4:
readahead = struct.unpack("<I", jarblob.readAt(0, 4))[0]
print("%s: startup data ends at byte %d" % (outjar, readahead));
total_stripped = 0;
jarblob.offset = cdir_offset
central_directory = []
for i in range(0, dirend.cdir_entries):
entry = jarblob.read_struct(cdir_entry)
if entry.filename[-1:] == "/":
total_stripped += len(entry.pack())
else:
total_stripped += entry.extrafield_size
central_directory.append(entry)
reordered_count = 0
if inlog is not None:
dup_guard = set()
for ordered_name in inlog:
if ordered_name in dup_guard:
continue
else:
dup_guard.add(ordered_name)
found = False
for i in range(reordered_count, len(central_directory)):
if central_directory[i].filename == ordered_name:
# swap the cdir entries
tmp = central_directory[i]
central_directory[i] = central_directory[reordered_count]
central_directory[reordered_count] = tmp
reordered_count = reordered_count + 1
found = True
break
if not found:
print( "Can't find '%s' in %s" % (ordered_name, jar))
outfd = open(outjar, "wb")
out_offset = 0
if inlog is not None:
# have to put central directory at offset 4 cos 0 confuses some tools.
# This also lets us specify how many entries should be preread
dirend.cdir_offset = 4
# make room for central dir + end of dir + 4 extra bytes at front
out_offset = dirend.cdir_offset + dirend.cdir_size + size_of(cdir_end) - total_stripped
outfd.seek(out_offset)
cdir_data = b""
written_count = 0
crc_mapping = {}
dups_found = 0
dupe_bytes = 0
# store number of bytes suggested for readahead
for entry in central_directory:
# read in the header twice..first for comparison, second time for convenience when writing out
jarfile = jarblob.read_struct(local_file_header, entry.offset)
assert_true(jarfile.filename == entry.filename, "Directory/Localheader mismatch")
# drop directory entries
if entry.filename[-1:] == "/":
total_stripped += len(jarfile.pack())
dirend.cdir_entries -= 1
continue
# drop extra field data
else:
total_stripped += jarfile.extra_field_size;
entry.extrafield = jarfile.extra_field = ""
entry.extrafield_size = jarfile.extra_field_size = 0
# January 1st, 2010
entry.lastmod_date = jarfile.lastmod_date = ((2010 - 1980) << 9) | (1 << 5) | 1
entry.lastmod_time = jarfile.lastmod_time = 0
data = jarfile.pack()
outfd.write(data)
old_entry_offset = entry.offset
entry.offset = out_offset
out_offset = out_offset + len(data)
entry_data = entry.pack()
cdir_data += entry_data
expected_len = entry.filename_size + entry.extrafield_size + entry.filecomment_size
assert_true(len(entry_data) != expected_len,
"%s entry size - expected:%d got:%d" % (entry.filename, len(entry_data), expected_len))
written_count += 1
if entry.crc32 in crc_mapping:
dups_found += 1
dupe_bytes += entry.compressed_size + len(data) + len(entry_data)
print("%s\n\tis a duplicate of\n%s\n---"%(entry.filename, crc_mapping[entry.crc32]))
else:
crc_mapping[entry.crc32] = entry.filename;
if inlog is not None:
if written_count == reordered_count:
readahead = out_offset
print("%s: startup data ends at byte %d"%( outjar, readahead));
elif written_count < reordered_count:
pass
#print("%s @ %d" % (entry.filename, out_offset))
elif readahead >= old_entry_offset + len(data):
outlog.append(entry.filename)
reordered_count += 1
if inlog is None:
dirend.cdir_offset = out_offset
if dups_found > 0:
print("WARNING: Found %d duplicate files taking %d bytes"%(dups_found, dupe_bytes))
dirend.cdir_size = len(cdir_data)
dirend.disk_entries = dirend.cdir_entries
dirend_data = dirend.pack()
assert_true(size_of(cdir_end) == len(dirend_data), "Failed to serialize directory end correctly. Serialized size;%d, expected:%d"%(len(dirend_data), size_of(cdir_end)));
outfd.seek(dirend.cdir_offset)
outfd.write(cdir_data)
outfd.write(dirend_data)
# for ordered jars the central directory is written in the begining of the file, so a second central-directory
# entry has to be written in the end of the file
if inlog is not None:
outfd.seek(0)
outfd.write(struct.pack("<I", readahead));
outfd.seek(out_offset)
outfd.write(dirend_data)
print("Stripped %d bytes" % total_stripped)
print("%s %d/%d in %s" % (("Ordered" if inlog is not None else "Deoptimized"),
reordered_count, len(central_directory), outjar))
outfd.close()
return outlog
if len(sys.argv) != 5:
print("Usage: --optimize|--deoptimize %s JAR_LOG_DIR IN_JAR_DIR OUT_JAR_DIR" % sys.argv[0])
exit(1)
jar_regex = re.compile("\\.jar?$")
def optimize(JAR_LOG_DIR, IN_JAR_DIR, OUT_JAR_DIR):
ls = os.listdir(IN_JAR_DIR)
for jarfile in ls:
if not re.search(jar_regex, jarfile):
continue
injarfile = os.path.join(IN_JAR_DIR, jarfile)
outjarfile = os.path.join(OUT_JAR_DIR, jarfile)
logfile = os.path.join(JAR_LOG_DIR, jarfile + ".log")
if not os.path.isfile(logfile):
logfile = None
optimizejar(injarfile, outjarfile, logfile)
def deoptimize(JAR_LOG_DIR, IN_JAR_DIR, OUT_JAR_DIR):
if not os.path.exists(JAR_LOG_DIR):
os.makedirs(JAR_LOG_DIR)
ls = os.listdir(IN_JAR_DIR)
for jarfile in ls:
if not re.search(jar_regex, jarfile):
continue
injarfile = os.path.join(IN_JAR_DIR, jarfile)
outjarfile = os.path.join(OUT_JAR_DIR, jarfile)
logfile = os.path.join(JAR_LOG_DIR, jarfile + ".log")
log = str(optimizejar(injarfile, outjarfile, None))
open(logfile, "wb").write("\n".join(log).encode('utf-8'))
def main():
MODE = sys.argv[1]
JAR_LOG_DIR = sys.argv[2]
IN_JAR_DIR = sys.argv[3]
OUT_JAR_DIR = sys.argv[4]
if MODE == "--optimize":
optimize(JAR_LOG_DIR, IN_JAR_DIR, OUT_JAR_DIR)
elif MODE == "--deoptimize":
deoptimize(JAR_LOG_DIR, IN_JAR_DIR, OUT_JAR_DIR)
else:
print("Unknown mode %s" % MODE)
exit(1)
if __name__ == '__main__':
main()

218
app/scripts/prepare_build Executable file
View file

@ -0,0 +1,218 @@
#!/usr/bin/env python3
import sys
import os
import argparse
import tempfile
import shutil
import subprocess
import re
import fileinput
from collections import OrderedDict
import json
import traceback
# Hack to combine two argparse formatters
class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter):
pass
parser = argparse.ArgumentParser(
description='Prepare build/ files for the app build process',
formatter_class=CustomFormatter)
parser.add_argument('--source-dir', '-s', required=True, metavar='BUILD_DIR', help='Directory to build from')
parser.add_argument('--output-dir', '-o', required=True, metavar='OUTPUT_DIR', help='Directory to write files to')
parser.add_argument('-c', '--channel', default='source', help='channel to add to dev build version number (e.g., "beta" for "5.0-beta.3+a5f28ca8"), or "release" or "source" to skip')
parser.add_argument('--commit-hash', '-m', metavar='HASH', help='Commit hash (required for non-release builds)')
args = parser.parse_args()
def main():
try:
app_root_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
lastrev_dir = os.path.join(app_root_dir, 'lastrev')
if not os.path.exists(lastrev_dir):
os.mkdir(lastrev_dir)
tmp_dir = os.path.join(app_root_dir, 'tmp')
if args.commit_hash:
commit_hash = args.commit_hash[0:9]
elif args.channel != "release":
raise Exception("--commit-hash must be specified for non-release builds")
src_dir = args.source_dir
if not os.path.isdir(src_dir):
raise Exception(src_dir + " is not a directory")
output_dir = args.output_dir
if not os.path.isdir(output_dir):
raise Exception(output_dir + " is not a directory")
if os.listdir(output_dir):
raise Exception(output_dir + " is not empty")
log("Using source directory of " + src_dir)
os.chdir(src_dir)
if not os.path.exists('version'):
raise FileNotFoundError("version file not found in {0}".format(src_dir))
# Extract version number from version file
with open('version') as f:
rdf = f.read()
m = re.search('([0-9].+)\\.SOURCE', rdf)
if not m:
raise Exception("Version number not found in version file")
version = m.group(1)
# Remove tmp build directory if it already exists
if os.path.exists(tmp_dir):
shutil.rmtree(tmp_dir)
os.mkdir(tmp_dir)
tmp_src_dir = os.path.join(tmp_dir, 'zotero')
# Export a clean copy of the source tree -- with Python on Windows, where rsync,
# if present at all, doesn't handle Windows-style paths
if os.name == 'nt' or not shutil.which('rsync'):
shutil.copytree(
'.',
tmp_src_dir,
ignore=shutil.ignore_patterns('.*', '#*', 'package.json', 'package-lock.json')
)
else:
subprocess.check_call([
'rsync',
'-aL',
# Exclude hidden files
'--exclude', '.*',
'--exclude', '#*',
'--exclude', 'package.json',
'--exclude', 'package-lock.json',
'.' + os.sep,
tmp_src_dir + os.sep
])
# Make sure the copy worked
d = os.path.join(tmp_src_dir, 'chrome')
if not os.path.isdir(d):
raise FileNotFoundError(d + " not found")
# Delete CSL locale support files
csl_dir = os.path.normpath(tmp_src_dir + '/chrome/content/zotero/locale/csl/')
for root, dirs, files in os.walk(csl_dir, topdown=False):
for name in files:
if not name.endswith('.xml') and name != 'locales.json':
os.remove(os.path.join(root, name))
for name in dirs:
d = os.path.join(root, name)
if not os.listdir(d):
os.rmdir(d)
# Delete styles build script
os.remove(os.path.join(tmp_src_dir, 'styles', 'update'))
translators_dir = os.path.join(tmp_src_dir, 'translators')
# Move deleted.txt out of translators directory
f = os.path.join(translators_dir, 'deleted.txt')
if os.path.exists(f):
shutil.move(f, tmp_src_dir)
# Build translator index
index = OrderedDict()
for fn in sorted((fn for fn in os.listdir(translators_dir)), key=str.lower):
if not fn.endswith('.js'):
continue
with open(os.path.join(translators_dir, fn), 'r', encoding='utf-8') as f:
contents = f.read()
# Parse out the JSON metadata block
m = re.match(r'^\s*{[\S\s]*?}\s*?[\r\n]', contents)
if not m:
raise Exception("Metadata block not found in " + f.name)
metadata = json.loads(m.group(0))
index[metadata["translatorID"]] = {
"fileName": fn,
"label": metadata["label"],
"lastUpdated": metadata["lastUpdated"]
}
# Write translator index as JSON file
with open(os.path.join(tmp_src_dir, 'translators.json'), 'w', encoding='utf-8') as f:
json.dump(index, f, indent=True, ensure_ascii=False)
version_file = os.path.join(tmp_src_dir, 'version')
log('')
log_line()
log('Original version:\n')
dump_file(version_file)
# Modify version as necessary
# The dev build revision number is stored in lastrev/{version}-{channel}.
#
# If we're including it, get the current version number and increment it.
if args.channel not in ["release", "source"]:
lastrev_file = os.path.join(
lastrev_dir, '{0}-{1}'.format(version, args.channel)
)
if not os.path.exists(lastrev_file):
with open(lastrev_file, 'w') as f:
f.write("0")
rev = 1
else:
with open(lastrev_file, 'r') as f:
rev = f.read()
rev = int(rev if rev else 0) + 1
if args.channel == "release":
rev_sub_str = ""
elif args.channel == "source":
rev_sub_str = ".SOURCE.{0}".format(commit_hash)
else:
rev_sub_str = "-{0}.{1}+{2}".format(args.channel, str(rev), commit_hash)
# Update version
for line in fileinput.FileInput(version_file, inplace=1):
line = line.replace('.SOURCE', rev_sub_str)
print(line, file=sys.stdout, end='')
log('Modified version:\n')
dump_file(version_file)
log('')
log_line()
# Move source files to output directory
os.rmdir(output_dir)
shutil.move(tmp_src_dir, output_dir)
# Update lastrev file with new revision number
if args.channel not in ["release", "source"]:
with open(lastrev_file, 'w') as f:
f.write(str(rev))
return 0
except Exception as err:
sys.stderr.write("\n" + traceback.format_exc())
return 1
# Clean up
finally:
if 'tmp_src_dir' in locals() and os.path.exists(tmp_src_dir):
shutil.rmtree(tmp_src_dir)
def dump_file(f):
with open(f, 'r') as f:
log(f.read())
def log(msg):
print(msg, file=sys.stdout)
def log_line():
log('======================================================\n\n')
if __name__ == '__main__':
sys.exit(main())

View file

@ -0,0 +1,46 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
ROOT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
. "$APP_ROOT_DIR/config.sh"
CHANNEL="test"
BRANCH="main"
if [ "`uname`" = "Darwin" ]; then
export SAFARI_APPEX="$ROOT_DIR/../safari-web-extension-builds/ZoteroSafariExtension.appex"
export SAFARI_EXT_RESOURCES="$ROOT_DIR/../safari-web-extension-builds/test/safari"
export SAFARI_APP_EXTENSION="$ROOT_DIR/../safari-app-extension-builds/test/ZoteroSafariExtension.appex"
if [ ! -d "$SAFARI_APPEX" ]; then
echo "Safari extension stub not found at $SAFARI_APPEX -- aborting" >&2
exit 1
fi
if [ ! -f "$SAFARI_EXT_RESOURCES/manifest.json" ]; then
echo "Safari web extension not found in $SAFARI_EXT_RESOURCES -- aborting" >&2
exit 1
fi
if [ ! -d "$SAFARI_APP_EXTENSION" ]; then
echo "Safari App Extension not found at $SAFARI_APP_EXTENSION -- aborting" >&2
exit 1
fi
fi
cd "$SCRIPT_DIR"
./check_requirements
hash=`./get_repo_branch_hash $BRANCH`
./check_app_matches_commit $hash
source_dir=`./get_commit_files $hash`
build_dir=`mktemp -d`
function cleanup {
rm -rf "$source_dir"
rm -rf "$build_dir"
}
trap cleanup EXIT
./prepare_build -s "$source_dir" -o "$build_dir" -c $CHANNEL -m $hash
VERSION="`cat \"$build_dir/version\"`"
./build_for_deploy -d "$build_dir" -p $BUILD_PLATFORMS -c $CHANNEL -i 1
ssh $DEPLOY_HOST "$DEPLOY_PATH/deploy" $CHANNEL "$VERSION" $BUILD_PLATFORMS

28
app/scripts/upload_builds Executable file
View file

@ -0,0 +1,28 @@
#!/bin/bash
#
# Upload build archives from 'dist' to S3 with the specified channel and version
#
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
function usage {
echo Usage: $0 CHANNEL VERSION >&2
exit 1
}
CHANNEL="${1:-}"
VERSION="${2:-}"
if [[ -z "$CHANNEL" ]] || [[ -z "$VERSION" ]]; then
usage
fi
source_dir="$DIST_DIR"
if [ "`uname -o 2> /dev/null`" = "Cygwin" ]; then
source_dir=$(cygpath -w "$source_dir")
fi
url="s3://$S3_BUCKET/$S3_DIST_PATH/$CHANNEL/$VERSION/"
aws s3 sync --exclude "files-*" --exclude build_id "$source_dir" $url

187
app/scripts/utils.sh Normal file
View file

@ -0,0 +1,187 @@
get_current_platform() {
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
echo l
elif [[ "$OSTYPE" == "darwin"* ]]; then
echo m
elif [[ "$OSTYPE" == "cygwin" ]]; then
echo w
elif [[ "$OSTYPE" == "msys" ]]; then
echo w
# Unknown, so probably Unix-y
else
echo l
fi
}
get_canonical_arch() {
local _platform=$1
local _arch=$2
case $_platform in
w)
case $_arch in
x64) _arch="win-x64" ;;
arm64) _arch="win-arm64" ;;
win32|win-x64|win-arm64) ;;
*) echo "Invalid Windows archicture: $_arch" >&2;;
esac
echo $_arch
;;
l)
[[ $_arch == x64 ]] && _arch="x86_64"
echo $_arch
;;
*)
echo "Invalid platform '$platform'" 2>&1
exit 1
esac
}
# Print a sorted NUL-separated list of the files in the current directory to
# include in the build manifest. Follows symlinks, like the rsync calls in
# prepare_build and build.sh.
function build_manifest_file_list {
# Exclusions match the rsync call in prepare_build
find -L . -mindepth 1 \( -name '.*' -o -name '#*' \) -prune \
-o -type f ! -name 'package.json' ! -name 'package-lock.json' -print0 \
| LC_ALL=C sort -z
}
# Read a NUL-separated file list on stdin and print "size|mtime<TAB>path" for
# each file
function stat_file_list {
if [[ "$OSTYPE" == "darwin"* ]]; then
xargs -0 stat -L -f '%z|%Fm|%N'
else
xargs -0 stat -L -c '%s|%y|%n'
fi | sed -E 's,^([0-9]+[|][^|]+)[|](\./)?,\1'$'\t'','
}
# Read a NUL-separated file list on stdin and print "hash<TAB>path" for each
# file
function hash_file_list {
local md5_cmd
if command -v md5sum > /dev/null 2>&1; then
md5_cmd="md5sum"
else
md5_cmd="md5 -r"
fi
xargs -0 $md5_cmd | sed -E 's,^([0-9a-f]{32}) ?(\./)?,\1'$'\t'','
}
# Generate a manifest of a build directory for incremental updates, with one
# "hash<TAB>size|mtime<TAB>path" line per file, sorted by path
function generate_build_manifest {
local dir=$1
(
cd "$dir"
local file_list
file_list=$(mktemp)
build_manifest_file_list > "$file_list"
paste \
<(hash_file_list < "$file_list" | cut -f1) \
<(stat_file_list < "$file_list")
rm -f "$file_list"
)
}
# Generate a hash of the files in app/ that affect build output, for detecting
# when a staged build can't be updated incrementally. Since some of the files
# are large binaries, use file sizes and modification times rather than
# contents. The xulrunner runtimes are covered by the hash-* files written by
# fetch_xulrunner.
function generate_app_hash {
local app_dir=$1
local md5_cmd
if command -v md5sum > /dev/null 2>&1; then
md5_cmd="md5sum"
else
md5_cmd="md5 -r"
fi
(
cd "$app_dir"
local paths=(assets build.sh config.sh scripts mac win linux modules update-packaging)
if [ -f config-custom.sh ]; then
paths+=(config-custom.sh)
fi
{
if [[ "$OSTYPE" == "darwin"* ]]; then
find -L "${paths[@]}" -name '.*' -prune -o -type f -print0 | xargs -0 stat -L -f '%N|%z|%m'
else
find -L "${paths[@]}" -name '.*' -prune -o -type f -print0 | xargs -0 stat -L -c '%n|%s|%Y'
fi
cat xulrunner/hash-* 2> /dev/null || true
} | LC_ALL=C sort | $md5_cmd | awk '{print $1}'
)
}
function check_line {
pattern=$1
file=$2
if ! grep -E -q "$pattern" "$file"; then
echo "$pattern" not found in "$file" -- aborting 2>&1
exit 1
fi
}
function replace_line {
pattern=$1
replacement=$2
file=$3
if grep -E -q "$pattern" "$file"; then
perl -pi -e "s/$pattern/$replacement/" "$file"
else
echo "$pattern" not found in "$file" -- aborting 2>&1
exit 1
fi
}
function remove_line {
pattern=$1
file=$2
if grep -E -q "$pattern" "$file"; then
grep -E -v "$pattern" "$file" > "$file.tmp"
mv "$file.tmp" "$file"
else
echo "$pattern" not found in "$file" -- aborting 2>&1
exit 1
fi
}
function remove_between {
start_pattern=$1
end_pattern=$2
file=$3
if grep -E -q "$start_pattern" "$file" && grep -E -q "$end_pattern" "$file"; then
perl -ni -e '
if (/'"$start_pattern"'/) { $skip = 1; next; }
elsif ($skip && /'"$end_pattern"'/) { $skip = 0; next; }
print unless $skip;' "$file"
else
echo "$start_pattern" and "$end_pattern" not found in "$file" -- aborting 2>&1
exit 1
fi
}
# Set $notary_auth to notarytool authentication arguments: the keychain profile in
# NOTARIZATION_PROFILE if set, or else the Apple ID and app-specific password
function prepare_notary_auth {
if [[ -n "${NOTARIZATION_PROFILE:-}" ]]; then
notary_auth=(--keychain-profile "$NOTARIZATION_PROFILE")
if [[ -n "$KEYCHAIN" ]]; then
keychain_path="$HOME/Library/Keychains/$KEYCHAIN.keychain-db"
# The keychain may have auto-locked since signing
if [[ -n "$KEYCHAIN_PASSWORD" ]]; then
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$keychain_path"
fi
notary_auth+=(--keychain "$keychain_path")
fi
else
notary_auth=(--apple-id "$NOTARIZATION_USER" --team-id "$NOTARIZATION_TEAM_ID" --password "$NOTARIZATION_PASSWORD")
fi
}

95
app/scripts/xulrunner_hash Executable file
View file

@ -0,0 +1,95 @@
#!/bin/bash
# Calculates a hash for the processed Firefox package for a given platform and architecture
#
# Usage:
# xulrunner_hash.sh -p <m|w|l> [-a ARCH]
#
# * **Mac (m)** ‑a is disallowed (universal build).
# * **Windows (w)** ‑a is **required**. Accepted values:
# win32 | x64 | arm64
# * **Linux (l)** ‑a is **required**. Accepted values:
# x86_64 | arm64 (alias x64 → x86_64)
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$APP_ROOT_DIR/config.sh"
cd "$APP_ROOT_DIR"
platform=""; arch=""
usage() {
cat >&2 <<'DONE'
Usage: xulrunner_hash.sh -p <m|w|l> [-a ARCH]
-p PLATFORM m (mac), w (windows), l (linux) [required]
-a ARCH *required* for Windows & Linux builds
Windows: x64 | arm64 | win32
Linux: x64 (or x86_64) | arm64
Mac: disallowed – always universal
DONE
exit 1
}
while getopts ':p:a:' opt; do
case $opt in
p) platform="$OPTARG";;
a) arch="$OPTARG";;
:) echo "Option -$OPTARG requires an argument" >&2; usage;;
? ) echo "Invalid option: -$OPTARG" >&2; echo; usage;;
esac
shift $((OPTIND-1)); OPTIND=1
done
[[ -z $platform ]] && { echo "-p is required" >&2; echo; usage; }
case $platform in
m)
[[ -n $arch ]] && { echo "-a is not allowed for Mac (universal build)" >&2; echo; usage; }
arch="universal"
GECKO_VERSION="$GECKO_VERSION_MAC"
;;
w)
[[ -z $arch ]] && { echo "-a is required for Windows builds" >&2; echo; usage; }
# Map CLI-friendly aliases → canonical form
case $arch in
x64) arch="win-x64" ;;
arm64) arch="win-arm64" ;;
win32|win-x64|win-arm64) ;; # already canonical
*) echo "Invalid Windows arch: $arch" >&2; echo; usage;;
esac
GECKO_VERSION="$GECKO_VERSION_WIN"
;;
l)
[[ -z $arch ]] && { echo "-a is required for Linux builds" >&2; echo; usage; }
[[ $arch == x64 ]] && arch="x86_64"
case $arch in
x86_64|arm64) ;;
*) echo "Invalid Linux arch: $arch" >&2; echo; usage;;
esac
GECKO_VERSION="$GECKO_VERSION_LINUX"
;;
*)
echo "Invalid platform: $platform" >&2; echo; usage;;
esac
# Concatenate scripts that affect the build
xulrunner_content=$(< "$SCRIPT_DIR/fetch_xulrunner")
xulrunner_content+=$(< "$SCRIPT_DIR/utils.sh")
xulrunner_content+=$(< "$APP_ROOT_DIR/assets/multilocale.txt")
# Get custom components hash
if [[ $platform = "m" ]]; then
components_hash="$custom_components_hash_mac"
else
hash_arch_name="${arch/-/_}"
arch_var_name="custom_components_hash_${hash_arch_name}"
components_hash=${!arch_var_name:-}
fi
input_string="${platform}-${arch}-${components_hash}|${GECKO_VERSION}|${xulrunner_content}"
printf "%s" "$input_string" | openssl dgst -sha256 | awk '{print $NF}'

View file

@ -0,0 +1,411 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
UPDATE_STAGE_DIR="$SCRIPT_DIR/staging"
function usage {
cat >&2 <<DONE
Usage: $0 -c CHANNEL [-f] [-i FROM_VERSION] [-p PLATFORMS] [-l] VERSION
Options
-c CHANNEL Release channel ('release', 'beta')
-f Perform full build
-i FROM_VERSION Perform incremental build
-p PLATFORMS Platforms to build (m=Mac, w=Windows, l=Linux)
-l Use local TO directory instead of downloading TO files from S3
DONE
exit 1
}
# From https://gist.github.com/cdown/1163649#gistcomment-1639097
urlencode() {
local LANG=C
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
}
BUILD_FULL=0
BUILD_INCREMENTAL=0
FROM=""
CHANNEL=""
BUILD_MAC=0
BUILD_WIN=0
BUILD_LINUX=0
USE_LOCAL_TO=0
while getopts "i:c:p:fl" opt; do
case $opt in
i)
FROM="$OPTARG"
BUILD_INCREMENTAL=1
;;
c)
CHANNEL="$OPTARG"
;;
p)
for i in `seq 0 1 $((${#OPTARG}-1))`
do
case ${OPTARG:i:1} in
m) BUILD_MAC=1;;
w) BUILD_WIN=1;;
l) BUILD_LINUX=1;;
*)
echo "$0: Invalid platform option ${OPTARG:i:1}"
usage
;;
esac
done
;;
f)
BUILD_FULL=1
;;
l)
USE_LOCAL_TO=1
;;
*)
usage
;;
esac
shift $((OPTIND-1)); OPTIND=1
done
shift $(($OPTIND - 1))
TO=${1:-}
if [ -z "$TO" ]; then
usage
fi
if [ -z "$FROM" ] && [ $BUILD_FULL -eq 0 ]; then
usage
fi
if [[ -z "$CHANNEL" ]]; then
echo "Channel not provided" >&2
exit 1
fi
# Require at least one platform
if [[ $BUILD_MAC == 0 ]] && [[ $BUILD_WIN == 0 ]] && [[ $BUILD_LINUX == 0 ]]; then
usage
fi
TO_MAJOR_VERSION="${TO%%.*}"
rm -rf "$UPDATE_STAGE_DIR"
mkdir "$UPDATE_STAGE_DIR"
INCREMENTALS_FOUND=0
for version in "$FROM" "$TO"; do
if [[ $version == "$TO" ]] && [[ $INCREMENTALS_FOUND == 0 ]] && [[ $BUILD_FULL == 0 ]]; then
exit
fi
if [ -z "$version" ]; then
continue
fi
echo "Getting Zotero version $version"
versiondir="$UPDATE_STAGE_DIR/$version"
#
# If -l passed, use main build script's staging directory for TO files rather than downloading
# the given version.
#
# The caller must ensure that the files in ../staging match the platforms and version given.
if [[ $version == $TO && $USE_LOCAL_TO == "1" ]]; then
if [ ! -d "$STAGE_DIR" ]; then
echo "Can't find local TO dir $STAGE_DIR"
exit 1
fi
echo "Using files from $STAGE_DIR"
ln -s "$STAGE_DIR" "$versiondir"
continue
fi
#
# Otherwise, download version from S3
#
mkdir -p "$versiondir"
cd "$versiondir"
# Determine Linux archive extension by major Zotero version
MAJOR_VERSION="${version%%.*}"
if [ "$MAJOR_VERSION" -lt 8 ]; then
LINUX_EXT="tar.bz2"
else
LINUX_EXT="tar.xz"
fi
MAC_ARCHIVE="Zotero-${version}.dmg"
WIN32_ARCHIVE="Zotero-${version}_win32.zip"
WIN_X64_ARCHIVE="Zotero-${version}_win-x64.zip"
WIN_ARM64_ARCHIVE="Zotero-${version}_win-arm64.zip"
LINUX_X86_ARCHIVE="Zotero-${version}_linux-i686.${LINUX_EXT}"
LINUX_X86_64_ARCHIVE="Zotero-${version}_linux-x86_64.${LINUX_EXT}"
LINUX_ARM64_ARCHIVE="Zotero-${version}_linux-arm64.${LINUX_EXT}"
CACHE_DIR="$ROOT_DIR/cache"
if [ ! -e "$CACHE_DIR" ]; then
mkdir "$CACHE_DIR"
fi
# Build archive list (no Linux arm64 before Zotero 8, no Linux i686 from Zotero 11)
ARCHIVES=(
"$MAC_ARCHIVE"
"$WIN32_ARCHIVE"
"$WIN_X64_ARCHIVE"
"$WIN_ARM64_ARCHIVE"
"$LINUX_X86_64_ARCHIVE"
)
if [ "$TO_MAJOR_VERSION" -lt 11 ]; then
ARCHIVES+=("$LINUX_X86_ARCHIVE")
fi
if [ "$MAJOR_VERSION" -ge 8 ]; then
ARCHIVES+=("$LINUX_ARM64_ARCHIVE")
fi
for archive in "${ARCHIVES[@]}"; do
if [[ $archive = "$MAC_ARCHIVE" ]] && [[ $BUILD_MAC != 1 ]]; then
continue
fi
if [[ $archive = "$WIN32_ARCHIVE" ]] && [[ $BUILD_WIN != 1 ]]; then
continue
fi
if [[ $archive = "$WIN_X64_ARCHIVE" ]] && [[ $BUILD_WIN != 1 ]]; then
continue
fi
if [[ $archive = "$WIN_ARM64_ARCHIVE" ]] && [[ $BUILD_WIN != 1 ]]; then
continue
fi
if [[ $archive = "$LINUX_X86_ARCHIVE" ]] && [[ $BUILD_LINUX != 1 ]]; then
continue
fi
if [[ $archive = "$LINUX_X86_64_ARCHIVE" ]] && [[ $BUILD_LINUX != 1 ]]; then
continue
fi
if [[ $archive = "$LINUX_ARM64_ARCHIVE" ]] && [[ $BUILD_LINUX != 1 ]]; then
continue
fi
ETAG_FILE="$CACHE_DIR/$archive.etag"
# Check cache for archive
if [[ -f "$CACHE_DIR/$archive" ]] && [[ -f "$CACHE_DIR/$archive.etag" ]]; then
ETAG="`cat $ETAG_FILE | tr '\n' ' '`"
else
ETAG=""
fi
rm -f $archive
# URL-encode '+' in beta version numbers
ENCODED_VERSION=`urlencode $version`
ENCODED_ARCHIVE=`urlencode $archive`
URL="https://$S3_BUCKET.s3.amazonaws.com/$S3_DIST_PATH/$CHANNEL/$ENCODED_VERSION/$ENCODED_ARCHIVE"
echo "Fetching $URL"
set +e
# Cached version is available
if [ -n "$ETAG" ]; then
HTTP_CODE=$(curl -sS -L -D headers.txt -o $archive -w '%{http_code}' -H "If-None-Match: $ETAG" "$URL")
NEW_ETAG=$(awk 'tolower($1) == "etag:" {print $2}' headers.txt | tr -d '\r' | tail -n 1)
rm -f headers.txt
# If ETag didn't match, cache newly downloaded version
if [ "$HTTP_CODE" = 200 ]; then
echo "ETag for $archive didn't match! -- using new version"
rm -f "$CACHE_DIR/$archive.etag"
cp $archive "$CACHE_DIR/"
echo "$NEW_ETAG" > "$CACHE_DIR/$archive.etag"
# If ETag matched (or there was another error), use cached version
else
echo "Using cached $archive"
cp "$CACHE_DIR/$archive" .
fi
else
curl -sS -f -L -D headers.txt -o $archive "$URL"
NEW_ETAG=$(awk 'tolower($1) == "etag:" {print $2}' headers.txt | tr -d '\r' | tail -n 1)
rm -f headers.txt
# Save archive to cache
rm -f "$CACHE_DIR/$archive.etag"
cp $archive "$CACHE_DIR/"
echo "$NEW_ETAG" > "$CACHE_DIR/$archive.etag"
fi
set -e
done
# Delete cached archives older than 14 days
find "$CACHE_DIR" -maxdepth 1 -type f -ctime +14 -delete
# Delete cached diffs and compressed files not created or used in 60 days
# (cache hits touch the entries)
if [ -d "$CACHE_DIR/update-packaging" ]; then
find "$CACHE_DIR/update-packaging" -type f -ctime +60 -delete
fi
# Unpack Zotero.app
if [ $BUILD_MAC == 1 ]; then
if [ -f "$MAC_ARCHIVE" ]; then
set +e
hdiutil detach -quiet /Volumes/Zotero 2>/dev/null
set -e
hdiutil attach -quiet "$MAC_ARCHIVE"
cp -R /Volumes/Zotero/Zotero.app "$versiondir"
rm "$MAC_ARCHIVE"
hdiutil detach -quiet /Volumes/Zotero
INCREMENTALS_FOUND=1
else
echo "$MAC_ARCHIVE not found"
fi
fi
# Unpack Windows zips
if [ $BUILD_WIN == 1 ]; then
if [[ -f "$WIN32_ARCHIVE" ]] && [[ -f "$WIN_X64_ARCHIVE" ]] && [[ -f "$WIN_ARM64_ARCHIVE" ]]; then
# Unpack architectures in parallel
UNPACK_PIDS=""
for build in "$WIN32_ARCHIVE" "$WIN_X64_ARCHIVE" "$WIN_ARM64_ARCHIVE"; do
(unzip -q "$build" && rm "$build") &
UNPACK_PIDS="$UNPACK_PIDS $!"
done
for pid in $UNPACK_PIDS; do
wait $pid
done
INCREMENTALS_FOUND=1
else
echo "$WIN32_ARCHIVE/$WIN_X64_ARCHIVE/$WIN_ARM64_ARCHIVE not found"
fi
fi
# Unpack Linux tarballs
if [ $BUILD_LINUX == 1 ]; then
# Zotero 7 has no Linux arm64 build; Zotero 11 has no Linux i686 build
LINUX_BUILDS_TO_UNPACK=("$LINUX_X86_64_ARCHIVE")
if [ "$TO_MAJOR_VERSION" -lt 11 ]; then
LINUX_BUILDS_TO_UNPACK+=("$LINUX_X86_ARCHIVE")
fi
if [ "$MAJOR_VERSION" -ge 8 ]; then
LINUX_BUILDS_TO_UNPACK+=("$LINUX_ARM64_ARCHIVE")
fi
MISSING=0
for build in "${LINUX_BUILDS_TO_UNPACK[@]}"; do
if [ ! -f "$build" ]; then
MISSING=1
break
fi
done
if [ "$MISSING" -eq 0 ]; then
# Unpack architectures in parallel
UNPACK_PIDS=""
for build in "${LINUX_BUILDS_TO_UNPACK[@]}"; do
(tar -xf "$build" && rm "$build") &
UNPACK_PIDS="$UNPACK_PIDS $!"
done
for pid in $UNPACK_PIDS; do
wait $pid
done
INCREMENTALS_FOUND=1
else
echo "Linux tarballs not found: ${LINUX_BUILDS_TO_UNPACK[*]}"
fi
fi
echo
done
# Set variables for mar command in make_(incremental|full)_update.sh
export MOZ_PRODUCT_VERSION="$TO"
export MAR_CHANNEL_ID="$CHANNEL"
# Reuse diffs and compressed files across incremental builds, since FROM
# versions often share files with each other and with the TO version. Entries
# that haven't been used recently are cleaned up above.
export UPDATE_CACHE_DIR="$ROOT_DIR/cache/update-packaging"
CHANGES_MADE=0
for build in "mac" "win32" "win-x64" "win-arm64" "linux-i686" "linux-x86_64" "linux-arm64"; do
# Zotero 7 has no Linux arm64 builds
if [[ $build == "linux-arm64" ]] && [[ $FROM == 7.* ]]; then
continue
fi
# Zotero 11 has no Linux i686 builds, so there's nothing to update to
if [[ $build == "linux-i686" ]] && [[ $TO_MAJOR_VERSION -ge 11 ]]; then
continue
fi
if [[ $build == "mac" ]]; then
if [[ $BUILD_MAC == 0 ]]; then
continue
fi
dir="Zotero.app"
else
if ([[ $build == "win32" ]] || [[ $build == "win-x64" ]] || [[ $build == "win-arm64" ]]) && [[ $BUILD_WIN == 0 ]]; then
continue
fi
if ([[ $build == "linux-i686" ]] || [[ $build == "linux-x86_64" ]] || [[ $build == "linux-arm64" ]]) && [[ $BUILD_LINUX == 0 ]]; then
continue
fi
dir="Zotero_$build"
fi
if [[ $BUILD_INCREMENTAL == 1 ]] && [[ -d "$UPDATE_STAGE_DIR/$FROM/$dir" ]]; then
echo
echo "Building incremental $build update from $FROM to $TO"
"$SCRIPT_DIR/make_incremental_update.sh" "$DIST_DIR/Zotero-${TO}-${FROM}_$build.mar" "$UPDATE_STAGE_DIR/$FROM/$dir" "$UPDATE_STAGE_DIR/$TO/$dir"
CHANGES_MADE=1
# If it's an incremental patch from a 6.0 build, use bzip instead of xz
if [[ $FROM = 6.0* ]]; then
echo "Building bzip2 version of incremental $build update from $FROM to $TO"
"$SCRIPT_DIR/xz_to_bzip" "$DIST_DIR/Zotero-${TO}-${FROM}_$build.mar" "$DIST_DIR/Zotero-${TO}-${FROM}_${build}_bz.mar"
rm "$DIST_DIR/Zotero-${TO}-${FROM}_$build.mar"
mv "$DIST_DIR/Zotero-${TO}-${FROM}_${build}_bz.mar" "$DIST_DIR/Zotero-${TO}-${FROM}_$build.mar"
fi
fi
if [[ $BUILD_FULL == 1 ]]; then
echo
echo "Building full $build update for $TO"
"$SCRIPT_DIR/make_full_update.sh" "$DIST_DIR/Zotero-${TO}-full_$build.mar" "$UPDATE_STAGE_DIR/$TO/$dir"
CHANGES_MADE=1
# Make a bzip version of all complete patches for serving to <7.0 builds. Don't bother with
# architectures that didn't exist in Z6.
#
# We can stop this once we do a waterfall build that all older versions get updated to.
if [[ $build != "win-x64" ]] && [[ $build != "win-arm64" ]]; then
echo "Building bzip2 version of full $build update for $TO"
"$SCRIPT_DIR/xz_to_bzip" "$DIST_DIR/Zotero-${TO}-full_$build.mar" "$DIST_DIR/Zotero-${TO}-full_bz_${build}.mar"
fi
fi
done
rm -rf "$UPDATE_STAGE_DIR"
# Update file manifests
if [ $CHANGES_MADE -eq 1 ]; then
# Cygwin has sha512sum, macOS has shasum, Linux has both
if [[ -n "`which sha512sum 2> /dev/null`" ]]; then
SHACMD="sha512sum"
else
SHACMD="shasum -a 512"
fi
cd "$DIST_DIR"
for platform in "mac" "win" "linux"; do
file=files-$platform
rm -f $file
for fn in `find . -name "*$platform*.mar" -exec basename {} \;`; do
size=`wc -c "$fn" | awk '{print $1}'`
hash=`$SHACMD "$fn" | awk '{print $1}'`
echo $fn $hash $size >> $file
done
done
fi

View file

@ -0,0 +1,450 @@
#!/bin/bash
# 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/.
#
# Code shared by update packaging scripts.
# Author: Darin Fisher
#
# -----------------------------------------------------------------------------
# Preserve a value set by the parent so it survives in the child processes
# spawned by run_parallel_tasks()
QUIET=${QUIET:-0}
# By default just assume that these tools exist on our path
MAR=${MAR:-mar}
MBSDIFF=${MBSDIFF:-mbsdiff}
XZ=${XZ:-xz}
$XZ --version > /dev/null 2>&1
if [ $? -ne 0 ]; then
# If $XZ is not set and not found on the path then this is probably
# running on a windows buildbot. Some of the Windows build systems have
# xz.exe in topsrcdir/xz/. Look in the places this would be in both a
# mozilla-central and comm-central build.
XZ="$(dirname "$(dirname "$(dirname "$0")")")/xz/xz.exe"
$XZ --version > /dev/null 2>&1
if [ $? -ne 0 ]; then
XZ="$(dirname "$(dirname "$(dirname "$(dirname "$0")")")")/xz/xz.exe"
$XZ --version > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "xz was not found on this system!"
echo "exiting"
exit 1
fi
fi
fi
# Ensure that we're always using the right compression settings.
# -T1 (single-threaded) is required: multi-threaded xz produces non-deterministic
# output, which would break both the reproducibility of MARs and the content-hash
# cache in process_update_task(). See get_cache_tag() for how changes here are
# accounted for in the cache.
export XZ_OPT="-T1 -7e"
# -----------------------------------------------------------------------------
# Helper routines
notice() {
echo "$*" 1>&2
}
verbose_notice() {
if [ $QUIET -eq 0 ]; then
notice "$*"
fi
}
get_file_size() {
info=($(ls -ln "$1"))
echo ${info[4]}
}
copy_perm() {
reference="$1"
target="$2"
if [ -x "$reference" ]; then
chmod 0755 "$target"
else
chmod 0644 "$target"
fi
}
make_add_instruction() {
f="$1"
filev3="$2"
# Used to log to the console
if [ $4 ]; then
forced=" (forced)"
else
forced=
fi
# Changed by Zotero for -e
is_extension=$(echo "$f" | grep -c 'distribution/extensions/.*/') || true
if [ $is_extension = "1" ]; then
# Use the subdirectory of the extensions folder as the file to test
# before performing this add instruction.
testdir=$(echo "$f" | sed 's/\(.*distribution\/extensions\/[^\/]*\)\/.*/\1/')
verbose_notice " add-if \"$testdir\" \"$f\""
echo "add-if \"$testdir\" \"$f\"" >> "$filev3"
else
verbose_notice " add \"$f\"$forced"
echo "add \"$f\"" >> "$filev3"
fi
}
check_for_add_if_not_update() {
add_if_not_file_chk="$1"
if [[ "$(basename "$add_if_not_file_chk")" = "channel-prefs.js" || \
"$add_if_not_file_chk" =~ (^|/)ChannelPrefs\.framework/ || \
"$(basename "$add_if_not_file_chk")" = "update-settings.ini" || \
"$add_if_not_file_chk" =~ (^|/)UpdateSettings\.framework/ ]]; then
## "true"
return 0;
fi
## "false"
return 1;
}
make_add_if_not_instruction() {
f="$1"
filev3="$2"
verbose_notice " add-if-not \"$f\" \"$f\""
echo "add-if-not \"$f\" \"$f\"" >> "$filev3"
}
make_patch_instruction() {
f="$1"
filev3="$2"
# Changed by Zotero for -e
is_extension=$(echo "$f" | grep -c 'distribution/extensions/.*/') || true
if [ $is_extension = "1" ]; then
# Use the subdirectory of the extensions folder as the file to test
# before performing this add instruction.
testdir=$(echo "$f" | sed 's/\(.*distribution\/extensions\/[^\/]*\)\/.*/\1/')
verbose_notice " patch-if \"$testdir\" \"$f.patch\" \"$f\""
echo "patch-if \"$testdir\" \"$f.patch\" \"$f\"" >> "$filev3"
else
verbose_notice " patch \"$f.patch\" \"$f\""
echo "patch \"$f.patch\" \"$f\"" >> "$filev3"
fi
}
append_remove_instructions() {
dir="$1"
filev3="$2"
if [ -f "$dir/removed-files" ]; then
listfile="$dir/removed-files"
elif [ -f "$dir/Contents/Resources/removed-files" ]; then
listfile="$dir/Contents/Resources/removed-files"
fi
if [ -n "$listfile" ]; then
# Changed by Zotero: Use subshell and disable filename globbing to prevent bash from expanding
# entries in removed-files with paths from the root (e.g., 'xulrunner/*')
(
set -f
# Map spaces to pipes so that we correctly handle filenames with spaces.
files=($(cat "$listfile" | tr " " "|" | sort -r))
num_files=${#files[*]}
for ((i=0; $i<$num_files; i=$i+1)); do
# Map pipes back to whitespace and remove carriage returns
f=$(echo ${files[$i]} | tr "|" " " | tr -d '\r')
# Trim whitespace
f=$(echo $f)
# Exclude blank lines.
if [ -n "$f" ]; then
# Exclude comments
if [ ! $(echo "$f" | grep -c '^#') = 1 ]; then
if [ $(echo "$f" | grep -c '/$') = 1 ]; then
verbose_notice " rmdir \"$f\""
echo "rmdir \"$f\"" >> "$filev3"
elif [ $(echo "$f" | grep -c '/\*$') = 1 ]; then
# Remove the *
f=$(echo "$f" | sed -e 's:\*$::')
verbose_notice " rmrfdir \"$f\""
echo "rmrfdir \"$f\"" >> "$filev3"
else
verbose_notice " remove \"$f\""
echo "remove \"$f\"" >> "$filev3"
fi
fi
fi
done
)
fi
}
# Return the number of parallel jobs to use for diffing/compression, from
# UPDATE_PACKAGING_JOBS or the number of cores
get_parallel_jobs() {
if [ -n "${UPDATE_PACKAGING_JOBS:-}" ]; then
echo "$UPDATE_PACKAGING_JOBS"
return 0
fi
nproc 2>/dev/null && return 0
sysctl -n hw.ncpu 2>/dev/null && return 0
echo 1
}
# Run per-file tasks from a task file in parallel by re-invoking the calling
# script with --run-task for each line. Tasks are ordered largest-file-first so
# that long-running jobs (e.g., diffing xul) start as early as possible.
#
# $1 - task file, with one "<type><TAB><relative path>" task per line
# $2 - directory to measure file sizes against for job ordering
# $3 - script to re-invoke (callers pass "$0" and handle --run-task before
# option parsing by calling process_update_task)
#
# Callers must export the variables needed by process_update_task().
run_parallel_tasks() {
local taskfile="$1"
local basedir="$2"
local script="$3"
local jobs
if [ ! -s "$taskfile" ]; then
return 0
fi
# xargs requires a resolvable command path
script="$(cd "$(dirname "$script")" && pwd)/$(basename "$script")"
# Compute the cache tag once here and export it so the per-file child
# processes inherit it rather than recomputing it for every file
if [ -n "${UPDATE_CACHE_DIR:-}" ] && [ -z "${UPDATE_CACHE_TAG:-}" ]; then
UPDATE_CACHE_TAG="$(get_cache_tag)"
export UPDATE_CACHE_TAG
fi
jobs=$(get_parallel_jobs)
notice "Processing $(wc -l < "$taskfile" | tr -d ' ') files with $jobs parallel jobs"
(cd "$basedir" && du -ak .) > "$taskfile.sizes"
awk -F'\t' 'NR==FNR { sizes[substr($2, 3)] = $1; next } { print sizes[$2] "\t" $0 }' \
"$taskfile.sizes" "$taskfile" \
| sort -rn \
| cut -f 2- \
| tr '\n' '\000' \
| xargs -0 -n 1 -P "$jobs" "$script" --run-task
}
# -----------------------------------------------------------------------------
# Diff and compression cache
#
# Building updates repeats the same expensive work: the same file contents get
# xz-compressed once per architecture, per FROM version, and per release, and
# the same before/after file pair gets binary-diffed again and again. When
# UPDATE_CACHE_DIR is set, we cache the results by content hash and reuse them
# across builds. Two kinds of entry are stored:
#
# full-<tag>-<hash>.xz A single file compressed with xz, keyed
# on the file's contents. Reused whenever
# the same content shows up again, in any
# architecture, version, or release.
#
# patch-<tag>-<oldhash>-<newhash>.xz The compressed binary diff between a
# file's old and new contents, keyed on
# both. Reused whenever the same
# before/after pair recurs (e.g., a file
# unchanged across several FROM versions
# being patched to the same TO).
#
# Both entries are written even when only one is ultimately packaged, so a file
# that loses the patch-vs-full size comparison in one build still seeds the
# cache for the next. <tag> is get_cache_tag(), so a toolchain/settings change
# starts a fresh namespace rather than reusing stale output. Entries are touched
# on use and expire via the time-based cleanup in build_autoupdate.sh.
# -----------------------------------------------------------------------------
# Print a SHA-256 content hash to use as a cache key
hash_file() {
if command -v sha256sum > /dev/null 2>&1; then
sha256sum "$1" | awk '{print $1}'
else
shasum -a 256 "$1" | awk '{print $1}'
fi
}
# Print a SHA-256 hash of stdin
hash_stdin() {
if command -v sha256sum > /dev/null 2>&1; then
sha256sum | awk '{print $1}'
else
shasum -a 256 | awk '{print $1}'
fi
}
# Print a short tag identifying the toolchain and options that produce cached
# files, so that entries are invalidated when any of them change. The cache
# keys files by input content only, on the assumption that the same inputs
# always compress/diff to the same output; this tag makes that assumption hold
# across xz/mbsdiff upgrades and XZ_OPT/BCJ_OPTIONS changes. (A change to any
# input invalidates both the full and patch caches, which is more than strictly
# necessary but keeps this simple; a stale build is just a cold rebuild.)
# Stale-tag entries are removed by the time-based cleanup in build_autoupdate.sh.
get_cache_tag() {
local mbsdiff_bin
mbsdiff_bin="$(command -v "$MBSDIFF" 2>/dev/null)"
{
$XZ --version 2>/dev/null | head -1
echo "XZ_OPT=$XZ_OPT"
echo "BCJ_OPTIONS=${BCJ_OPTIONS:-}"
# mbsdiff has no --version, so identify it by its binary contents
if [ -n "$mbsdiff_bin" ]; then
hash_file "$mbsdiff_bin"
else
echo "MBSDIFF=$MBSDIFF"
fi
} | hash_stdin | cut -c 1-16
}
# Atomically store file $2 in the cache as $1
cache_store() {
mkdir -p "$(dirname "$1")"
cp "$2" "$1.tmp.$$" && mv -f "$1.tmp.$$" "$1"
}
# xz-compress $1 to $2, reusing a cached result when one exists (see the cache
# overview above)
compress_full_file() {
local src="$1"
local dest="$2"
local key=""
if [ -n "${UPDATE_CACHE_DIR:-}" ]; then
key="$UPDATE_CACHE_DIR/full-${UPDATE_CACHE_TAG:-}-$(hash_file "$src").xz"
if [ -f "$key" ]; then
# Keep entries that are still in use from expiring
touch -c "$key" 2>/dev/null || true
cp "$key" "$dest"
return 0
fi
fi
$XZ $XZ_OPT --compress $BCJ_OPTIONS --lzma2 --format=xz --check=crc64 --force --stdout "$src" > "$dest"
if [ -n "$key" ]; then
cache_store "$key" "$dest"
fi
}
# Process a single task line from run_parallel_tasks():
#
# full - compress the new file into the work directory
# diff - if the file changed, generate a binary diff and keep the smaller of
# the compressed patch ($f.patch) and the compressed file ($f)
#
# Expects newdir and workdir in the environment, plus olddir for diff tasks.
# The results are assembled into the manifest serially by the caller based on
# which files exist in the work directory. Diffs and compressed files are
# cached when enabled -- see the cache overview above.
process_update_task() {
local task="$1"
local tab=$(printf '\t')
local type="${task%%"$tab"*}"
local f="${task#*"$tab"}"
local oldfile_path newfile_path patch_path patchsize fullsize full_pid patchkey
if [ "$type" = "diff" ]; then
if diff "$olddir/$f" "$newdir/$f" > /dev/null; then
# Unchanged
return 0
fi
mkdir -p "$(dirname "$workdir/$f")"
verbose_notice "diffing \"$f\""
# Compress the full new file in the background while diffing, since both
# are needed to decide which to package
compress_full_file "$newdir/$f" "$workdir/$f" &
full_pid=$!
patchkey=""
if [ -n "${UPDATE_CACHE_DIR:-}" ]; then
patchkey="$UPDATE_CACHE_DIR/patch-${UPDATE_CACHE_TAG:-}-$(hash_file "$olddir/$f")-$(hash_file "$newdir/$f").xz"
fi
if [ -n "$patchkey" ] && [ -f "$patchkey" ]; then
# Keep entries that are still in use from expiring
touch -c "$patchkey" 2>/dev/null || true
cp "$patchkey" "$workdir/$f.patch.xz"
else
# mbsdiff doesn't like POSIX paths on Windows
if [ ${WIN_NATIVE:-0} -eq 1 ]; then
oldfile_path=$(cygpath -m "$olddir/$f")
newfile_path=$(cygpath -m "$newdir/$f")
patch_path=$(cygpath -m "$workdir/$f.patch")
else
oldfile_path="$olddir/$f"
newfile_path="$newdir/$f"
patch_path="$workdir/$f.patch"
fi
$MBSDIFF "$oldfile_path" "$newfile_path" "$patch_path"
$XZ $XZ_OPT --compress --lzma2 --format=xz --check=crc64 --force "$workdir/$f.patch"
if [ -n "$patchkey" ]; then
cache_store "$patchkey" "$workdir/$f.patch.xz"
fi
fi
wait $full_pid
copy_perm "$newdir/$f" "$workdir/$f"
patchsize=$(get_file_size "$workdir/$f.patch.xz")
fullsize=$(get_file_size "$workdir/$f")
if [ $patchsize -lt $fullsize ]; then
mv -f "$workdir/$f.patch.xz" "$workdir/$f.patch"
rm -f "$workdir/$f"
else
rm -f "$workdir/$f.patch.xz"
fi
else
mkdir -p "$(dirname "$workdir/$f")"
compress_full_file "$newdir/$f" "$workdir/$f"
copy_perm "$newdir/$f" "$workdir/$f"
fi
}
# List all files in the current directory, stripping leading "./"
# Pass a variable name and it will be filled as an array.
list_files() {
count=0
temp_filelist=$(mktemp)
find . -type f \
! -name "update.manifest" \
! -name "updatev2.manifest" \
! -name "updatev3.manifest" \
| sed 's/\.\/\(.*\)/\1/' \
| sort -r > "${temp_filelist}"
while read file; do
eval "${1}[$count]=\"$file\""
# Changed for Zotero to avoid eval as 1
#(( count++ ))
(( ++count ))
done < "${temp_filelist}"
rm "${temp_filelist}"
}
# List all directories in the current directory, stripping leading "./"
list_dirs() {
count=0
temp_dirlist=$(mktemp)
find . -type d \
! -name "." \
! -name ".." \
| sed 's/\.\/\(.*\)/\1/' \
| sort -r > "${temp_dirlist}"
while read dir; do
eval "${1}[$count]=\"$dir\""
# Changed for Zotero
#(( count++ ))
(( ++count ))
done < "${temp_dirlist}"
rm "${temp_dirlist}"
}

View file

@ -0,0 +1,145 @@
#!/bin/bash
# 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/.
#
# This tool generates full update packages for the update system.
# Author: Darin Fisher
#
# Added for Zotero
set -eo pipefail
. $(dirname "$0")/common.sh
# Process a single file task when invoked from run_parallel_tasks()
if [ "${1:-}" = "--run-task" ]; then
process_update_task "$2"
exit 0
fi
# -----------------------------------------------------------------------------
print_usage() {
notice "Usage: $(basename $0) [OPTIONS] ARCHIVE DIRECTORY"
}
if [ $# = 0 ]; then
print_usage
exit 1
fi
if [ $1 = -h ]; then
print_usage
notice ""
notice "The contents of DIRECTORY will be stored in ARCHIVE."
notice ""
notice "Options:"
notice " -h show this help text"
notice " -q be less verbose"
notice ""
exit 1
fi
if [ $1 = -q ]; then
QUIET=1
export QUIET
shift
fi
# -----------------------------------------------------------------------------
mar_command="$MAR -V ${MOZ_PRODUCT_VERSION:?} -H ${MAR_CHANNEL_ID:?}"
archive="$1"
targetdir="$2"
# Prevent the workdir from being inside the targetdir so it isn't included in
# the update mar.
if [ $(echo "$targetdir" | grep -c '/$') = 1 ]; then
# Remove the /
targetdir=$(echo "$targetdir" | sed -e 's:\/$::')
fi
workdir="$targetdir.work"
updatemanifestv3="$workdir/updatev3.manifest"
targetfiles="updatev3.manifest"
mkdir -p "$workdir"
# Generate a list of all files in the target directory.
pushd "$targetdir"
if test $? -ne 0 ; then
exit 1
fi
if [ ! -f "precomplete" ]; then
if [ ! -f "Contents/Resources/precomplete" ]; then
notice "precomplete file is missing!"
exit 1
fi
fi
list_files files
popd
# Add the type of update to the beginning of the update manifests.
> "$updatemanifestv3"
notice ""
notice "Adding type instruction to update manifests"
notice " type complete"
echo "type \"complete\"" >> "$updatemanifestv3"
notice ""
notice "Adding file add instructions to update manifests"
num_files=${#files[*]}
# Compress the files in parallel via run_parallel_tasks() in
# common.sh, and then assemble the manifest and archive list serially in the
# original order
tmpdir="$(mktemp -d)"
taskfile="$tmpdir/tasks"
TAB="$(printf '\t')"
> "$taskfile"
for ((i=0; $i<$num_files; i=$i+1)); do
echo "full$TAB${files[$i]}" >> "$taskfile"
done
newdir="$targetdir"
export newdir workdir BCJ_OPTIONS QUIET
run_parallel_tasks "$taskfile" "$targetdir" "$0"
rm -rf "$tmpdir"
for ((i=0; $i<$num_files; i=$i+1)); do
f="${files[$i]}"
if check_for_add_if_not_update "$f"; then
make_add_if_not_instruction "$f" "$updatemanifestv3"
else
make_add_instruction "$f" "$updatemanifestv3"
fi
targetfiles="$targetfiles \"$f\""
done
# Append remove instructions for any dead files.
notice ""
notice "Adding file and directory remove instructions from file 'removed-files'"
append_remove_instructions "$targetdir" "$updatemanifestv3"
$XZ $XZ_OPT --compress $BCJ_OPTIONS --lzma2 --format=xz --check=crc64 --force "$updatemanifestv3" && mv -f "$updatemanifestv3.xz" "$updatemanifestv3"
# Changed for Zotero -- -C is unreliable
pushd "$workdir" > /dev/null
mar_command="$mar_command -c output.mar"
eval "$mar_command $targetfiles"
popd > /dev/null
mv -f "$workdir/output.mar" "$archive"
# cleanup
rm -fr "$workdir"
notice ""
notice "Finished"
notice ""

View file

@ -0,0 +1,301 @@
#!/bin/bash
# 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/.
#
# This tool generates incremental update packages for the update system.
# Author: Darin Fisher
#
# Added for Zotero
set -eo pipefail
. $(dirname "$0")/common.sh
# Process a single file task when invoked from run_parallel_tasks()
if [ "${1:-}" = "--run-task" ]; then
process_update_task "$2"
exit 0
fi
# -----------------------------------------------------------------------------
print_usage() {
notice "Usage: $(basename $0) [OPTIONS] ARCHIVE FROMDIR TODIR"
notice ""
notice "The differences between FROMDIR and TODIR will be stored in ARCHIVE."
notice ""
notice "Options:"
notice " -h show this help text"
notice " -f clobber this file in the installation"
notice " Must be a path to a file to clobber in the partial update."
notice " -q be less verbose"
notice ""
}
check_for_forced_update() {
force_list="$1"
forced_file_chk="$2"
local f
if [ "$forced_file_chk" = "precomplete" ]; then
## "true" *giggle*
return 0;
fi
if [ "$forced_file_chk" = "Contents/Resources/precomplete" ]; then
## "true" *giggle*
return 0;
fi
if [ "$forced_file_chk" = "removed-files" ]; then
## "true" *giggle*
return 0;
fi
if [ "$forced_file_chk" = "Contents/Resources/removed-files" ]; then
## "true" *giggle*
return 0;
fi
# notarization ticket
if [ "$forced_file_chk" = "Contents/CodeResources" ]; then
## "true" *giggle*
return 0;
fi
if [ "${forced_file_chk##*.}" = "chk" ]; then
## "true" *giggle*
return 0;
fi
for f in $force_list; do
#echo comparing $forced_file_chk to $f
if [ "$forced_file_chk" = "$f" ]; then
## "true" *giggle*
return 0;
fi
done
## 'false'... because this is bash. Oh yay!
return 1;
}
if [ $# = 0 ]; then
print_usage
exit 1
fi
requested_forced_updates='Contents/MacOS/firefox'
while getopts "hqf:" flag
do
case "$flag" in
h) print_usage; exit 0
;;
q) QUIET=1
;;
f) requested_forced_updates="$requested_forced_updates $OPTARG"
;;
?) print_usage; exit 1
;;
esac
done
# -----------------------------------------------------------------------------
mar_command="$MAR -V ${MOZ_PRODUCT_VERSION:?} -H ${MAR_CHANNEL_ID:?}"
# Added for -e for Zotero
set +e
let arg_start=$OPTIND-1
shift $arg_start
set -e
archive="$1"
olddir="$2"
newdir="$3"
# Prevent the workdir from being inside the targetdir so it isn't included in
# the update mar.
if [ $(echo "$newdir" | grep -c '/$') = 1 ]; then
# Remove the /
newdir=$(echo "$newdir" | sed -e 's:\/$::')
fi
workdir="$(mktemp -d)"
updatemanifestv3="$workdir/updatev3.manifest"
archivefiles="updatev3.manifest"
mkdir -p "$workdir"
# Generate a list of all files in the target directory.
pushd "$olddir"
if test $? -ne 0 ; then
exit 1
fi
list_files oldfiles
list_dirs olddirs
popd
pushd "$newdir"
if test $? -ne 0 ; then
exit 1
fi
if [ ! -f "precomplete" ]; then
if [ ! -f "Contents/Resources/precomplete" ]; then
notice "precomplete file is missing!"
exit 1
fi
fi
list_dirs newdirs
list_files newfiles
popd
# Add the type of update to the beginning of the update manifests.
notice ""
notice "Adding type instruction to update manifests"
> $updatemanifestv3
notice " type partial"
echo "type \"partial\"" >> $updatemanifestv3
notice ""
notice "Adding file patch and add instructions to update manifests"
num_oldfiles=${#oldfiles[*]}
remove_array=
num_removes=0
# The main file loop is split into three passes so that the
# CPU-heavy work can run in parallel: classify each file into a task list, run
# the diffing/compression tasks in parallel via run_parallel_tasks() in
# common.sh, and then assemble the manifest and archive list serially in the
# original order based on the files the tasks left in the work directory.
#
# (This also drops the unused MBSDIFF_HOOK/funsize path from the upstream
# script -- the diff behavior itself is unchanged and now lives in
# process_update_task() in common.sh.)
tmpdir="$(mktemp -d)"
taskfile="$tmpdir/tasks"
TAB="$(printf '\t')"
> "$taskfile"
for ((i=0; $i<$num_oldfiles; i=$i+1)); do
f="${oldfiles[$i]}"
# If this file exists in the new directory as well, then check if it differs.
if [ -f "$newdir/$f" ]; then
if check_for_add_if_not_update "$f"; then
echo "full$TAB$f" >> "$taskfile"
elif check_for_forced_update "$requested_forced_updates" "$f"; then
echo "full$TAB$f" >> "$taskfile"
else
echo "diff$TAB$f" >> "$taskfile"
fi
fi
done
# Newly added files -- in the new directory but not the old one. (This replaces
# the O(n^2) nested skip loop from the upstream script.)
printf '%s\n' "${oldfiles[@]}" | sort > "$tmpdir/oldlist"
printf '%s\n' "${newfiles[@]}" | sort > "$tmpdir/newlist"
comm -13 "$tmpdir/oldlist" "$tmpdir/newlist" | sed '/^$/d' | sort -r > "$tmpdir/newonly"
while IFS= read -r f; do
echo "full$TAB$f" >> "$taskfile"
done < "$tmpdir/newonly"
export olddir newdir workdir MBSDIFF BCJ_OPTIONS QUIET
run_parallel_tasks "$taskfile" "$newdir" "$0"
# Assemble the manifest and archive list in the original order. A diffed file
# left $f.patch in the work directory if the patch was smaller, $f if the
# compressed file was smaller, and neither if the file was unchanged.
for ((i=0; $i<$num_oldfiles; i=$i+1)); do
f="${oldfiles[$i]}"
if [ -f "$newdir/$f" ]; then
if check_for_add_if_not_update "$f"; then
make_add_if_not_instruction "$f" "$updatemanifestv3"
archivefiles="$archivefiles \"$f\""
elif check_for_forced_update "$requested_forced_updates" "$f"; then
make_add_instruction "$f" "$updatemanifestv3" 1
archivefiles="$archivefiles \"$f\""
elif [ -f "$workdir/$f.patch" ]; then
make_patch_instruction "$f" "$updatemanifestv3"
archivefiles="$archivefiles \"$f.patch\""
elif [ -f "$workdir/$f" ]; then
make_add_instruction "$f" "$updatemanifestv3"
archivefiles="$archivefiles \"$f\""
fi
else
# remove instructions are added after add / patch instructions for
# consistency with make_incremental_updates.py
remove_array[$num_removes]=$f
# Changed by Zotero for -e
#(( num_removes++ ))
(( ++num_removes ))
fi
done
# Newly added files
notice ""
notice "Adding file add instructions to update manifests"
while IFS= read -r f; do
if check_for_add_if_not_update "$f"; then
make_add_if_not_instruction "$f" "$updatemanifestv3"
else
make_add_instruction "$f" "$updatemanifestv3"
fi
archivefiles="$archivefiles \"$f\""
done < "$tmpdir/newonly"
rm -rf "$tmpdir"
notice ""
notice "Adding file remove instructions to update manifests"
for ((i=0; $i<$num_removes; i=$i+1)); do
f="${remove_array[$i]}"
verbose_notice " remove \"$f\""
echo "remove \"$f\"" >> $updatemanifestv3
done
# Add remove instructions for any dead files.
notice ""
notice "Adding file and directory remove instructions from file 'removed-files'"
append_remove_instructions "$newdir" "$updatemanifestv3"
notice ""
notice "Adding directory remove instructions for directories that no longer exist"
num_olddirs=${#olddirs[*]}
for ((i=0; $i<$num_olddirs; i=$i+1)); do
f="${olddirs[$i]}"
# If this dir doesn't exist in the new directory remove it.
if [ ! -d "$newdir/$f" ]; then
verbose_notice " rmdir $f/"
echo "rmdir \"$f/\"" >> $updatemanifestv3
fi
done
$XZ $XZ_OPT --compress $BCJ_OPTIONS --lzma2 --format=xz --check=crc64 --force "$updatemanifestv3" && mv -f "$updatemanifestv3.xz" "$updatemanifestv3"
# Changed for Zotero -- -C is unreliable
pushd "$workdir" > /dev/null
mar_command="$mar_command -c output.mar"
eval "$mar_command $archivefiles"
popd > /dev/null
mv -f "$workdir/output.mar" "$archive"
# cleanup
rm -fr "$workdir"
notice ""
notice "Finished"
notice ""

View file

@ -0,0 +1,24 @@
application.ini
chrome.manifest
chrome/*
components/*
defaults/*
deleted.txt
dictionaries/*
extensions/*
fonts/EmojiOneMozilla.ttf
gtk2/*
icudt58l.dat
install.rdf
libnssdbm3.chk
libnssdbm3.so
libsoftokn3.chk
pingsender
resource/*
run-zotero.sh
styles.zip
test/*
translators.index
translators.zip
xulrunner/*
zotero.jar

View file

@ -0,0 +1,67 @@
Contents/Frameworks/XUL.framework/
Contents/MacOS/Info.plist
Contents/MacOS/LICENSE
Contents/MacOS/README.xulrunner
Contents/MacOS/Resources/*
Contents/MacOS/active-update.xml
Contents/MacOS/chrome.manifest
Contents/MacOS/components/
Contents/MacOS/crashreporter.app/*
Contents/MacOS/defaults/*
Contents/MacOS/dependentlibs.list
Contents/MacOS/dictionaries/
Contents/MacOS/gmp-fake/*
Contents/MacOS/js-gdb.py
Contents/MacOS/libc++.1.dylib
Contents/MacOS/libfreebl.chk
Contents/MacOS/libmozsqlite3.dylib
Contents/MacOS/libnspr4.dylib
Contents/MacOS/libnssdbm3.chk
Contents/MacOS/libnssdbm3.dylib
Contents/MacOS/libnssutil3.dylib
Contents/MacOS/libplc4.dylib
Contents/MacOS/libplds4.dylib
Contents/MacOS/libplugin_child_interpose.dylib
Contents/MacOS/libsmime3.dylib
Contents/MacOS/libsoftokn3.chk
Contents/MacOS/libssl3.dylib
Contents/MacOS/libxpcom.dylib
Contents/MacOS/omni.ja
Contents/MacOS/pdfinfo
Contents/MacOS/pdftotext
Contents/MacOS/pingsender
Contents/MacOS/platform.ini
Contents/MacOS/precomplete
Contents/MacOS/res/*
Contents/MacOS/update-settings.ini
Contents/MacOS/updater.app/Contents/MacOS/updater-bin
Contents/MacOS/updates.xml
Contents/MacOS/updates/*
Contents/MacOS/zotero-bin
Contents/Resources/CONTRIBUTING.md
Contents/Resources/COPYING
Contents/Resources/README.md
Contents/Resources/application.ini
Contents/Resources/chrome.manifest
Contents/Resources/chrome/*
Contents/Resources/components/*
Contents/Resources/defaults/*
Contents/Resources/deleted.txt
Contents/Resources/devtools.jar
Contents/Resources/dictionaries/*
Contents/Resources/extensions/*
Contents/Resources/gmp-clearkey/0.1/clearkey.info
Contents/Resources/icudt56l.dat
Contents/Resources/install.rdf
Contents/Resources/poppler-data/*
Contents/Resources/resource/*
Contents/Resources/styles.zip
Contents/Resources/test/*
Contents/Resources/translators.index
Contents/Resources/translators.zip
Contents/Resources/voucher.bin
Contents/Resources/zotero.jar
Contents/XPCServices/*
Contents/_CodeSignature/CodeDirectory
Contents/_CodeSignature/CodeRequirements
Contents/_CodeSignature/CodeSignature

View file

@ -0,0 +1,58 @@
Accessible.tlb
AccessibleHandler.dll
IA2Marshal.dll
Microsoft.VC80.CRT.manifest
api-ms-win-core-console-l1-1-0.dll
api-ms-win-core-datetime-l1-1-0.dll
api-ms-win-core-debug-l1-1-0.dll
api-ms-win-core-errorhandling-l1-1-0.dll
api-ms-win-core-file-l1-1-0.dll
api-ms-win-core-handle-l1-1-0.dll
api-ms-win-core-heap-l1-1-0.dll
api-ms-win-core-interlocked-l1-1-0.dll
api-ms-win-core-libraryloader-l1-1-0.dll
api-ms-win-core-memory-l1-1-0.dll
api-ms-win-core-namedpipe-l1-1-0.dll
api-ms-win-core-processenvironment-l1-1-0.dll
api-ms-win-core-processthreads-l1-1-0.dll
api-ms-win-core-profile-l1-1-0.dll
api-ms-win-core-rtlsupport-l1-1-0.dll
api-ms-win-core-string-l1-1-0.dll
api-ms-win-core-synch-l1-1-0.dll
api-ms-win-core-sysinfo-l1-1-0.dll
api-ms-win-core-util-l1-1-0.dll
application.ini
chrome.manifest
chrome/*
components/*
defaults/*
deleted.txt
dictionaries/*
extensions/*
firefox.*
fonts/EmojiOneMozilla.ttf
freebl3.chk
gkmedias.dll
install.rdf
minidump-analyzer.exe
mozcrt19.dll
mozutils.dll
msvcp80.dll
msvcp120.dll
msvcr80.dll
msvcr120.dll
nssdbm3.chk
nssdbm3.dll
pdfinfo.exe
pdftotext.exe
pingsender.exe
plugin-hang-ui.exe
poppler-data/*
resource/*
softokn3.chk
styles.zip
test/*
translators.index
translators.zip
xulrunner/*
zotero.jar

66
app/update-packaging/xz_to_bzip Executable file
View file

@ -0,0 +1,66 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$APP_ROOT_DIR/config.sh"
infile=${1:-}
outfile=${2:-}
if [[ -z "$infile" ]] || [[ -z "$infile" ]]; then
echo "Usage: $0 infile.mar outfile.mar"
exit 1
fi
mar="$APP_ROOT_DIR/xulrunner/bin/mar"
if [ ! -f "$mar" ]; then
echo "$mar not found"
exit 1
fi
tmp_dir=`mktemp -d`
function cleanup {
rm -rf $tmp_dir
}
trap cleanup EXIT
cd "$tmp_dir"
mkdir in
cd in
if [ "`uname -o 2> /dev/null`" = "Cygwin" ]; then
infile=$(cygpath -w "$infile")
outfile=$(cygpath -w "$outfile")
fi
echo "Extracting MAR"
$mar -x "$infile"
echo "Renaming all files to .xz"
find . -type f -exec mv {} {}.xz \;
echo "Uncompressing files"
find . -type f -exec unxz {} \;
echo "Recompressing files with bzip2"
find . -type f -exec bzip2 {} \;
echo "Removing .bz extension"
find . -type f | while read f; do mv "$f" "${f%.bz2}"; done
channel=$($mar -T "$infile" | sed -n -r 's/.+MAR channel name: ([^\s]+)/\1/p')
version=$($mar -T "$infile" | sed -n -r 's/.+Product version: ([^\s]+)/\1/p')
if [ -z "$channel" ]; then
echo "Could not detect channel"
exit 1
fi
if [ -z "$version" ]; then
echo "Could not detect version"
exit 1
fi
echo "MAR channel name: $channel"
echo "Product version: $version"
echo "Creating new MAR"
find . -type f -print0 | xargs -0 $mar -V $version -H $channel -c "$outfile"
echo
$mar -T "$outfile"

Binary file not shown.

BIN
app/win/VersionInfo1.rc Normal file

Binary file not shown.

59
app/win/build Normal file
View file

@ -0,0 +1,59 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
APP_ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$APP_ROOT_DIR/config.sh"
if [ $# -lt 2 ]; then
echo "Usage: $0 /path/to/src/firefox x64|arm64|win32" >&2
exit 1
fi
gecko_path=$1
arch=$2
if [ ! -d "$gecko_path" ]; then
echo "$gecko_path is not a directory" >&2
exit 1
fi
# Install required Rust version
rustup toolchain install $RUST_VERSION
if [ $arch = "x64" ]; then
rust_target=x86_64
elif [ $arch = "arm64" ]; then
rust_target=aarch64
elif [ $arch = "win32" ]; then
rust_target=i686
else
echo "Unknown architecture $arch" >&2
exit 1
fi
rustup default $RUST_VERSION
rustup target add $rust_target-pc-windows-msvc
cp "$SCRIPT_DIR/mozconfig" "$gecko_path"
if [[ $arch == "arm64" || $arch == "win32" ]]; then
export Z_ARCH=$arch
export RUST_TARGET=$rust_target-pc-windows-msvc
fi
cd "$gecko_path"
./mach build
./mach package
# Copy the packaged ZIP back to app/win/ for launcher/xul.dll extraction
case $arch in
x64) zip_suffix=win64 ;;
arm64) zip_suffix=win64-aarch64 ;;
win32) zip_suffix=win32 ;;
esac
zip_file=$(ls "$gecko_path"/obj-*/dist/firefox-*.en-US.${zip_suffix}.zip 2>/dev/null | head -1) || true
if [ -z "$zip_file" ] || [ ! -f "$zip_file" ]; then
echo "Could not find packaged zip for $arch in $gecko_path/obj-*/dist/" >&2
exit 1
fi
cp "$zip_file" "$SCRIPT_DIR/"
echo "Copied $(basename "$zip_file") to $SCRIPT_DIR"

59
app/win/download-nsis-plugins Executable file
View file

@ -0,0 +1,59 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"
#
# Turns out we need older versions from Mozilla, not the official ZIPs
#
#plugins=$(cat <<EOF
#http://nsis.sourceforge.net/mediawiki/images/d/d4/AppAssocReg-0.4.zip
#https://github.com/connectiblutz/NSIS-ApplicationID/releases/download/1.1/NSIS-ApplicationID.zip
#http://nsis.sourceforge.net/mediawiki/images/c/ca/InvokeShellVerb-1.0.zip
#http://nsis.sourceforge.net/mediawiki/images/6/6c/Shelllink.zip
#http://nsis.sourceforge.net/mediawiki/images/8/8f/UAC.zip
#EOF
#)
#
#mkdir -p nsis
#cd nsis
#for plugin in $plugins; do
# curl -fsSLO $plugin
#done
#
#unzip_cmd="unzip -d Plugins -j"
#for zip in AppAssocReg*.zip InvokeShellVerb*.zip; do
# $unzip_cmd $zip 'Plugins/Unicode/*.dll'
#done
#$unzip_cmd Shelllink*.zip Unicode/Plugins/ShellLink.dll
#$unzip_cmd NSIS-ApplicationID*.zip 'ReleaseUnicode/ApplicationID*'
#$unzip_cmd UAC.zip Plugins/x86-unicode/UAC.dll
#
#rm *.zip
#
#echo
#echo
#echo "Files extracted to ./nsis/Plugins -- move to ${NSIS_DIR}Plugins"
#echo
#ls -la Plugins
mkdir -p Plugins
cd Plugins
plugins="AccessControl AppAssocReg ApplicationID InvokeShellVerb ShellLink UAC"
for plugin in $plugins; do
curl https://hg.mozilla.org/mozilla-central/raw-file/052d53200cf8/other-licenses/nsis/Plugins/$plugin.dll > $plugin.dll
done
# From https://nsis.sourceforge.io/NsProcess_plugin
curl https://download.zotero.org/dev/win/NsProcess-1.6.zip > NsProcess.zip
7z e NsProcess.zip "Plugin/nsProcessW.dll"
mv nsProcessW.dll nsProcess.dll
rm NsProcess.zip
echo
echo
echo "Files downloaded to ./Plugins -- move to ${NSIS_DIR}Plugins"
echo
ls -la

84
app/win/extract_xul_dll Executable file
View file

@ -0,0 +1,84 @@
#!/bin/bash
#
# Extract xul.dll from custom Firefox build ZIPs in current folder and create a
# ZIP for each platform with its own SHA256 hash in the filename. The files
# should then be uploaded and their hashes updated in config.sh so that
# fetch_xulrunner will download and use the custom xul.dll.
set -euo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$SCRIPT_DIR"
if [ $# -ne 1 ]; then
echo "Usage: $0 <version>"
exit 1
fi
version="$1"
# Input ZIP filenames
files=(
"firefox-$version.en-US.win32.zip"
"firefox-$version.en-US.win64-aarch64.zip"
"firefox-$version.en-US.win64.zip"
)
# Corresponding architecture labels and output names
arches=(
"win32"
"arm64"
"x64"
)
# Platform-specific SHA command
if [[ "$(uname)" = "Darwin" ]]; then
shasum_cmd="shasum -a 256"
else
shasum_cmd="sha256sum"
fi
# Clean up any old artifacts
rm -f "$version"-*.zip
# Process whichever arch ZIPs are present
processed=0
for i in "${!files[@]}"; do
file="${files[$i]}"
arch="${arches[$i]}"
temp_zip="xul-temp-$arch.zip"
if [ ! -f "$file" ]; then
continue
fi
dlls=(xul.dll)
# TEMP: Fix startup error on win32 due to missing export numSamples@RLBoxSoundTouch
if [[ $arch == "win32" ]]; then
dlls+=(lgpllibs.dll)
fi
echo "Extracting ${dlls[*]} from $file"
for dll in "${dlls[@]}"; do
unzip -p "$file" "firefox/$dll" > "$dll"
done
zip -q "$temp_zip" "${dlls[@]}"
# Calculate hash
sum=$($shasum_cmd "$temp_zip" | awk '{print $1}')
# Rename to final output
final_zip="$version-$arch-$sum.zip"
mv "$temp_zip" "$final_zip"
rm -f xul.dll lgpllibs.dll
echo "Created $final_zip"
processed=$((processed + 1))
done
if [ $processed -eq 0 ]; then
echo "No firefox-$version.en-US.*.zip files found in $SCRIPT_DIR" >&2
exit 1
fi

Some files were not shown because too many files have changed in this diff Show more