Commit 630e8929 authored by Makoto Kato's avatar Makoto Kato
Browse files

Bug 1827583 - Set event listener to current media control after switching...

Bug 1827583 - Set event listener to current media control after switching process. r=geckoview-reviewers,amejiamarmol,jonalmeida a=pascalc

This issue is a timing issue of loading content via about:config etc.

Although `GeckoViewMediaControl` registers event listeners for
`MediaController` when enabling `MediaSessionDelegate`, if process
switching occurs, `browsingContenxt` and `MediaController` are re-created.

It means that we has to register newer `MediaController`.

To detect destroying current browser, I will add `onDestroyBrowser` to
`GeckoViewModule` again (This was removed by bug 1672262).

Differential Revision: https://phabricator.services.mozilla.com/D179177
parent 29c81c6e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -403,6 +403,9 @@ class ModuleInfo {
   * Called before the browser is removed
   */
  onDestroyBrowser() {
    if (this._impl) {
      this._impl.onDestroyBrowser();
    }
    this._contentModuleLoaded = false;
  }

+32 −0
Original line number Diff line number Diff line
@@ -996,4 +996,36 @@ class MediaSessionTest : BaseSessionTest() {
        session.evaluateJS("document.querySelector('video').requestFullscreen()")
        sessionRule.waitForResult(resultFullscreen)
    }

    @Test
    fun switchingProcess() {
        // TODO: bug 1810736
        assumeThat(sessionRule.env.isIsolatedProcess, equalTo(false))

        sessionRule.setPrefsUntilTestEnd(
            mapOf(
                "media.autoplay.default" to 0,
            ),
        )

        mainSession.loadUri("about:blank")
        sessionRule.waitForPageStop()

        mainSession.loadTestPath(VIDEO_WEBM_PATH)
        sessionRule.waitForPageStop()

        val onPlayCalled = GeckoResult<Void>()
        mainSession.delegateUntilTestEnd(object : MediaSession.Delegate {
            @AssertCalled(count = 1)
            override fun onPlay(
                session: GeckoSession,
                mediaSession: MediaSession,
            ) {
                onPlayCalled.complete(null)
            }
        })

        mainSession.evaluateJS("document.querySelector('video').play()")
        sessionRule.waitForResult(onPlayCalled)
    }
}
+21 −13
Original line number Diff line number Diff line
@@ -9,12 +9,8 @@ export class GeckoViewMediaControl extends GeckoViewModule {
    debug`onInit`;
  }

  onEnable() {
    debug`onEnable`;

    if (this.controller.isActive) {
      this.handleActivated();
    }
  onInitBrowser() {
    debug`onInitBrowser`;

    const options = {
      mozSystemGroup: true,
@@ -27,6 +23,25 @@ export class GeckoViewMediaControl extends GeckoViewModule {
    this.controller.addEventListener("positionstatechange", this, options);
    this.controller.addEventListener("metadatachange", this, options);
    this.controller.addEventListener("playbackstatechange", this, options);
  }

  onDestroyBrowser() {
    debug`onDestroyBrowser`;

    this.controller.removeEventListener("activated", this);
    this.controller.removeEventListener("deactivated", this);
    this.controller.removeEventListener("supportedkeyschange", this);
    this.controller.removeEventListener("positionstatechange", this);
    this.controller.removeEventListener("metadatachange", this);
    this.controller.removeEventListener("playbackstatechange", this);
  }

  onEnable() {
    debug`onEnable`;

    if (this.controller.isActive) {
      this.handleActivated();
    }

    this.registerListener([
      "GeckoView:MediaSession:Play",
@@ -45,13 +60,6 @@ export class GeckoViewMediaControl extends GeckoViewModule {
  onDisable() {
    debug`onDisable`;

    this.controller.removeEventListener("activated", this);
    this.controller.removeEventListener("deactivated", this);
    this.controller.removeEventListener("supportedkeyschange", this);
    this.controller.removeEventListener("positionstatechange", this);
    this.controller.removeEventListener("metadatachange", this);
    this.controller.removeEventListener("playbackstatechange", this);

    this.unregisterListener();
  }

+3 −0
Original line number Diff line number Diff line
@@ -60,6 +60,9 @@ export class GeckoViewModule {
  // Override to initialize the browser before it is bound to the window.
  onInitBrowser() {}

  // Override to cleanup when the browser is destroyed.
  onDestroyBrowser() {}

  // Override to initialize module.
  onInit() {}