Commit 6553f279 authored by Emilio Cobos Álvarez's avatar Emilio Cobos Álvarez
Browse files

Bug 1762298 - Inherit used color-scheme from embedder <browser> elements. r=nika,dao,Gijs

This allows popups and sidebars to use the chrome preferred
color-scheme.

This moves the responsibility of setting the content-preferred color
scheme to the appropriate browsers to the front-end (via tabs.css).

We still return the PreferredColorSchemeForContent() when there's no
pres context (e.g., for display:none in-process iframes). We could
potentially move a bunch of the pres-context data to the document
instead, but that should be acceptable IMO as for general web content
there's no behavior change in any case.

Differential Revision: https://phabricator.services.mozilla.com/D142578
parent c3844882
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -17,6 +17,10 @@
  --tabpanel-background-color: #F9F9FB;
}

#tabbrowser-tabpanels browser {
  color-scheme: env(-moz-content-preferred-color-scheme);
}

@media (-moz-content-prefers-color-scheme: dark) {
  :root {
    /* --tabpanel-background-color matches $in-content-page-background in newtab
+15 −16
Original line number Diff line number Diff line
@@ -703,8 +703,8 @@ void BrowsingContext::SetEmbedderElement(Element* aEmbedder) {
      }
      txn.SetMessageManagerGroup(messageManagerGroup);

      bool useGlobalHistory = !aEmbedder->HasAttr(
          kNameSpaceID_None, nsGkAtoms::disableglobalhistory);
      bool useGlobalHistory =
          !aEmbedder->HasAttr(nsGkAtoms::disableglobalhistory);
      txn.SetUseGlobalHistory(useGlobalHistory);
    }

@@ -2781,19 +2781,21 @@ bool BrowsingContext::CanSet(FieldIndex<IDX_TouchEventsOverrideInternal>,
  return XRE_IsParentProcess() && !aSource;
}

void BrowsingContext::DidSet(FieldIndex<IDX_EmbedderColorScheme>,
                             dom::PrefersColorSchemeOverride aOldValue) {
  if (GetEmbedderColorScheme() == aOldValue) {
    return;
  }
  PresContextAffectingFieldChanged();
}

void BrowsingContext::DidSet(FieldIndex<IDX_PrefersColorSchemeOverride>,
                             dom::PrefersColorSchemeOverride aOldValue) {
  MOZ_ASSERT(IsTop());
  if (PrefersColorSchemeOverride() == aOldValue) {
    return;
  }
  PreOrderWalk([&](BrowsingContext* aContext) {
    if (nsIDocShell* shell = aContext->GetDocShell()) {
      if (nsPresContext* pc = shell->GetPresContext()) {
        pc->RecomputeBrowsingContextDependentData();
      }
    }
  });
  PresContextAffectingFieldChanged();
}

void BrowsingContext::DidSet(FieldIndex<IDX_MediumOverride>,
@@ -2802,13 +2804,7 @@ void BrowsingContext::DidSet(FieldIndex<IDX_MediumOverride>,
  if (GetMediumOverride() == aOldValue) {
    return;
  }
  PreOrderWalk([&](BrowsingContext* aContext) {
    if (nsIDocShell* shell = aContext->GetDocShell()) {
      if (nsPresContext* pc = shell->GetPresContext()) {
        pc->RecomputeBrowsingContextDependentData();
      }
    }
  });
  PresContextAffectingFieldChanged();
}

void BrowsingContext::DidSet(FieldIndex<IDX_DisplayMode>,
@@ -2878,7 +2874,10 @@ void BrowsingContext::DidSet(FieldIndex<IDX_OverrideDPPX>, float aOldValue) {
  if (GetOverrideDPPX() == aOldValue) {
    return;
  }
  PresContextAffectingFieldChanged();
}

void BrowsingContext::PresContextAffectingFieldChanged() {
  PreOrderWalk([&](BrowsingContext* aContext) {
    if (nsIDocShell* shell = aContext->GetDocShell()) {
      if (nsPresContext* pc = shell->GetPresContext()) {
+16 −2
Original line number Diff line number Diff line
@@ -210,8 +210,12 @@ enum class ExplicitActiveStatus : uint8_t {
  FIELD(AuthorStyleDisabledDefault, bool)                                     \
  FIELD(ServiceWorkersTestingEnabled, bool)                                   \
  FIELD(MediumOverride, nsString)                                             \
  FIELD(PrefersColorSchemeOverride, mozilla::dom::PrefersColorSchemeOverride) \
  FIELD(DisplayMode, mozilla::dom::DisplayMode)                               \
  /* DevTools override for prefers-color-scheme */                            \
  FIELD(PrefersColorSchemeOverride, dom::PrefersColorSchemeOverride)          \
  /* prefers-color-scheme override based on the color-scheme style of our     \
   * <browser> embedder element. */                                           \
  FIELD(EmbedderColorScheme, dom::PrefersColorSchemeOverride)                 \
  FIELD(DisplayMode, dom::DisplayMode)                                        \
  /* The number of entries added to the session history because of this       \
   * browsing context. */                                                     \
  FIELD(HistoryEntryCount, uint32_t)                                          \
@@ -1017,6 +1021,11 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
    return IsTop();
  }

  bool CanSet(FieldIndex<IDX_EmbedderColorScheme>,
              dom::PrefersColorSchemeOverride, ContentParent* aSource) {
    return CheckOnlyEmbedderCanSet(aSource);
  }

  bool CanSet(FieldIndex<IDX_PrefersColorSchemeOverride>,
              dom::PrefersColorSchemeOverride, ContentParent*) {
    return IsTop();
@@ -1024,9 +1033,14 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {

  void DidSet(FieldIndex<IDX_InRDMPane>, bool aOldValue);

  void DidSet(FieldIndex<IDX_EmbedderColorScheme>,
              dom::PrefersColorSchemeOverride aOldValue);

  void DidSet(FieldIndex<IDX_PrefersColorSchemeOverride>,
              dom::PrefersColorSchemeOverride aOldValue);

  void PresContextAffectingFieldChanged();

  void DidSet(FieldIndex<IDX_MediumOverride>, nsString&& aOldValue);

  bool CanSet(FieldIndex<IDX_SuspendMediaWhenInactive>, bool, ContentParent*) {
+1 −0
Original line number Diff line number Diff line
@@ -306,6 +306,7 @@ void CanonicalBrowsingContext::ReplacedBy(
  txn.SetBrowserId(GetBrowserId());
  txn.SetHistoryID(GetHistoryID());
  txn.SetExplicitActive(GetExplicitActive());
  txn.SetEmbedderColorScheme(GetEmbedderColorScheme());
  txn.SetHasRestoreData(GetHasRestoreData());
  txn.SetShouldDelayMediaFromStart(GetShouldDelayMediaFromStart());
  // As this is a different BrowsingContext, set InitialSandboxFlags to the
+1 −1
Original line number Diff line number Diff line
@@ -17741,7 +17741,7 @@ ColorScheme Document::PreferredColorScheme(IgnoreRFP aIgnoreRFP) const {
  }
  if (nsPresContext* pc = GetPresContext()) {
    if (auto scheme = pc->GetOverriddenColorScheme()) {
    if (auto scheme = pc->GetOverriddenOrEmbedderColorScheme()) {
      return *scheme;
    }
  }
Loading