Commit c3824916 authored by Ryan Hunt's avatar Ryan Hunt
Browse files

Bug 1519546, part 5 - Add mIsTopLevel flag for tracking the root PBrowser...

Bug 1519546, part 5 - Add mIsTopLevel flag for tracking the root PBrowser actor in a remote browser. r=farre

The root PBrowser actor needs special case visibility behavior to satisfy the async tab
switcher. This commit adds a flag to track whether a BrowserChild is part of the root
actor.

Differential Revision: https://phabricator.services.mozilla.com/D33046

--HG--
extra : rebase_source : 5f7cb11f77d41f3265d211e99713a1dad6ae2579
extra : intermediate-source : 49e4d0e4fc7ccfa7b2c58bb9b64534c2d569a881
extra : source : adcc870662770a99962e721bd3c5ff4c2616c21d
parent ea567d2c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -87,7 +87,7 @@ nsresult BrowserBridgeParent::Init(const nsString& aPresentationURL,
  bool ok = constructorSender->SendConstructBrowser(
      std::move(childEp), tabId, TabId(0), tabContext.AsIPCTabContext(),
      aBrowsingContext, aChromeFlags, constructorSender->ChildID(),
      constructorSender->IsForBrowser());
      constructorSender->IsForBrowser(), /* aIsTopLevel */ false);
  if (NS_WARN_IF(!ok)) {
    MOZ_ASSERT(false, "Browser Constructor Failed");
    return NS_ERROR_FAILURE;
+6 −4
Original line number Diff line number Diff line
@@ -358,18 +358,19 @@ already_AddRefed<BrowserChild> BrowserChild::FindBrowserChild(
already_AddRefed<BrowserChild> BrowserChild::Create(
    ContentChild* aManager, const TabId& aTabId, const TabId& aSameTabGroupAs,
    const TabContext& aContext, BrowsingContext* aBrowsingContext,
    uint32_t aChromeFlags) {
    uint32_t aChromeFlags, bool aIsTopLevel) {
  RefPtr<BrowserChild> groupChild = FindBrowserChild(aSameTabGroupAs);
  dom::TabGroup* group = groupChild ? groupChild->TabGroup() : nullptr;
  RefPtr<BrowserChild> iframe = new BrowserChild(
      aManager, aTabId, group, aContext, aBrowsingContext, aChromeFlags);
  RefPtr<BrowserChild> iframe =
      new BrowserChild(aManager, aTabId, group, aContext, aBrowsingContext,
                       aChromeFlags, aIsTopLevel);
  return iframe.forget();
}

BrowserChild::BrowserChild(ContentChild* aManager, const TabId& aTabId,
                           dom::TabGroup* aTabGroup, const TabContext& aContext,
                           BrowsingContext* aBrowsingContext,
                           uint32_t aChromeFlags)
                           uint32_t aChromeFlags, bool aIsTopLevel)
    : TabContext(aContext),
      mTabGroup(aTabGroup),
      mManager(aManager),
@@ -387,6 +388,7 @@ BrowserChild::BrowserChild(ContentChild* aManager, const TabId& aTabId,
      mHasValidInnerSize(false),
      mDestroyed(false),
      mUniqueId(aTabId),
      mIsTopLevel(aIsTopLevel),
      mHasSiblings(false),
      mIsTransparent(false),
      mIPCOpen(false),
+6 −2
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ class BrowserChild final : public BrowserChildBase,
   */
  BrowserChild(ContentChild* aManager, const TabId& aTabId, TabGroup* aTabGroup,
               const TabContext& aContext, BrowsingContext* aBrowsingContext,
               uint32_t aChromeFlags);
               uint32_t aChromeFlags, bool aIsTopLevel);

  nsresult Init(mozIDOMWindowProxy* aParent);

@@ -250,7 +250,7 @@ class BrowserChild final : public BrowserChildBase,
  static already_AddRefed<BrowserChild> Create(
      ContentChild* aManager, const TabId& aTabId, const TabId& aSameTabGroupAs,
      const TabContext& aContext, BrowsingContext* aBrowsingContext,
      uint32_t aChromeFlags);
      uint32_t aChromeFlags, bool aIsTopLevel);

  // Let managees query if it is safe to send messages.
  bool IsDestroyed() const { return mDestroyed; }
@@ -863,6 +863,10 @@ class BrowserChild final : public BrowserChildBase,
  LayoutDeviceIntPoint mChromeOffset;
  TabId mUniqueId;

  // Whether or not this browser is the child part of the top level PBrowser
  // actor in a remote browser.
  bool mIsTopLevel;

  // Whether or not this tab has siblings (other tabs in the same window).
  // This is one factor used when choosing to allow or deny a non-system
  // script's attempt to resize the window.
+6 −4
Original line number Diff line number Diff line
@@ -966,8 +966,9 @@ nsresult ContentChild::ProvideWindowCommon(
      nullptr, openerBC, aName, BrowsingContext::Type::Content);

  TabContext newTabContext = aTabOpener ? *aTabOpener : TabContext();
  RefPtr<BrowserChild> newChild = new BrowserChild(
      this, tabId, tabGroup, newTabContext, browsingContext, aChromeFlags);
  RefPtr<BrowserChild> newChild =
      new BrowserChild(this, tabId, tabGroup, newTabContext, browsingContext,
                       aChromeFlags, /* aIsTopLevel */ true);

  if (aTabOpener) {
    MOZ_ASSERT(ipcContext->type() == IPCTabContext::TPopupIPCTabContext);
@@ -1796,7 +1797,8 @@ mozilla::ipc::IPCResult ContentChild::RecvConstructBrowser(
    ManagedEndpoint<PBrowserChild>&& aBrowserEp, const TabId& aTabId,
    const TabId& aSameTabGroupAs, const IPCTabContext& aContext,
    BrowsingContext* aBrowsingContext, const uint32_t& aChromeFlags,
    const ContentParentId& aCpID, const bool& aIsForBrowser) {
    const ContentParentId& aCpID, const bool& aIsForBrowser,
    const bool& aIsTopLevel) {
  MOZ_ASSERT(!IsShuttingDown());

  static bool hasRunOnce = false;
@@ -1827,7 +1829,7 @@ mozilla::ipc::IPCResult ContentChild::RecvConstructBrowser(

  RefPtr<BrowserChild> browserChild =
      BrowserChild::Create(this, aTabId, aSameTabGroupAs, tc.GetTabContext(),
                           aBrowsingContext, aChromeFlags);
                           aBrowsingContext, aChromeFlags, aIsTopLevel);

  // Bind the created BrowserChild to IPC to actually link the actor. The ref
  // here is released in DeallocPBrowserChild.
+2 −1
Original line number Diff line number Diff line
@@ -523,7 +523,8 @@ class ContentChild final : public PContentChild,
      ManagedEndpoint<PBrowserChild>&& aBrowserEp, const TabId& aTabId,
      const TabId& aSameTabGroupAs, const IPCTabContext& aContext,
      BrowsingContext* aBrowsingContext, const uint32_t& aChromeFlags,
      const ContentParentId& aCpID, const bool& aIsForBrowser);
      const ContentParentId& aCpID, const bool& aIsForBrowser,
      const bool& aIsTopLevel);

  FORWARD_SHMEM_ALLOCATOR_TO(PContentChild)

Loading