Bug 1341083: Don't fall back to reframing with display: contents. r?heycam
MozReview-Commit-ID: KD3QBiU7M5f
--- a/layout/base/nsFrameManager.cpp
+++ b/layout/base/nsFrameManager.cpp
@@ -213,17 +213,18 @@ ParentForUndisplayedMap(const nsIContent
nsIContent* parent = aContent->GetParentElementCrossingShadowRoot();
MOZ_ASSERT(parent || !aContent->GetParent(), "no non-elements");
return parent;
}
/* static */ nsStyleContext*
-nsFrameManager::GetStyleContextInMap(UndisplayedMap* aMap, nsIContent* aContent)
+nsFrameManager::GetStyleContextInMap(UndisplayedMap* aMap,
+ const nsIContent* aContent)
{
UndisplayedNode* node = GetUndisplayedNodeInMapFor(aMap, aContent);
return node ? node->mStyle.get() : nullptr;
}
/* static */ UndisplayedNode*
nsFrameManager::GetUndisplayedNodeInMapFor(UndisplayedMap* aMap,
const nsIContent* aContent)
--- a/layout/base/nsFrameManager.h
+++ b/layout/base/nsFrameManager.h
@@ -97,17 +97,17 @@ public:
// Placeholder frame functions
nsPlaceholderFrame* GetPlaceholderFrameFor(const nsIFrame* aFrame);
void RegisterPlaceholderFrame(nsPlaceholderFrame* aPlaceholderFrame);
void UnregisterPlaceholderFrame(nsPlaceholderFrame* aPlaceholderFrame);
void ClearPlaceholderFrameMap();
// Mapping undisplayed content
- nsStyleContext* GetUndisplayedContent(nsIContent* aContent)
+ nsStyleContext* GetUndisplayedContent(const nsIContent* aContent)
{
if (!mUndisplayedMap) {
return nullptr;
}
return GetStyleContextInMap(mUndisplayedMap, aContent);
}
mozilla::UndisplayedNode*
GetAllUndisplayedContentIn(nsIContent* aParentContent);
@@ -122,17 +122,17 @@ public:
void ClearUndisplayedContentIn(nsIContent* aContent,
nsIContent* aParentContent);
void ClearAllUndisplayedContentIn(nsIContent* aParentContent);
// display:contents related methods:
/**
* Return the registered display:contents style context for aContent, if any.
*/
- nsStyleContext* GetDisplayContentsStyleFor(nsIContent* aContent)
+ nsStyleContext* GetDisplayContentsStyleFor(const nsIContent* aContent)
{
if (!mDisplayContentsMap) {
return nullptr;
}
return GetStyleContextInMap(mDisplayContentsMap, aContent);
}
/**
@@ -215,17 +215,17 @@ public:
*/
void CaptureFrameStateFor(nsIFrame* aFrame,
nsILayoutHistoryState* aState);
void RestoreFrameStateFor(nsIFrame* aFrame,
nsILayoutHistoryState* aState);
protected:
static nsStyleContext* GetStyleContextInMap(UndisplayedMap* aMap,
- nsIContent* aContent);
+ const nsIContent* aContent);
static mozilla::UndisplayedNode*
GetUndisplayedNodeInMapFor(UndisplayedMap* aMap,
const nsIContent* aContent);
static mozilla::UndisplayedNode*
GetAllUndisplayedNodesInMapFor(UndisplayedMap* aMap,
nsIContent* aParentContent);
static void SetStyleContextInMap(UndisplayedMap* aMap,
nsIContent* aContent,
--- a/layout/style/ServoBindings.cpp
+++ b/layout/style/ServoBindings.cpp
@@ -4,16 +4,17 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/ServoBindings.h"
#include "ChildIterator.h"
#include "gfxFontFamilyList.h"
#include "nsAttrValueInlines.h"
+#include "nsCSSFrameConstructor.h"
#include "nsCSSProps.h"
#include "nsCSSParser.h"
#include "nsCSSPseudoElements.h"
#include "nsCSSRuleProcessor.h"
#include "nsContentUtils.h"
#include "nsDOMTokenList.h"
#include "nsIContentInlines.h"
#include "nsIDOMNode.h"
@@ -274,21 +275,27 @@ Gecko_SetOwnerDocumentNeedsStyleFlush(Ra
nsStyleContext*
Gecko_GetStyleContext(RawGeckoNodeBorrowed aNode, nsIAtom* aPseudoTagOrNull)
{
MOZ_ASSERT(aNode->IsContent());
nsIFrame* relevantFrame =
ServoRestyleManager::FrameForPseudoElement(aNode->AsContent(),
aPseudoTagOrNull);
- if (!relevantFrame) {
- return nullptr;
+ if (relevantFrame) {
+ return relevantFrame->StyleContext();
}
- return relevantFrame->StyleContext();
+ // FIXME(emilio): Is there a shorter path?
+ nsCSSFrameConstructor* fc =
+ aNode->OwnerDoc()->GetShell()->GetPresContext()->FrameConstructor();
+
+ // NB: This is only called for CalcStyleDifference, and we handle correctly
+ // the display: none case since Servo still has the older style.
+ return fc->GetDisplayContentsStyleFor(aNode->AsContent());
}
nsChangeHint
Gecko_CalcStyleDifference(nsStyleContext* aOldStyleContext,
ServoComputedValuesBorrowed aComputedValues)
{
MOZ_ASSERT(aOldStyleContext);
MOZ_ASSERT(aComputedValues);