* add PhishingIndexedDbService for IndexedDB storage
Add a dedicated IndexedDB storage service for phishing detection data.
This service provides save, load, and clear operations using IndexedDB
instead of chrome.storage.local to avoid broadcast overhead, size
limitations, and JSON serialization cost for large datasets.
* add unit tests for PhishingIndexedDbService
Add comprehensive tests for save, load, and clear operations with
mocked IndexedDB. Tests cover success cases, error handling, and
database initialization with object store creation.
* add PhishingIndexedDbService core structure
- Add IndexedDB service with per-operation database opening
- Define PhishingUrlRecord type for row storage
- Include clearStore helper for atomic data replacement
- Service worker safe: no cached connections
* add saveUrls with chunked writes
- Add PhishingUrlRecord type for row storage
- Store each URL as individual row
- Chunk writes at 50K per transaction for responsiveness
- Atomic replacement: clear then save
* add hasUrl for lookups
- Direct IndexedDB index lookup via keyPath
- Returns boolean, handles errors gracefully
* add loadAllUrls with cursor iteration
- Cursor-based bulk load for fallback scenarios
- Memory-efficient: no intermediate array duplication
- Returns empty array on error
* add saveUrlsFromStream for memory efficiency
- Stream directly from fetch response body
- Parse newline-delimited URLs incrementally
- Reuse chunked save infrastructure
* update PhishingIndexedDbService tests
- Replace blob-based tests with row-per-URL API tests
- Test saveUrls, hasUrl, loadAllUrls, saveUrlsFromStream
- Verify chunked writes and cursor iteration
- Use stream/web ReadableStream with type cast for Node.js compatibility
* use proper URL syntax and cleanup global state
Update test data to use proper URL syntax with https:// prefix to match
real phishing.database format. Add cleanup of global.indexedDB in
afterEach to prevent test pollution.
* improve stream processing correctness and efficiency
- Move decoder.decode() before done check with { stream: !done } to flush properly
- Use array reassignment instead of splice() for O(1) chunk clearing
- Use single trim via local variable to avoid double-trim
- Centralize URL cleaning in saveChunked(), simplify saveChunk()
- Use explicit urls.length > 0 comparison
* duplicate urls test
* split final buffer by newlines
* add isDeleted check to showUnarchiveBtn and other optionss in vault cipher row
* remove unarchive options from desktop trash, remove archive options in bulk menu for items in trash
* WIP
* add new link styles
* update link stories
* skip default screenshot as variations are covered in other stories
* updated docs and story background
* make default the default linkType value
* remove references to primary link type in CL
* use better bg colors in stories
* remove duplicate linkType
* update aria-disabled text to use new palette
* add back primary link type to story
* fix capitolization
* add backticks to variant names in docs
* remove important from link styles
* fix generic selector to find correct button
* fix capitolization
* mark variants as deprecated in docs
* fix link hover text colors
* add `routeAfterDeletion` for edit screen to redirect the user to the correct location after deleting an archived cipher
* use `historyGo` to preserve the back invocations
* fix duplicate import
* [PM-21774] Adjust icon and tooltip for protected Sends on the Sends list page
* [PM-21774] Update Sent table UI stories
* [PM-21774] Fix Send table UI story
* Add logs for debugging in phishing-detection-settings.service
* Update phishing data service to separate web addresses from meta data for performant writes. Store compressed string instead of array
* Cleanup
* Updated test cases
* Cleanup comments
* Fix fallback encoding/decoding mismatch
* Fix type checking
* initialize timer to null
* default undefined length to 0 using nullish operator
* optional chaining and explicit null check on tab presence
* add optional chainning where relevant for sender tab id
* explicit null checks and data guards set for sender and modifyLoginData
* address feedback and make explicit undefined checks to avoid possible valid tabid rejection
* explicit tab check on setupNotificationInitTrigger
* early return if no cipher before switch case
* explicit null checks within switch cases for early returns
* lower cipher check and add to explicit checks
* add test cases for null values
* format spec file
Migrated vault filters to new v3 vault's navigation
* Decoupled existing vault filtering from vault component by using routed params with routed-vault-filter-bridge
* Converted vault filters to standalone components
* Removed extending filter Base Components from deprecated /libs/angular library and handled logic directly
* Moved shared 'models' and 'services' directories from web-vault into /libs/vault
The goal of this PR is to migrate the Desktop Send-v2 component from the AddEditComponent to now use to shared SendAddEditDialogComponent from @bitwarden/send-ui library
---------
Co-authored-by: William Martin <contact@willmartian.com>
Co-authored-by: Hinton <hinton@users.noreply.github.com>
* last is dead code, remove completely
* pass required true so that angular enforces at runtime and run apply a definitive assignment assertion since angulars input binding is running before use
* [deps] Platform: Update electron-store to v11
* wip-fix: all imports failing due to nodenext switch
* fix: desktop tsconfig not working properly
Renderer tsConfigPath was wrong so it defaulted to the base `tsconfig.json` which
included every single sourcefile into the angular artifact. This caused errors
with ESM modules which behave differently on node and needed a separate `tsconfig.json`
configuration.
* fix: revert some of the changes made to tools code
* fix: ESM import in tests
* chore: use consistent path
* feat: actually use custom tsconfig for preload
* fix: use correct entry point in tsconfig.main.json
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Andreas Coroiu <andreas.coroiu@gmail.com>
Co-authored-by: Andreas Coroiu <acoroiu@bitwarden.com>