Closed Bug 1609920 Opened 5 years ago Closed 4 years ago

Allow WebExtensions Framework to register a moz-extension:// script as a service worker

Categories

(WebExtensions :: General, enhancement, P1)

enhancement

Tracking

(firefox80 fixed)

RESOLVED FIXED
mozilla80
Tracking Status
firefox80 --- fixed

People

(Reporter: rpl, Assigned: rpl)

References

(Blocks 3 open bugs)

Details

Attachments

(4 files, 1 obsolete file)

This issue is part of the blockers for Bug 1573659 (tracker for the manifest v3 background.service_worker implementation).

Part of this issue goals:

  • allow the WebExtensions Framework to ensure that the extension background.service_worker is registered (possibly without creating a webextension page to register it using the WebAPI exposed to the webpages, window.navigator.serviceWorker.register)

  • add the background.service_worker property definition to the manifest's JSON schema, and lock it behind a preference (and set it to be disallowed by default)

  • ensure that the moz-extension:// service worker are being spawned only in child processes with the "extension" remoteType

  • allow the WebExtensions Framework to be sure that all the moz-extensions:// workers are being terminated while the related extension is shutting down

non-goals for this issue:

  • allow an extension to register its own moz-extension:// service workers (tracked by Bug 1344561, will be evaluated separately, in the meantime this issue should lock that ability behind a separate about:config preference which disallow it by default)

  • provide WebExtension APIs bindings to the background service worker (which is going to be tracked by a separate bugzilla issue, Bug 1609923)

Blocks: 1609923
Assignee: nobody → lgreco
Status: NEW → ASSIGNED
Priority: -- → P1
  • Adds the new about:config pref "extensions.backgroundServiceWorker.enabled" (currently defaults to false).
  • Adds the background.service_worker property to the manifest JSON schema definition
  • Locks background.service_worker manifest property behind the new preference
  • Adds a new BackgroundWorker class to ext-backgroundPage.js (responsible for managing the background
    service worker for the extension, e.g. make sure that the expected worker script is registered
    as expected when the extension is starting up)
  • Adds to the ServiceWorkerManager a new method to allow the WebExtension Framework to register the
    background service worker without an existing extension page
  • Allows the "moz-extension" schema in the dom/serviceworkers and dom/cache internals
  • Adds a new "extensions.serviceWorkerRegister.allowed" pref (defaults to false)
  • Makes ServiceWorkerContainer::Register to throw NS_ERROR_DOM_SECURITY_ERR if the
    script url is a moz-extension url and the caller is a non-system caller
    (but do not throw NS_ERROR_DOM_SECURITY_ERR if the caller is a moz-extension
    and the new pref is set to true)

Depends on D60244

  • Include a remoteType property to the RemoteWorkerData
  • Changes to RemoteWorkerManager::LaunchNewContentProcess to launch a new process with remoteType "extension"
    when the service worker is from an extension
  • Changes to RemoteWorkerManager::SelectTargetActorForServiceWorker to select an actor spawner in a child
    process with remoteType "extension" when the service worker is from an extension
  • Changes to RemoteWorkerManager::RegisterActor does not launch an extension service worker
    in a non-"extension" remoteType" child process

Depends on D60245

Attachment #9121594 - Attachment description: Bug 1609920 - part 3: RemoteWorkerManager should launch extension remote workers into extension remoteType processes. → Bug 1609920 - part 3: Terminate extension background workers on shutdown and unregister on uninstall.
Depends on: 1612690

:asuth :perry hi, do you have any idea on when you would have time to move forward with the review?

Flags: needinfo?(bugmail)
Flags: needinfo?(perry)

We're currently focused on a parent-intercept ServiceWorker regression on trunk (Bug 1622451) but when that's addressed there should be some bandwidth.

Flags: needinfo?(perry)
Flags: needinfo?(bugmail)
Attachment #9121514 - Attachment description: Bug 1609920 - part 2: Disallow extension to register their own service worker. → Bug 1609920 - part 2: Guard ServiceWorkerContainer::Register to allow/disallow moz-extension scheme based on prefs.
See Also: → 1635227
See Also: 1635227
See Also: → 1635227
Blocks: 1638097
Blocks: 1638098
Blocks: 1638099
Depends on: 1642676

There are some r+ patches which didn't land and no activity in this bug for 2 weeks.
:rpl, could you have a look please?
For more information, please visit auto_nag documentation.

Flags: needinfo?(lgreco)

The patches attached to this issue depend on the changes applied in Bug 1642676, which I pushed to autoland yesterday and they did reach mozilla-central today.
I'm going to land these on Nightly 80 as well.

Flags: needinfo?(lgreco)
Pushed by luca.greco@alcacoop.it: https://hg.mozilla.org/integration/autoland/rev/0e68db4ad6af part 1: Allow the WebExtension Framework to register a moz-extension service worker. r=dom-workers-and-storage-reviewers,asuth,mixedpuppy https://hg.mozilla.org/integration/autoland/rev/fd1e4db7cf78 part 2: Guard ServiceWorkerContainer::Register to allow/disallow moz-extension scheme based on prefs. r=dom-workers-and-storage-reviewers,asuth,webidl,smaug https://hg.mozilla.org/integration/autoland/rev/eaa0bb2cf36b part 3: Terminate extension background workers on shutdown and unregister on uninstall. r=dom-workers-and-storage-reviewers,asuth,mixedpuppy https://hg.mozilla.org/integration/autoland/rev/1c8faab05606 part 4: Add new mochitests and marionette test related to the new background service worker prefs. r=marionette-reviewers,asuth,whimboo,mixedpuppy

(In reply to Dorel Luca [:dluca] from comment #10)

Backed out 4 changesets (bug 1609920) for leaks in browser-chrome. CLOSED TREE

Log:
https://treeherder.mozilla.org/logviewer.html#/jobs?job_id=308197231&repo=autoland&lineNumber=27005

Push with failures:
https://treeherder.mozilla.org/#/jobs?repo=autoland&group_state=expanded&revision=1c8faab05606ec8314fa008cfff15df65f304865

Backout:
https://hg.mozilla.org/integration/autoland/rev/728bf9ad480a59d7dfeacff4265c86e0990938af

I did spent some time on looking into the failures triggered by LeakSanitizer in the asan build, but I'm not sure that they are really introduced or triggered by this set of patches.
As an example of something that suggest the opposite (the failure may be unrelated), the same leaks seems to be detected even without these patches by running those tests on the mozilla-central tip here:

Besides that, by looking to the tests that are running as part of that job, I'm surprised that they would be able to trigger anything new that the attached patches may do (because most of the changes are actually locked behind a pref, which would keep most of the changes inactive in those set of tests, only a very small fragment of the changes may be able to actually be used while these tests are running)

would it be possible to double-check if I'm right (as the push to try linked above seems to suggest) and those failure are not really triggered by this patches?

Flags: needinfo?(lgreco)

Hi :mccr8 and :sfoster
The patches attached to this issue have been backed out for some LeakSanitizer failures in browser/components/downloads/test/browser/ tests (See link to the failures in comment 10).

As I did mention in comment 11, I don't see (at least not yet) how the patches backed out are able to trigger that failure (or make it more frequent), and it looks that I can trigger the same (or very similar) failures without any of those patches on a mozilla-central tip (see link to the try push in comment 11).

Could you take a look to the failure in comment 10 and see if you can spot anything that could give us some pointers to get it fixed (or how to investigate it further, or if you think that it is unrelated to the patches attached to this bugzilla issue)?

Thanks in advance for your help!

Flags: needinfo?(sfoster)
Flags: needinfo?(continuation)

So it looks like it encountered problems running browser/components/downloads/tests/browser/browser_pdfjs_preview.js, which loads a minimal PDF document into a new tab using pdf.js, and that seems to be where at least some of the leaks are coming from. For context, that test opens "downloaded" PDF files into tabs by interacting with the various download lists - the downloads panel, the library -> all downloads window, the about:downloads view, in both non-private and private windows.

I have no idea how this service worker / moz-extension:// script work would have any impact on that.
I did see some asan test failures in try runs while I've been working on these tests over the last couple of weeks. It might be the most expedient step for now is just to disable this test for asan builds.

Flags: needinfo?(sfoster)

Brendan, do the logs from comment 10 mean anything more to you? The browser_pdfjs_preview.js test logs start around line 1740 I'm afraid most of the leak sanitizer output is gobbledy-gook to me.

Flags: needinfo?(bdahl)

The leak sanitizer output basically means that we're leaking lots of DOM stuff. This particular leak has been happening frequently but only intermittently for a few weeks now.

It does seem unambiguous that it became a permanent failure with your push, and it also seems to have gone away when your patch got backed out: https://treeherder.mozilla.org/#/jobs?repo=autoland&selectedTaskRun=ejWvA3HoRWaFEap_i_tMMA.0&searchStr=bc6%2Clinux&revision=728bf9ad480a59d7dfeacff4265c86e0990938af

....but then about 2 hours later it turned into a permafailure again, which seems to have made it all the way to mozilla-central. I'm not sure what is going on here.

Flags: needinfo?(continuation)

I think I've found the second regressor for this leak. I'll ask sheriffs to back it out once I've got a bit more confirmation.

That was bug 1645538. I wonder if changes to prefs are somehow causing issues. I don't know how that would happen, exactly.

Ok, that wasn't actually a regression. It just added a test and caused the test failure to move from bc12 to bc6. Maybe your patch did something similar. You'd want to look for another ASan bc hitting that same failure on the changeset before you landed, and then look at the raw logs to double check that it contains a reference to browser/components/downloads/test/browser/browser_pdfjs_preview.js

Yeah, it looks like it was failing in bc12 before your patch landed, so it should be okay to reland your patch (assuming this was the only failure it was backed out for). I'm still not sure what was causing it, but it appears it wasn't your patch. Thanks to Aryx for reminding me about tests hopping chunks...

Flags: needinfo?(bdahl)

Note that the browser_pdfjs_preview.js test is relatively new: https://hg.mozilla.org/mozilla-central/log/tip/browser/components/downloads/test/browser/browser_pdfjs_preview.js - it only landed this May.

That test does set and unset a pref while it runs using the pushPrefEnv/popPrefEnv helpers, but it would be odd for bug 1645538 to have an impact on this one test that wasn't seen in the many 100s of other test that use them? Unless there is something particular about this test (which isn't impossible as it employs private & not-private windows and other details that combined could make it unique I guess?)

The failure doesn't have anything to do with the patch in this bug. It just added or removed a test, which caused the failure to move from bc12 to bc6, so it looked like a regression, but it was just shifting it.

Attachment #9161213 - Attachment is obsolete: true
Pushed by luca.greco@alcacoop.it: https://hg.mozilla.org/integration/autoland/rev/f567e48e5957 part 1: Allow the WebExtension Framework to register a moz-extension service worker. r=dom-workers-and-storage-reviewers,asuth,mixedpuppy https://hg.mozilla.org/integration/autoland/rev/3e35dbe7e66f part 2: Guard ServiceWorkerContainer::Register to allow/disallow moz-extension scheme based on prefs. r=dom-workers-and-storage-reviewers,asuth,webidl,smaug https://hg.mozilla.org/integration/autoland/rev/8ca84442f85d part 3: Terminate extension background workers on shutdown and unregister on uninstall. r=dom-workers-and-storage-reviewers,asuth,mixedpuppy https://hg.mozilla.org/integration/autoland/rev/fbcb0ee2d17a part 4: Add new mochitests and marionette test related to the new background service worker prefs. r=marionette-reviewers,asuth,whimboo,mixedpuppy
Regressions: 1663125
Regressions: 1678927
See Also: → 1593931
See Also: → 1775618
Regressions: 1860304
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: