Bug 1463115 - Try to skip irrelevant (collapsed/trimmed) whitespace when collecting used font faces for devtools inspector. r=jwatt

This commit is contained in:
Jonathan Kew 2018-05-24 14:44:09 +01:00
parent 2884d63e52
commit ad2647f459
9 changed files with 45 additions and 21 deletions

View File

@ -3157,7 +3157,7 @@ nsRange::GetClientRectsAndTexts(
nsresult
nsRange::GetUsedFontFaces(nsTArray<nsAutoPtr<InspectorFontFace>>& aResult,
uint32_t aMaxRanges)
uint32_t aMaxRanges, bool aSkipCollapsedWhitespace)
{
NS_ENSURE_TRUE(mStart.Container(), NS_ERROR_UNEXPECTED);
@ -3201,17 +3201,20 @@ nsRange::GetUsedFontFaces(nsTArray<nsAutoPtr<InspectorFontFace>>& aResult,
int32_t offset = startContainer == endContainer ?
mEnd.Offset() : content->GetText()->GetLength();
nsLayoutUtils::GetFontFacesForText(frame, mStart.Offset(), offset,
true, fontFaces, aMaxRanges);
true, fontFaces, aMaxRanges,
aSkipCollapsedWhitespace);
continue;
}
if (node == endContainer) {
nsLayoutUtils::GetFontFacesForText(frame, 0, mEnd.Offset(),
true, fontFaces, aMaxRanges);
true, fontFaces, aMaxRanges,
aSkipCollapsedWhitespace);
continue;
}
}
nsLayoutUtils::GetFontFacesForFrames(frame, fontFaces, aMaxRanges);
nsLayoutUtils::GetFontFacesForFrames(frame, fontFaces, aMaxRanges,
aSkipCollapsedWhitespace);
}
// Take ownership of the InspectorFontFaces in the table and move them into

View File

@ -270,7 +270,8 @@ public:
// where each face was used).
nsresult GetUsedFontFaces(
nsTArray<nsAutoPtr<mozilla::dom::InspectorFontFace>>& aResult,
uint32_t aMaxRanges);
uint32_t aMaxRanges,
bool aSkipCollapsedWhitespace);
// nsIMutationObserver methods
NS_DECL_NSIMUTATIONOBSERVER_CHARACTERDATACHANGED

View File

@ -65,7 +65,8 @@ namespace InspectorUtils {
// to access via its .ranges attribute.
[NewObject, Throws] sequence<InspectorFontFace> getUsedFontFaces(
Range range,
optional unsigned long maxRanges = 0);
optional unsigned long maxRanges = 0,
optional boolean skipCollapsedWhitespace = true);
sequence<DOMString> getCSSPseudoElementNames();
void addPseudoClassLock(Element element,

View File

@ -7864,14 +7864,16 @@ nsLayoutUtils::AssertTreeOnlyEmptyNextInFlows(nsIFrame *aSubtreeRoot)
static void
GetFontFacesForFramesInner(nsIFrame* aFrame,
nsLayoutUtils::UsedFontFaceTable& aFontFaces,
uint32_t aMaxRanges)
uint32_t aMaxRanges,
bool aSkipCollapsedWhitespace)
{
MOZ_ASSERT(aFrame, "NULL frame pointer");
if (aFrame->IsTextFrame()) {
if (!aFrame->GetPrevContinuation()) {
nsLayoutUtils::GetFontFacesForText(aFrame, 0, INT32_MAX, true,
aFontFaces, aMaxRanges);
aFontFaces, aMaxRanges,
aSkipCollapsedWhitespace);
}
return;
}
@ -7883,7 +7885,8 @@ GetFontFacesForFramesInner(nsIFrame* aFrame,
for (nsFrameList::Enumerator e(children); !e.AtEnd(); e.Next()) {
nsIFrame* child = e.get();
child = nsPlaceholderFrame::GetRealFrameFor(child);
GetFontFacesForFramesInner(child, aFontFaces, aMaxRanges);
GetFontFacesForFramesInner(child, aFontFaces, aMaxRanges,
aSkipCollapsedWhitespace);
}
}
}
@ -7891,12 +7894,14 @@ GetFontFacesForFramesInner(nsIFrame* aFrame,
/* static */ nsresult
nsLayoutUtils::GetFontFacesForFrames(nsIFrame* aFrame,
UsedFontFaceTable& aFontFaces,
uint32_t aMaxRanges)
uint32_t aMaxRanges,
bool aSkipCollapsedWhitespace)
{
MOZ_ASSERT(aFrame, "NULL frame pointer");
while (aFrame) {
GetFontFacesForFramesInner(aFrame, aFontFaces, aMaxRanges);
GetFontFacesForFramesInner(aFrame, aFontFaces, aMaxRanges,
aSkipCollapsedWhitespace);
aFrame = GetNextContinuationOrIBSplitSibling(aFrame);
}
@ -7967,7 +7972,8 @@ nsLayoutUtils::GetFontFacesForText(nsIFrame* aFrame,
int32_t aEndOffset,
bool aFollowContinuations,
UsedFontFaceTable& aFontFaces,
uint32_t aMaxRanges)
uint32_t aMaxRanges,
bool aSkipCollapsedWhitespace)
{
MOZ_ASSERT(aFrame, "NULL frame pointer");
@ -8007,9 +8013,13 @@ nsLayoutUtils::GetFontFacesForText(nsIFrame* aFrame,
}
}
if (!aSkipCollapsedWhitespace ||
(curr->HasAnyNoncollapsedCharacters() &&
curr->HasNonSuppressedText())) {
gfxTextRun::Range range(iter.ConvertOriginalToSkipped(fstart),
iter.ConvertOriginalToSkipped(fend));
AddFontsFromTextRun(textRun, curr, iter, range, aFontFaces, aMaxRanges);
}
curr = next;
} while (aFollowContinuations && curr);

View File

@ -2288,7 +2288,8 @@ public:
*/
static nsresult GetFontFacesForFrames(nsIFrame* aFrame,
UsedFontFaceTable& aResult,
uint32_t aMaxRanges);
uint32_t aMaxRanges,
bool aSkipCollapsedWhitespace);
/**
* Adds all font faces used within the specified range of text in aFrame,
@ -2302,7 +2303,8 @@ public:
int32_t aEndOffset,
bool aFollowContinuations,
UsedFontFaceTable& aResult,
uint32_t aMaxRanges);
uint32_t aMaxRanges,
bool aSkipCollapsedWhitespace);
/**
* Walks the frame tree starting at aFrame looking for textRuns.

View File

@ -10420,7 +10420,11 @@ nsTextFrame::CountGraphemeClusters() const
bool
nsTextFrame::HasNonSuppressedText()
{
if (HasAnyStateBits(TEXT_ISNOT_ONLY_WHITESPACE)) {
if (HasAnyStateBits(TEXT_ISNOT_ONLY_WHITESPACE |
// If we haven't reflowed yet, or are currently doing so,
// just return true because we can't be sure.
NS_FRAME_FIRST_REFLOW |
NS_FRAME_IN_REFLOW)) {
return true;
}

View File

@ -666,6 +666,8 @@ public:
uint32_t CountGraphemeClusters() const;
bool HasAnyNoncollapsedCharacters() override;
protected:
virtual ~nsTextFrame();
@ -882,8 +884,6 @@ protected:
void ClearFrameOffsetCache();
bool HasAnyNoncollapsedCharacters() override;
void ClearMetrics(ReflowOutput& aMetrics);
/**

View File

@ -617,10 +617,12 @@ InspectorUtils::GetCleanComputedStyleForElement(dom::Element* aElement,
InspectorUtils::GetUsedFontFaces(GlobalObject& aGlobalObject,
nsRange& aRange,
uint32_t aMaxRanges,
bool aSkipCollapsedWhitespace,
nsTArray<nsAutoPtr<InspectorFontFace>>& aResult,
ErrorResult& aRv)
{
nsresult rv = aRange.GetUsedFontFaces(aResult, aMaxRanges);
nsresult rv = aRange.GetUsedFontFaces(aResult, aMaxRanges,
aSkipCollapsedWhitespace);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
}

View File

@ -225,6 +225,7 @@ public:
nsRange& aRange,
uint32_t aMaxRanges, // max number of ranges to
// record for each face
bool aSkipCollapsedWhitespace,
nsTArray<nsAutoPtr<InspectorFontFace>>& aResult,
ErrorResult& aRv);