From 0337140860e106283ca32ae0fe2d2516c4186b08 Mon Sep 17 00:00:00 2001 From: EmiliaPaz Date: Wed, 24 Jan 2024 13:58:24 -0800 Subject: [PATCH 01/10] Add permissions.requestSiteAccess() API proposal --- ...missions-requestSiteAccess-chrome-menu.png | Bin 0 -> 40143 bytes ...sions-requestSiteAccess-chrome-toolbar.png | Bin 0 -> 6126 bytes .../permissions-requestSiteAccess-api.md | 135 ++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 proposals/assets/permissions-requestSiteAccess-chrome-menu.png create mode 100644 proposals/assets/permissions-requestSiteAccess-chrome-toolbar.png create mode 100644 proposals/permissions-requestSiteAccess-api.md diff --git a/proposals/assets/permissions-requestSiteAccess-chrome-menu.png b/proposals/assets/permissions-requestSiteAccess-chrome-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbcb40bb9456f693a0101ed2b5c593960dad26f GIT binary patch literal 40143 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 E0MF~w4gdfE literal 0 HcmV?d00001 diff --git a/proposals/assets/permissions-requestSiteAccess-chrome-toolbar.png b/proposals/assets/permissions-requestSiteAccess-chrome-toolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..03de1f50cd35571f80a2b19736e71e29292a8bb5 GIT binary patch literal 6126 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.permissions.request()` +- Manifest declared `matches` for a `content_script`, granted at install time by default + +Users can withhold host permissions, causing the extension to only have access when the extension is [invoked](https://developer.chrome.com/docs/extensions/develop/concepts/activeTab#invoking-activeTabhttps://developer.chrome.com/docs/extensions/develop/concepts/activeTab#invoking-activeTab). + +Each browser may decide how it signals the user when an extension is requesting access (e.g through the extensions menu). However, there is no way for an extension to explicitly signal at runtime it’s requesting site access after it was withheld without a user gesture and a heavy-weight permission dialog. + + +### Objective + +Allow the extension to show site access requests at runtime without any user gesture in a less-obtrusive way than with permissions.request(). This can be done with a new API that: + +- Applies to a specific tab or document id +- Doesn’t need to be made inside the handler for a user action +- Shows the request in the UI, handled differently by each browser. See more in [UI Elements and User-Visible Effects](#ui-elements-and-user-visible\-effects) section +- When accepted, grants always access to the site’s origin +- Resets the request on cross-origin navigation + +#### Use Cases + +An extension requested access to a site but the user withheld its access and forgot about it. Extension wants to signal it needs site access to execute. For example, “shopping” extension wants to show site access when user navigates to “amazon.com” and access was withheld. + +### Consumers + +Extensions that want to signal the user when they need site access. + +## Implementation + +### API Schema + +``` +// Requests access to a specific tab or document. Access request will only be +// signaled to the user if requesting access to a site the extension can be +// granted access to (i.e., one specified in host_permissions, +// optional_host_permissions, a content script match pattern, or an applicable +// activeTab site). +// Only one of tabId or documentId must be declared. Request will be +// automatically reset on navigation. +.permissions.requestSiteAccess( + // The id of the tab where site access requests can be shown. + number?: tabId, + // The id of a document where site access requests can be shown. + string?: documentId, + callback?: function +); +``` + +Note: We don’t support iframes since they are not included in the runtime host permissions UI. + +### New Permissions +| Permission Added | Proposed Warning | +| ---------------- | -------------------------------------------------------- | +| N/A | Permission’s API is used to “request declared optional permissions at run time rather than install time, so users understand why the permissions are needed and grant only those that are necessary” (according to documentation). The goal of this new method is for the extension to request site access, which is effectively a permission. We can adjust the description to not be restricted just to optional permissions. | + +#### Other Alternatives considered + +Action API is used to control the extension’s button in the browser’s toolbar. It’s exposed if the extension includes the "action" key in the manifest. This is troublesome since an extension could not have an action, but still want to show site access requests. We should not limit requests for extensions with actions. + +### Manifest Changes + +None. + +### Custom Bindings + +None. + +### Design and Implementation + +#### Persistence + +Showing a site access request is never persisted. + +#### Alignment with Other Vendors and Action APIs + +Each browser can decide how they want to signal the extension site access requests. Browsers may decide to ignore the request (e.g due to noisiness, or if an extension has no visible UI). +On Chrome’s side, we are exploring adding an ‘Allow’ chip in the extensions toolbar. + +## User Experience + +### UI Elements and User Visible-Effects + +Each browser will handle the request as desired. On Chrome’s side, we are considering showing an ‘Allow’ button in the toolbar for these requests. On click, it would grant persistent access to the site’s origin (which can be again withheld by the user) + +!["Site access request on Chrome toolbar"](./assets/permissions-requestSiteAccess-chrome-toolbar.png) + +We would also provide a way for users to silence the requests for an extension through a setting in the extensions menu and in chrome://extensions. + +!["Extensions menu on Chrome"](./assets/permissions-requestSiteAccess-chrome-menu.png) + +#### Attribution +The site access request will be attributed directly to the extension. + +## Security and Privacy + +### Exposed Sensitive Data + +This API does not directly expose any sensitive data to the extension. However, it could lead to the extension gaining access to the site. + +### Abuse Scenarios + +Extensions can enable site access requests on every tab, which could be annoying to the user. + +#### Mitigations +Attacks of annoyance are not in our threat model. Extensions can have annoying behaviors, but they risk uninstallation. +On the browser side, we can place some restrictions to limit noisiness: +- User can decide whether they want to see site access requests for an specific extension +- We can explore setting a max amount of times the request is shown when the user ignores it. + +### Additional Security Considerations +None + +## Alternatives + +### Existing Workarounds + +Currently, extensions have site access by default. Users can change the site access to be when clicked. The only way for extensions to signal the user they want access to the site is through permissions.request() flow which is noisy and requires a user gesture. Otherwise, they rely on the user realizing through the browser UI (e.g extensions menu). + +Extensions have no way to signal the user that they want access to the site, and rely on the user realizing through the browser UI (e.g extensions menu) + +### Other Alternatives Considered + +Specifying URL patterns instead of tabId or documentId in `permissions.requestSiteAccess`. We decided against that because: +- This is designed to be a highly-contextual signal -- the extension should do it only if they have strong believe they will provide value to the user on the given page +- We do not want extensions to simply show a request on every page, and specifying a list of patterns would lend itself to that behavior + +### Open Web API +This is related to the extensions showing site access requests in the browser; it doesn't affect the web. From ce54af531d5f56f1f086676568a1e05f73288224 Mon Sep 17 00:00:00 2001 From: Emilia Paz Date: Wed, 31 Jan 2024 14:56:05 -0800 Subject: [PATCH 02/10] Update existing workaround to be more browser inclusive --- proposals/permissions-requestSiteAccess-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/permissions-requestSiteAccess-api.md b/proposals/permissions-requestSiteAccess-api.md index b740c620..8704e286 100644 --- a/proposals/permissions-requestSiteAccess-api.md +++ b/proposals/permissions-requestSiteAccess-api.md @@ -121,7 +121,7 @@ None ### Existing Workarounds -Currently, extensions have site access by default. Users can change the site access to be when clicked. The only way for extensions to signal the user they want access to the site is through permissions.request() flow which is noisy and requires a user gesture. Otherwise, they rely on the user realizing through the browser UI (e.g extensions menu). +Users can change an extension's site access. The only way for extensions to signal the user they want to regain access to the site is through permissions.request() flow which is noisy and requires a user gesture. Otherwise, they rely on the user realizing through the browser UI (e.g extensions menu). Extensions have no way to signal the user that they want access to the site, and rely on the user realizing through the browser UI (e.g extensions menu) From 3a11106724b198e3e60aa84db397ec8d3e386b1d Mon Sep 17 00:00:00 2001 From: Emilia Paz Date: Wed, 7 Feb 2024 15:10:17 -0800 Subject: [PATCH 03/10] Update proposal based on comment threads - Update Background section to take into account different browser's behavior - Update Other Alternatives Considered section to explain in better detailed why Chrome is not supportive of declarative urls --- proposals/permissions-requestSiteAccess-api.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/proposals/permissions-requestSiteAccess-api.md b/proposals/permissions-requestSiteAccess-api.md index 8704e286..5edec717 100644 --- a/proposals/permissions-requestSiteAccess-api.md +++ b/proposals/permissions-requestSiteAccess-api.md @@ -9,24 +9,24 @@ Extensions can request host permissions via: - Manifest declared `optional_host_permissions`, granted at runtime after a user gesture by `.permissions.request()` - Manifest declared `matches` for a `content_script`, granted at install time by default -Users can withhold host permissions, causing the extension to only have access when the extension is [invoked](https://developer.chrome.com/docs/extensions/develop/concepts/activeTab#invoking-activeTabhttps://developer.chrome.com/docs/extensions/develop/concepts/activeTab#invoking-activeTab). +In some browsers, users can withhold host permissions causing the extension to only have site access when the extension is invoked. For example, in Chrome a user can set an extension to run only "on click". When the extension is clicked, it gains site access to the tab's main frame origin (effectively acting like [`activeTab` permission](https://developer.chrome.com/docs/extensions/develop/concepts/activeTab#what-activeTab-allows). Each browser may decide how it signals the user when an extension is requesting access (e.g through the extensions menu). However, there is no way for an extension to explicitly signal at runtime it’s requesting site access after it was withheld without a user gesture and a heavy-weight permission dialog. ### Objective -Allow the extension to show site access requests at runtime without any user gesture in a less-obtrusive way than with permissions.request(). This can be done with a new API that: +Allow the extension to show site access requests at runtime without any user gesture in a less-obtrusive way than with `permissions.request()`. This can be done with a new API that: - Applies to a specific tab or document id - Doesn’t need to be made inside the handler for a user action - Shows the request in the UI, handled differently by each browser. See more in [UI Elements and User-Visible Effects](#ui-elements-and-user-visible\-effects) section -- When accepted, grants always access to the site’s origin +- When accepted, grants always access to the site’s top origin - Resets the request on cross-origin navigation #### Use Cases -An extension requested access to a site but the user withheld its access and forgot about it. Extension wants to signal it needs site access to execute. For example, “shopping” extension wants to show site access when user navigates to “amazon.com” and access was withheld. +An extension requested access to a site but the user withheld its access and forgot about it. Extension wants to signal it needs site access to execute without user action. For example, “shopping” extension wants to show site access when user navigates to “amazon.com” and access was withheld. ### Consumers @@ -62,7 +62,7 @@ Note: We don’t support iframes since they are not included in the runtime host #### Other Alternatives considered -Action API is used to control the extension’s button in the browser’s toolbar. It’s exposed if the extension includes the "action" key in the manifest. This is troublesome since an extension could not have an action, but still want to show site access requests. We should not limit requests for extensions with actions. +Action API is used to control the extension’s button in the browser’s toolbar. It’s exposed if the extension includes the "action" key in the manifest. This is troublesome since an extension could not have an action, but still want to show site access requests. We should not limit requests for extensions with actions ### Manifest Changes @@ -127,9 +127,10 @@ Extensions have no way to signal the user that they want access to the site, and ### Other Alternatives Considered -Specifying URL patterns instead of tabId or documentId in `permissions.requestSiteAccess`. We decided against that because: -- This is designed to be a highly-contextual signal -- the extension should do it only if they have strong believe they will provide value to the user on the given page -- We do not want extensions to simply show a request on every page, and specifying a list of patterns would lend itself to that behavior +Specifying URL patterns instead of tabId or documentId in `permissions.requestSiteAccess` or in the extension's manifest. We decided against that because: +- This is designed to be a highly-contextual signal. The extension should do it only if they have strong believe they will provide value to the user on the given page. This should not be a passive, "hey, I think I can do something here", it should be a "hey, you, the user, probably want me to do something here". +- We do not want extensions to simply show a request on every page, and specifying a list of patterns would lend itself to that behavior (even by not allowing broad match patterns). +- It's too close to host permissions themselves. We suspect that the vast majority of extensions would just have the same field match as in their host permissions, since there is no more knowledge at manifest time about why the extension would run on a specific site. ### Open Web API This is related to the extensions showing site access requests in the browser; it doesn't affect the web. From c1d2c839051c36e5d5f860d22d5ca3eb61b2d304 Mon Sep 17 00:00:00 2001 From: Emilia Paz Date: Wed, 28 Feb 2024 14:46:48 -0800 Subject: [PATCH 04/10] Add url option parameter and return value Proposal has been updated so it can fit every browsers model by adding a url option parameter, with this requirements: - In Chrome, we can require tab ID or document ID, but not `url`. - In Safari, they can require `url`, but not `tabId` or `documentId`. - If both are provided, they'll both be respected. It also adds a method to remove the request and specifies when the methods resolve --- .../permissions-requestSiteAccess-api.md | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/proposals/permissions-requestSiteAccess-api.md b/proposals/permissions-requestSiteAccess-api.md index 5edec717..f7fcd0c8 100644 --- a/proposals/permissions-requestSiteAccess-api.md +++ b/proposals/permissions-requestSiteAccess-api.md @@ -37,19 +37,42 @@ Extensions that want to signal the user when they need site access. ### API Schema ``` -// Requests access to a specific tab or document. Access request will only be -// signaled to the user if requesting access to a site the extension can be -// granted access to (i.e., one specified in host_permissions, -// optional_host_permissions, a content script match pattern, or an applicable -// activeTab site). -// Only one of tabId or documentId must be declared. Request will be -// automatically reset on navigation. -.permissions.requestSiteAccess( - // The id of the tab where site access requests can be shown. +// Shows a site access request. Request will only be signaled to the user if +// extension can be granted access to site in the request (i.e., one specified +// in host_permissions, optional_host_permissions, a content script match +// pattern, or an applicable activeTab site). +// Resolves whether the request is valid and is signaled to the user. +Promise .permissions.showSiteAccessRequest( + // The id of the tab where site access requests can be shown. If provided, + // the request is shown on the specified tab and is removed when the tab + // navigates to a new origin. + // Chrome requires either this or `documentId` to be specified. number?: tabId, - // The id of a document where site access requests can be shown. + // The id of a document where site access requests can be shown. Must be + // the top-level document within a tab. If provided, the request is shown on + // the tab of the specified document and is removed when the document + // navigates to a new origin. + // Chrome requires either this or `tabId` to be specified. string?: documentId, - callback?: function + // The URL pattern where site access requests can be shown. If provided, + // site access requests will only be shown on URLs that match this pattern. + // Browsers may require different levels of specificity. + string?: url + callback?: function, +); + +// Removes a site access request, if existent. +// Resolves whther the request was removed. +Promise .permissions.removeSiteAccessRequest( + // The id of the tab where site access request will be removed. + // Chrome requires either this or `documentId` to be specified. + number?: tabId, + // The id of a document where site access request will be removed. + // Chrome requires either this or `tabId` to be specified. + string?: documentId, + // The URL pattern where site access request will be removed. + string?: url + callback?: function, ); ``` @@ -62,7 +85,8 @@ Note: We don’t support iframes since they are not included in the runtime host #### Other Alternatives considered -Action API is used to control the extension’s button in the browser’s toolbar. It’s exposed if the extension includes the "action" key in the manifest. This is troublesome since an extension could not have an action, but still want to show site access requests. We should not limit requests for extensions with actions +- Action API is used to control the extension’s button in the browser’s toolbar. It’s exposed if the extension includes the "action" key in the manifest. This is troublesome since an extension could not have an action, but still want to show site access requests. We should not limit requests for extensions with actions +- `permissions.showSiteAccessRequest()` resolves when request is accepted/rejected. An extension could be requesting site access and be granted site access through another mechanism (e.g changing site access in the extensions menu). We would either return a) true if we consider permissions granted through other mechanisms or b) false, because permission wasn't explicitely granted through the request. a) adds complexity and b) may cause confusion. Thus, we consider better to resolve whether the request is valid, and separately extension can listen whether permission is granted through `permissions.onAdded()`. ### Manifest Changes From f3ec64f8802693936b69bd3ea38d4d98bc3ddfea Mon Sep 17 00:00:00 2001 From: Emilia Paz Date: Thu, 29 Feb 2024 08:13:41 -0800 Subject: [PATCH 05/10] Change title --- proposals/permissions-requestSiteAccess-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/permissions-requestSiteAccess-api.md b/proposals/permissions-requestSiteAccess-api.md index f7fcd0c8..712b5fec 100644 --- a/proposals/permissions-requestSiteAccess-api.md +++ b/proposals/permissions-requestSiteAccess-api.md @@ -1,4 +1,4 @@ -# permissions.requestSiteAccess() API +# permissions.showSiteAccessRequest() API ## API Overview From 97adc544b34e2d63b0dda2af07039db836f7c533 Mon Sep 17 00:00:00 2001 From: Emilia Paz Date: Mon, 4 Mar 2024 14:42:15 -0800 Subject: [PATCH 06/10] Address comments after 02/29 WECG meeting - Change name to `permissions.addSiteAccessRequest()` - Fix API comments --- proposals/permissions-requestSiteAccess-api.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/proposals/permissions-requestSiteAccess-api.md b/proposals/permissions-requestSiteAccess-api.md index 712b5fec..c3fcfce9 100644 --- a/proposals/permissions-requestSiteAccess-api.md +++ b/proposals/permissions-requestSiteAccess-api.md @@ -1,4 +1,4 @@ -# permissions.showSiteAccessRequest() API +# permissions.[add/remove]SiteAccessRequest() API ## API Overview @@ -37,12 +37,12 @@ Extensions that want to signal the user when they need site access. ### API Schema ``` -// Shows a site access request. Request will only be signaled to the user if +// Adds a site access request. Request will only be signaled to the user if // extension can be granted access to site in the request (i.e., one specified // in host_permissions, optional_host_permissions, a content script match // pattern, or an applicable activeTab site). -// Resolves whether the request is valid and is signaled to the user. -Promise .permissions.showSiteAccessRequest( +// Resolves whether the request is valid. +Promise .permissions.addSiteAccessRequest( // The id of the tab where site access requests can be shown. If provided, // the request is shown on the specified tab and is removed when the tab // navigates to a new origin. @@ -86,7 +86,7 @@ Note: We don’t support iframes since they are not included in the runtime host #### Other Alternatives considered - Action API is used to control the extension’s button in the browser’s toolbar. It’s exposed if the extension includes the "action" key in the manifest. This is troublesome since an extension could not have an action, but still want to show site access requests. We should not limit requests for extensions with actions -- `permissions.showSiteAccessRequest()` resolves when request is accepted/rejected. An extension could be requesting site access and be granted site access through another mechanism (e.g changing site access in the extensions menu). We would either return a) true if we consider permissions granted through other mechanisms or b) false, because permission wasn't explicitely granted through the request. a) adds complexity and b) may cause confusion. Thus, we consider better to resolve whether the request is valid, and separately extension can listen whether permission is granted through `permissions.onAdded()`. +- `permissions.addSiteAccessRequest()` resolves when request is accepted/rejected. An extension could be requesting site access and be granted site access through another mechanism (e.g changing site access in the extensions menu). We would either return a) true if we consider permissions granted through other mechanisms or b) false, because permission wasn't explicitely granted through the request. a) adds complexity and b) may cause confusion. Thus, we consider better to resolve whether the request is valid, and separately extension can listen whether permission is granted through `permissions.onAdded()`. ### Manifest Changes @@ -145,13 +145,13 @@ None ### Existing Workarounds -Users can change an extension's site access. The only way for extensions to signal the user they want to regain access to the site is through permissions.request() flow which is noisy and requires a user gesture. Otherwise, they rely on the user realizing through the browser UI (e.g extensions menu). +Users can change an extension's site access. The only way for extensions to signal the user they want to regain access to the site is through `permissions.request()` flow which is noisy and requires a user gesture. Otherwise, they rely on the user realizing through the browser UI (e.g extensions menu). Extensions have no way to signal the user that they want access to the site, and rely on the user realizing through the browser UI (e.g extensions menu) ### Other Alternatives Considered -Specifying URL patterns instead of tabId or documentId in `permissions.requestSiteAccess` or in the extension's manifest. We decided against that because: +Specifying URL patterns instead of tabId or documentId in `permissions.addSiteAccessRequest` or in the extension's manifest. We decided against that because: - This is designed to be a highly-contextual signal. The extension should do it only if they have strong believe they will provide value to the user on the given page. This should not be a passive, "hey, I think I can do something here", it should be a "hey, you, the user, probably want me to do something here". - We do not want extensions to simply show a request on every page, and specifying a list of patterns would lend itself to that behavior (even by not allowing broad match patterns). - It's too close to host permissions themselves. We suspect that the vast majority of extensions would just have the same field match as in their host permissions, since there is no more knowledge at manifest time about why the extension would run on a specific site. From db2642b60bae3fe2173d3456d0228252f2adb6dc Mon Sep 17 00:00:00 2001 From: Emilia Paz Date: Mon, 11 Mar 2024 15:12:52 -0500 Subject: [PATCH 07/10] Small typos in proposal --- proposals/permissions-requestSiteAccess-api.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/proposals/permissions-requestSiteAccess-api.md b/proposals/permissions-requestSiteAccess-api.md index c3fcfce9..a8c26895 100644 --- a/proposals/permissions-requestSiteAccess-api.md +++ b/proposals/permissions-requestSiteAccess-api.md @@ -42,7 +42,7 @@ Extensions that want to signal the user when they need site access. // in host_permissions, optional_host_permissions, a content script match // pattern, or an applicable activeTab site). // Resolves whether the request is valid. -Promise .permissions.addSiteAccessRequest( +Promise<{bool}> .permissions.addSiteAccessRequest( // The id of the tab where site access requests can be shown. If provided, // the request is shown on the specified tab and is removed when the tab // navigates to a new origin. @@ -57,7 +57,7 @@ Promise .permissions.addSiteAccessRequest( // The URL pattern where site access requests can be shown. If provided, // site access requests will only be shown on URLs that match this pattern. // Browsers may require different levels of specificity. - string?: url + string?: pattern callback?: function, ); @@ -71,7 +71,7 @@ Promise .permissions.removeSiteAccessRequest( // Chrome requires either this or `tabId` to be specified. string?: documentId, // The URL pattern where site access request will be removed. - string?: url + string?: pattern callback?: function, ); ``` @@ -81,7 +81,7 @@ Note: We don’t support iframes since they are not included in the runtime host ### New Permissions | Permission Added | Proposed Warning | | ---------------- | -------------------------------------------------------- | -| N/A | Permission’s API is used to “request declared optional permissions at run time rather than install time, so users understand why the permissions are needed and grant only those that are necessary” (according to documentation). The goal of this new method is for the extension to request site access, which is effectively a permission. We can adjust the description to not be restricted just to optional permissions. | +| N/A | Permissions API is used to “request declared optional permissions at run time rather than install time, so users understand why the permissions are needed and grant only those that are necessary” (according to documentation). The goal of this new method is for the extension to request site access, which is effectively a permission. We can adjust the description to not be restricted just to optional permissions. | #### Other Alternatives considered From 42e10b03d693062d3d2020c0995e3d02188b1467 Mon Sep 17 00:00:00 2001 From: Emilia Paz Date: Mon, 11 Mar 2024 16:20:30 -0500 Subject: [PATCH 08/10] Add inactive tab behavior --- proposals/permissions-requestSiteAccess-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/permissions-requestSiteAccess-api.md b/proposals/permissions-requestSiteAccess-api.md index a8c26895..01955b08 100644 --- a/proposals/permissions-requestSiteAccess-api.md +++ b/proposals/permissions-requestSiteAccess-api.md @@ -18,7 +18,7 @@ Each browser may decide how it signals the user when an extension is requesting Allow the extension to show site access requests at runtime without any user gesture in a less-obtrusive way than with `permissions.request()`. This can be done with a new API that: -- Applies to a specific tab or document id +- Applies to a specific tab or document id. Developers can specify inactive tabs (request will be shown by the browser when the user activated them). - Doesn’t need to be made inside the handler for a user action - Shows the request in the UI, handled differently by each browser. See more in [UI Elements and User-Visible Effects](#ui-elements-and-user-visible\-effects) section - When accepted, grants always access to the site’s top origin From e8431e9747224d6ef567cf091f13c6dbafad9862 Mon Sep 17 00:00:00 2001 From: Emilia Paz Date: Wed, 20 Mar 2024 15:59:07 -0500 Subject: [PATCH 09/10] Apply suggestions from code review Co-authored-by: Rob Wu --- proposals/permissions-requestSiteAccess-api.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/proposals/permissions-requestSiteAccess-api.md b/proposals/permissions-requestSiteAccess-api.md index 01955b08..035fc3b8 100644 --- a/proposals/permissions-requestSiteAccess-api.md +++ b/proposals/permissions-requestSiteAccess-api.md @@ -42,7 +42,7 @@ Extensions that want to signal the user when they need site access. // in host_permissions, optional_host_permissions, a content script match // pattern, or an applicable activeTab site). // Resolves whether the request is valid. -Promise<{bool}> .permissions.addSiteAccessRequest( +Promise browser.permissions.addSiteAccessRequest({ // The id of the tab where site access requests can be shown. If provided, // the request is shown on the specified tab and is removed when the tab // navigates to a new origin. @@ -57,13 +57,14 @@ Promise<{bool}> .permissions.addSiteAccessRequest( // The URL pattern where site access requests can be shown. If provided, // site access requests will only be shown on URLs that match this pattern. // Browsers may require different levels of specificity. - string?: pattern + string?: pattern, +}, callback?: function, ); // Removes a site access request, if existent. // Resolves whther the request was removed. -Promise .permissions.removeSiteAccessRequest( +Promise browser.permissions.removeSiteAccessRequest({ // The id of the tab where site access request will be removed. // Chrome requires either this or `documentId` to be specified. number?: tabId, @@ -71,7 +72,8 @@ Promise .permissions.removeSiteAccessRequest( // Chrome requires either this or `tabId` to be specified. string?: documentId, // The URL pattern where site access request will be removed. - string?: pattern + string?: pattern, +}, callback?: function, ); ``` From 5267c8cdd82531824da1b293a33c956df419e6bb Mon Sep 17 00:00:00 2001 From: Emilia Paz Date: Wed, 20 Mar 2024 16:05:31 -0500 Subject: [PATCH 10/10] Update 'Other alternatives considered' with url pattern usage --- proposals/permissions-requestSiteAccess-api.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/proposals/permissions-requestSiteAccess-api.md b/proposals/permissions-requestSiteAccess-api.md index 035fc3b8..4cf860cb 100644 --- a/proposals/permissions-requestSiteAccess-api.md +++ b/proposals/permissions-requestSiteAccess-api.md @@ -153,10 +153,11 @@ Extensions have no way to signal the user that they want access to the site, and ### Other Alternatives Considered -Specifying URL patterns instead of tabId or documentId in `permissions.addSiteAccessRequest` or in the extension's manifest. We decided against that because: +Specifying URL patterns in the extension's manifest. We decided against that because: - This is designed to be a highly-contextual signal. The extension should do it only if they have strong believe they will provide value to the user on the given page. This should not be a passive, "hey, I think I can do something here", it should be a "hey, you, the user, probably want me to do something here". - We do not want extensions to simply show a request on every page, and specifying a list of patterns would lend itself to that behavior (even by not allowing broad match patterns). - It's too close to host permissions themselves. We suspect that the vast majority of extensions would just have the same field match as in their host permissions, since there is no more knowledge at manifest time about why the extension would run on a specific site. +That being said, each browser a URL pattern can be specified in `permissions.addSiteAccessRequest`. Each browser can determine whether other parameters must be specified apart from the URL pattern. ### Open Web API This is related to the extensions showing site access requests in the browser; it doesn't affect the web.