Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.5.0</string>
<string>1.6.0</string>
<key>CFBundleVersion</key>
<string>12</string>
<string>13</string>
<key>LSMinimumSystemVersion</key>
<string>14.0</string>
<key>LSUIElement</key>
Expand Down
5 changes: 4 additions & 1 deletion docs/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ If two profiles share a name, repeat these checks for each of them. Chrome title

For settings or shortcut changes, also check that repeated **Settings…** actions reuse one window, a hidden menu-bar avatar does not disable its shortcut, and shortcut conflicts leave the previous assignment intact. Restore only settings changed for the test. Close only windows the test created, and do not remove Chrome profile data.

For tab moves, load the ProfileBar for Chrome development build and move an HTTP page to another Chrome profile. Check that the source tab closes only after the destination opens, and that the setup page and menu give a useful setup path when ProfileBar is unavailable.
For tab moves, load the ProfileBar for Chrome development build and move an HTTP page to another Chrome profile. Check that the source tab closes only after the destination opens, and that the setup page and menu give a useful setup path when ProfileBar is unavailable. Right-click the toolbar icon too: its move items act on the active tab, their destinations grey out on pages such as `chrome://extensions` while **Set up** and **Refresh profiles** stay available, and **Move group to profile** appears only on a tab in a group.
With a Chrome window focused, confirm its own profile is absent from the extension's page and tab destination menus. When Accessibility access is unavailable or the focused window cannot be matched uniquely, confirm all profiles remain visible.

For a group move, right-click a tab inside a group. With the extension installed
Expand All @@ -42,12 +42,15 @@ group closes. Repeat with the extension absent or disabled in the destination:
the URLs should open without a group. If the receiver claims a handoff but
cannot create the group, the source group must stay open. The group items should appear only in windows that have a tab group.

In Chrome 155 or later, move either half of a split view from the tab strip, then a group that contains a split. Both halves should move, and with the extension in the destination they should arrive split. Without it, or in older Chrome, they arrive as separate tabs.

If two profiles share a name, the extension's setup page should show a **Rename** button for each. A button should open `chrome://settings/manageProfile` in that profile when the extension is installed there, and otherwise explain how to rename it by hand.

For link routing, load the development extension in at least two profiles, choose **Identify profiles**, and use ProfileBar Dev's own rules file (`~/Library/Application Support/ProfileBar Dev/link-routing.json`) with throwaway sites such as `example.com`. Then check that:

- A link from another app (`open -a "Google Chrome" <url>`) that a rule assigns elsewhere opens in that profile, and the source tab closes.
- Links that a page opens in new tabs move the same way. Popup windows, navigation inside a tab, and links that match no rule stay put.
- A tab reopened with Cmd+Shift+T, a duplicated tab, and a link opened with **Open link in split view** stay in their profile.
- A tab that ProfileBar opens in a profile, whether routed, moved, or part of a moved group, loads once and is never routed again.
- With a profile chosen under **Open other links from apps in**, a link from another app that matches no rule opens there, while a link that a page opens with no matching rule stays put.
- Clearing **Other apps** or **Web pages** stops routing from that source, and edits in Settings and on the options page reach every profile.
Expand Down
13 changes: 9 additions & 4 deletions extension/PRIVACY.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
# ProfileBar for Chrome Privacy Policy

Effective date: 2 November 2026
Effective date: 5 November 2026

ProfileBar for Chrome reads tab URLs when you choose a move action from its
right-click menu, and when a new tab opens if you use link routing. For a move,
it reads the clicked tab, the highlighted tabs, or the
tabs in the chosen group. For a group move, it also reads the group's title,
colour, and collapsed state. To show the group actions only when they apply, it
checks whether the focused window has any tab group, which reads no URLs.
checks whether the focused window has any tab group, which reads no URLs. To
show only the toolbar icon's actions that apply, it checks the active tab's URL
and group when you switch tabs or the tab changes, on your Mac. When you move
one half of a split view from the tab strip, it also reads the other half so
both move together.

Link routing reads the URL of each new tab, and any redirect in its first
moments, and compares it with your rules on your Mac. It never reads the tabs
Expand Down Expand Up @@ -47,14 +51,15 @@ Store User Data Policy, including the Limited Use requirements.
## Permissions

- `contextMenus` adds the move actions and **Always open this site in** to the
right-click menus.
right-click menus and the toolbar icon's menu.
- `declarativeNetRequest` holds back a new tab's page load while link routing
moves it, so the site is not loaded twice. Its rules come only from your
link-routing rules and apply only to new tabs.
- `nativeMessaging` connects to ProfileBar on this Mac.
- `storage` remembers which profile directory this copy of the extension runs in.
- `tabs` reads the URLs of the tabs you choose to move and closes them after a
successful move.
successful move. It also checks the active tab's URL and group to show only
the toolbar actions that apply, and which tabs share a split view.
- `tabGroups` reads a chosen group's visible details and recreates them in the
destination profile, and checks whether the focused window has a group.
- `webNavigation` tells link routing which new tabs a web page opened, so the
Expand Down
44 changes: 36 additions & 8 deletions extension/STORE_LISTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,17 @@

Keep work, personal, and side project pages in the profile where they belong.
Right-click a page, choose **Move tab to profile**, and pick a destination. The
page opens there, and the original tab closes once the move succeeds.
page opens there, and the original tab closes once the move succeeds. The
extension's toolbar icon offers the same moves for the tab you're on, including
its whole group.

In Chrome 150 and later, right-click a tab to move it, move several selected
tabs together in tab order, or move a whole tab group. When this extension is
also installed in the destination profile, the group keeps its name, colour,
and collapsed state. Otherwise, the pages still open in the chosen profile
without a group.
without a group. Moving either half of a split view from the tab strip moves
both. With ProfileBar 1.6, Chrome 155 or later, and this extension in the
destination profile, they open side by side again.

Link routing opens new tabs in the profile you choose for each site, without
making anything your default browser. Add rules on the options page, in
Expand Down Expand Up @@ -61,7 +65,8 @@ own rules, through the local ProfileBar app.
**Permission justifications:**

- `contextMenus`: Show the move actions and destination profiles in the page
and tab right-click menus, and **Always open this site in** on pages.
and tab right-click menus and the toolbar icon's menu, and **Always open this
site in** on pages.
- `declarativeNetRequest`: Hold back the page load of a new tab that a
link-routing rule assigns to another profile, so the site does not load in
both profiles. The session rules come only from the user's link-routing rules
Expand All @@ -78,8 +83,10 @@ own rules, through the local ProfileBar app.
- `tabs`: Read the URLs of the clicked, selected, or grouped tabs when the user
chooses a move action, then close those tabs after a successful move. Read
the first URL of each new tab to check it against the user's link-routing
rules, and close it once another profile has opened it. Tabs that were
already open and navigation inside a tab are never read.
rules, and close it once another profile has opened it. Read the active
tab's URL and group to show only the toolbar actions that apply, and which
tabs share a split view so a split moves together. Tabs that were already
open and navigation inside a tab are never read for link routing.
- `tabGroups`: Read the chosen group's title, colour, and collapsed state, then
recreate them in the destination profile. Check whether the focused window
has a tab group, without reading URLs, to show the group actions only when
Expand All @@ -95,8 +102,9 @@ activity. It reads selected tabs when the user chooses a move action, and the
first URL of new tabs to compare with the user's link-routing rules on the
device. It sends URLs only to the ProfileBar app on the same device, and only
for a move action, a rule that names another profile, or the profile the user
chose for links from other apps that match no rule. Neither component
retains them or collects other user data.
chose for links from other apps that match no rule. To show only the toolbar
actions that apply, it also checks the active tab's URL and group on the
device. Neither component retains them or collects other user data.

Certify the limited-use declarations in the Dashboard. Check the Dashboard's
current wording before submission because Google may change the available data
Expand All @@ -118,7 +126,7 @@ Moving tabs needs the ProfileBar app on macOS and at least two Chrome profiles.

1. Install the extension before ProfileBar. The setup page should explain how
to connect, and the right-click menu should offer **Set up ProfileBar…**.
2. Install ProfileBar 1.5 or later from https://afrojun.dev/profilebar/ and
2. Install ProfileBar 1.6 or later from https://afrojun.dev/profilebar/ and
open it once. Choose **Check again** on the setup page. It should report
**Connected**.
3. Right-click a normal HTTPS page, choose **Move tab to profile**, and select
Expand All @@ -133,6 +141,26 @@ Moving tabs needs the ProfileBar app on macOS and at least two Chrome profiles.
options page. Add the rule `example.com` for the other profile, then open
`https://example.com` in a new tab. Confirm it opens in the other profile
and the new tab closes.
7. In the first profile, type `https://example.com` into an existing tab's
address bar, which link routing leaves alone. Close that tab and press
Cmd+Shift+T. Confirm it reopens in the same profile.
8. Right-click the extension's toolbar icon on an HTTPS page. Confirm **Move
tab to profile** and **Always open this site in** work, that **Move group to
profile** appears only on a tab in a group, and that the destinations are
greyed out on `chrome://extensions`.
9. In Chrome 155 or later, put two HTTPS tabs in a split view, right-click
either half in the tab strip, and move it. Confirm both open side by side in
the other profile.

Condensed version for the Dashboard:

> Needs macOS, two Chrome profiles, and ProfileBar 1.6+ from
> https://afrojun.dev/profilebar/ (open it once). Install the extension in both
> profiles and choose Identify profiles on its options page. Right-click a page,
> a tab, or the toolbar icon and choose Move tab to profile. Add the rule
> example.com for the other profile, then open https://example.com in a new tab:
> it opens there. A tab reopened with Cmd+Shift+T stays put. In Chrome 155+, a
> split view moved from the tab strip arrives split.

## Assets

Expand Down
2 changes: 1 addition & 1 deletion extension/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "ProfileBar for Chrome",
"version": "1.1.0",
"version": "1.2.0",
"description": "Move tabs and groups to another Chrome profile, and open links in the right profile automatically. Requires ProfileBar for Mac.",
"minimum_chrome_version": "116",
"icons": {
Expand Down
Loading