Backed out 6 changesets (bug 1518999) for marionette failures on test_refresh_firefox.py. CLOSED TREE

Backed out changeset eb8e5411868e (bug 1518999)
Backed out changeset 0924e0169dcb (bug 1518999)
Backed out changeset b7de245b329c (bug 1518999)
Backed out changeset f2a6a3797ef1 (bug 1518999)
Backed out changeset 123403a14312 (bug 1518999)
Backed out changeset 1968b8ca14d7 (bug 1518999)
This commit is contained in:
Csoregi Natalia 2020-08-18 23:53:26 +03:00
parent 15818e2195
commit c1ed2ba64f
80 changed files with 210 additions and 594 deletions

View File

@ -192,20 +192,13 @@ add_task(async function runRTPTests() {
content.performance.measure("Test-Measure", "Test", "Test-End");
// Check the entries for performance.getEntries/getEntriesByType/getEntriesByName.
await new Promise(resolve => {
const paintObserver = new content.PerformanceObserver(() => {
resolve();
});
paintObserver.observe({ type: "paint", buffered: true });
});
is(
content.performance.getEntries().length,
5,
4,
"For reduceTimerPrecision, there should be 4 entries for performance.getEntries()"
// PerformancePaintTiming, PerformanceNavigationTiming, PerformanceMark, PerformanceMark, PerformanceMeasure
// PerformanceNavigationTiming, PerformanceMark, PerformanceMark, PerformanceMeasure
);
for (var i = 0; i < 5; i++) {
for (var i = 0; i < 4; i++) {
let startTime = content.performance.getEntries()[i].startTime;
let duration = content.performance.getEntries()[i].duration;
ok(

View File

@ -407,9 +407,7 @@ add_task(async function() {
tests.forEach(test => {
let { input, headers } = test;
if (input === "PERFORMANCE_ENTRIES") {
input = content.wrappedJSObject.performance.getEntriesByType(
"navigation"
);
input = content.wrappedJSObject.performance.getEntries();
}
content.wrappedJSObject.doConsoleTable(input, headers);
});

View File

@ -22,7 +22,6 @@ namespace dom {
class PerformanceEntry;
class PerformanceNavigation;
class PerformancePaintTiming;
class PerformanceObserver;
class PerformanceService;
class PerformanceStorage;
@ -86,8 +85,6 @@ class Performance : public DOMEventTargetHelper {
virtual PerformanceNavigation* Navigation() = 0;
virtual void SetFCPTimingEntry(PerformancePaintTiming* aEntry) = 0;
IMPL_EVENT_HANDLER(resourcetimingbufferfull)
virtual void GetMozMemory(JSContext* aCx,

View File

@ -6,7 +6,6 @@
#include "PerformanceMainThread.h"
#include "PerformanceNavigation.h"
#include "PerformancePaintTiming.h"
#include "mozilla/StaticPrefs_dom.h"
#include "mozilla/StaticPrefs_privacy.h"
@ -44,14 +43,14 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(PerformanceMainThread)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PerformanceMainThread,
Performance)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mTiming, mNavigation, mDocEntry, mFCPTiming)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mTiming, mNavigation, mDocEntry)
tmp->mMozMemory = nullptr;
mozilla::DropJSObjects(this);
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PerformanceMainThread,
Performance)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTiming, mNavigation, mDocEntry, mFCPTiming)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTiming, mNavigation, mDocEntry)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(PerformanceMainThread,
@ -162,14 +161,6 @@ void PerformanceMainThread::AddRawEntry(UniquePtr<PerformanceTimingData> aData,
InsertResourceEntry(entry);
}
void PerformanceMainThread::SetFCPTimingEntry(PerformancePaintTiming* aEntry) {
MOZ_ASSERT(aEntry);
if (!mFCPTiming) {
mFCPTiming = aEntry;
QueueEntry(aEntry);
}
}
// To be removed once bug 1124165 lands
bool PerformanceMainThread::IsPerformanceTimingAttribute(
const nsAString& aName) {
@ -385,9 +376,6 @@ void PerformanceMainThread::GetEntries(
aRetval.AppendElement(mDocEntry);
}
if (mFCPTiming) {
aRetval.AppendElement(mFCPTiming);
}
aRetval.Sort(PerformanceEntryComparator());
}
@ -408,13 +396,6 @@ void PerformanceMainThread::GetEntriesByType(
return;
}
if (aEntryType.EqualsLiteral("paint")) {
if (mFCPTiming) {
aRetval.AppendElement(mFCPTiming);
return;
}
}
Performance::GetEntriesByType(aEntryType, aRetval);
}
@ -429,13 +410,6 @@ void PerformanceMainThread::GetEntriesByName(
Performance::GetEntriesByName(aName, aEntryType, aRetval);
if (mFCPTiming && mFCPTiming->GetName().Equals(aName) &&
(!aEntryType.WasPassed() ||
mFCPTiming->GetEntryType().Equals(aEntryType.Value()))) {
aRetval.AppendElement(mFCPTiming);
return;
}
// The navigation entry is the first one. If it exists and the name matches,
// let put it in front.
if (mDocEntry && mDocEntry->GetName().Equals(aName)) {

View File

@ -38,7 +38,6 @@ class PerformanceMainThread final : public Performance,
void AddRawEntry(UniquePtr<PerformanceTimingData>,
const nsAString& aInitiatorType,
const nsAString& aEntryName);
virtual void SetFCPTimingEntry(PerformancePaintTiming* aEntry) override;
TimeStamp CreationTimeStamp() const override;
@ -91,7 +90,6 @@ class PerformanceMainThread final : public Performance,
nsCOMPtr<nsITimedChannel> mChannel;
RefPtr<PerformanceTiming> mTiming;
RefPtr<PerformanceNavigation> mNavigation;
RefPtr<PerformancePaintTiming> mFCPTiming;
JS::Heap<JSObject*> mMozMemory;
const bool mCrossOriginIsolated;

View File

@ -132,8 +132,11 @@ void PerformanceObserver::QueueEntry(PerformanceEntry* aEntry) {
* Keep this list in alphabetical order.
* https://w3c.github.io/performance-timeline/#supportedentrytypes-attribute
*/
static const char16_t* const sValidTypeNames[5] = {
u"mark", u"measure", u"navigation", u"paint", u"resource",
static const char16_t* const sValidTypeNames[4] = {
u"mark",
u"measure",
u"navigation",
u"resource",
};
void PerformanceObserver::ReportUnsupportedTypesErrorToConsole(

View File

@ -1,29 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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 "PerformancePaintTiming.h"
#include "MainThreadUtils.h"
#include "mozilla/dom/PerformanceMeasureBinding.h"
using namespace mozilla::dom;
PerformancePaintTiming::PerformancePaintTiming(Performance* aPerformance,
const nsAString& aName,
DOMHighResTimeStamp aStartTime)
: PerformanceEntry(aPerformance->GetParentObject(), aName, u"paint"_ns),
mStartTime(aStartTime) {}
PerformancePaintTiming::~PerformancePaintTiming() = default;
JSObject* PerformancePaintTiming::WrapObject(
JSContext* aCx, JS::Handle<JSObject*> aGivenProto) {
return PerformancePaintTiming_Binding::Wrap(aCx, this, aGivenProto);
}
size_t PerformancePaintTiming::SizeOfIncludingThis(
mozilla::MallocSizeOf aMallocSizeOf) const {
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}

View File

@ -1,42 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
#ifndef mozilla_dom_PerformancePaintTiming_h___
#define mozilla_dom_PerformancePaintTiming_h___
#include "mozilla/dom/PerformanceEntry.h"
#include "mozilla/dom/PerformancePaintTimingBinding.h"
namespace mozilla {
namespace dom {
// https://w3c.github.io/paint-timing/#sec-PerformancePaintTiming
// Unlike timeToContentfulPaint, this timing is generated during
// displaylist building, when a frame is contentful, we collect
// the timestamp. Whereas, timeToContentfulPaint uses a compositor-side
// timestamp.
class PerformancePaintTiming final : public PerformanceEntry {
public:
PerformancePaintTiming(Performance* aPerformance, const nsAString& aName,
DOMHighResTimeStamp aStartTime);
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
virtual DOMHighResTimeStamp StartTime() const override { return mStartTime; }
size_t SizeOfIncludingThis(
mozilla::MallocSizeOf aMallocSizeOf) const override;
protected:
virtual ~PerformancePaintTiming();
DOMHighResTimeStamp mStartTime;
};
} // namespace dom
} // namespace mozilla
#endif /* mozilla_dom_PerformanacePaintTiming_h___ */

View File

@ -33,10 +33,6 @@ class PerformanceWorker final : public Performance {
return nullptr;
}
virtual void SetFCPTimingEntry(PerformancePaintTiming* aEntry) override {
MOZ_CRASH("This should not be called on workers.");
}
TimeStamp CreationTimeStamp() const override;
DOMHighResTimeStamp CreationTime() const override;

View File

@ -17,7 +17,6 @@ EXPORTS.mozilla.dom += [
'PerformanceNavigationTiming.h',
'PerformanceObserver.h',
'PerformanceObserverEntryList.h',
'PerformancePaintTiming.h',
'PerformanceResourceTiming.h',
'PerformanceServerTiming.h',
'PerformanceService.h',
@ -36,7 +35,6 @@ UNIFIED_SOURCES += [
'PerformanceNavigationTiming.cpp',
'PerformanceObserver.cpp',
'PerformanceObserverEntryList.cpp',
'PerformancePaintTiming.cpp',
'PerformanceResourceTiming.cpp',
'PerformanceServerTiming.cpp',
'PerformanceService.cpp',

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@ -14,14 +14,6 @@ support-files =
[test_performance_observer.html]
[test_performance_user_timing.html]
[test_performance_navigation_timing.html]
[test_performance_paint_timing.html]
support-files =
test_performance_paint_timing_helper.html
logo.png
[test_performance_paint_observer.html]
support-files =
test_performance_paint_observer_helper.html
logo.png
[test_worker_user_timing.html]
[test_worker_observer.html]
[test_sharedWorker_performance_user_timing.html]

View File

@ -1,40 +0,0 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1518999
-->
<head>
<title>Test for Bug 1518999 (Observer API) </title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=1518999">Mozilla
Bug 1518999 - Paint Timing API For Observers</a>
<p id="display"></p>
<div id="content" style="display: none">
<pre id="test">
<script class="testbody" type="text/javascript">
let tab;
function runTest() {
tab = window.open("test_performance_paint_observer_helper.html");
}
function done() {
tab.close();
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addLoadEvent(runTest);
</script>
</pre>
</div>
</body>
</html>

View File

@ -1,35 +0,0 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE html>
<html>
<body>
</body>
<script>
var promise = new Promise(resolve => {
var observer = new PerformanceObserver(list => resolve(list));
observer.observe({entryTypes: ["paint"]});
});
promise.then(list => {
var perfEntries = list.getEntries();
opener.is(list.getEntries().length, 1);
opener.isDeeply(list.getEntries(),
performance.getEntriesByType("paint"),
"Observed 'paint' entries should equal to entries obtained by getEntriesByType.");
opener.isDeeply(list.getEntries({name: "paint"}),
performance.getEntriesByName("paint"),
"getEntries with name filter should return correct results.");
opener.isDeeply(list.getEntries({entryType: "paint"}),
performance.getEntriesByType("paint"),
"getEntries with entryType filter should return correct results.");
opener.done();
});
const img = document.createElement("IMG");
img.src = "http://example.org/tests/dom/performance/tests/logo.png";
document.body.appendChild(img);
</script>
</html>

View File

@ -1,38 +0,0 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1518999
-->
<head>
<title>Test for Bug 1518999</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=1518999">Mozilla
Bug 1518999 - Paint Timing API</a>
<p id="display"></p>
<div id="content" style="display: none">
<pre id="test">
<script class="testbody" type="text/javascript">
let tab;
function runTest() {
tab = window.open("test_performance_paint_timing_helper.html");
}
function done() {
tab.close();
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addLoadEvent(runTest);
</script>
</pre>
</div>
</body>
</html>

View File

@ -1,65 +0,0 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1518999
-->
<head>
<title>Test for Bug 1518999</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<div id="main"></div>
<div id="image"></div>
<div id="test">
<script class="testbody" type="text/javascript">
async function runTest() {
const paintEntries = performance.getEntriesByType('paint');
opener.is(paintEntries.length, 0, "No paint entries yet");
const img = document.createElement("img");
img.src = "http://example.org/tests/dom/performance/tests/logo.png";
img.onload = function() {
function getAndTestEntries(runCount) {
function testEntries(entries) {
opener.is(entries.length, 1, "FCP Only returns");
opener.is(entries[0].entryType, "paint", "entryType is paint");
opener.is(entries[0].name, "first-contentful-paint",
"Returned entry should be first-contentful-paint" );
const fcpEntriesGotByName =
performance.getEntriesByName('first-contentful-paint');
opener.is(fcpEntriesGotByName.length, 1, "entries length should match");
opener.is(entries[0], fcpEntriesGotByName[0], "should be the same entry");
opener.done();
}
const entries = performance.getEntriesByType('paint');
if (entries.length < 1) {
if (runCount < 4) {
opener.SimpleTest.requestFlakyTimeout("FCP is being registered asynchronously, so wait a bit of time");
setTimeout(function() {
getAndTestEntries(runCount + 1);
}, 20);
} else {
opener.ok(false, "Unable to find paint entries within a reasonable amount of time");
opener.done();
}
} else {
testEntries(entries);
}
}
getAndTestEntries(1);
}
document.body.appendChild(img);
}
window.onload = function() {
runTest();
}
</script>
</div>
</div>
</body>
</html>

View File

@ -144,8 +144,9 @@ var allResources = {
};
window.onload = function() {
let entries = performance.getEntriesByType('resource');
for (let entry of entries) {
let entries = performance.getEntries();
// The entries.slice() to drop first 'document' item.
for (let entry of entries.slice(1)) {
//dump(entry.name + " || "+ entry.initiatorType+ "\n");
if (!(entry.name in allResources)) {
if (entry.name.substr(-4) == ".ttf") {

View File

@ -858,8 +858,6 @@ var interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PerformanceObserverEntryList", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PerformancePaintTiming", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PerformanceResourceTiming", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "PerformanceServerTiming", insecureContext: false },

View File

@ -1,16 +0,0 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/.
*
* The origin of this IDL file is
* https://w3c.github.io/paint-timing/#sec-PerformancePaintTiming
*
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
* liability, trademark and document use rules apply.
*/
[Exposed=(Window)]
interface PerformancePaintTiming : PerformanceEntry
{
};

View File

@ -748,7 +748,6 @@ WEBIDL_FILES = [
'PerformanceNavigationTiming.webidl',
'PerformanceObserver.webidl',
'PerformanceObserverEntryList.webidl',
'PerformancePaintTiming.webidl',
'PerformanceResourceTiming.webidl',
'PerformanceServerTiming.webidl',
'PerformanceTiming.webidl',

View File

@ -89,7 +89,6 @@
#include "mozilla/Telemetry.h"
#include "mozilla/dom/Performance.h"
#include "mozilla/dom/PerformanceTiming.h"
#include "mozilla/dom/PerformancePaintTiming.h"
#include "mozilla/layers/APZThreadUtils.h"
#include "MobileViewportManager.h"
#include "mozilla/dom/ImageTracker.h"
@ -190,7 +189,6 @@ nsPresContext::nsPresContext(dom::Document* aDocument, nsPresContextType aType)
mInflationDisabledForShrinkWrap(false),
mInteractionTimeEnabled(true),
mHasPendingInterrupt(false),
mHasEverBuiltInvisibleText(false),
mPendingInterruptFromTest(false),
mInterruptsEnabled(false),
mSendAfterPaintToContent(false),
@ -2332,8 +2330,7 @@ void nsPresContext::NotifyNonBlankPaint() {
}
}
void nsPresContext::NotifyContentfulPaint(
const mozilla::TimeStamp& aTimeStamp) {
void nsPresContext::NotifyContentfulPaint() {
if (!mHadContentfulPaint) {
#if defined(MOZ_WIDGET_ANDROID)
(new AsyncEventDispatcher(mDocument, u"MozFirstContentfulPaint"_ns,
@ -2341,23 +2338,10 @@ void nsPresContext::NotifyContentfulPaint(
->PostDOMEvent();
#endif
mHadContentfulPaint = true;
if (IsRootContentDocument()) {
if (nsRootPresContext* rootPresContext = GetRootPresContext()) {
mFirstContentfulPaintTransactionId =
Some(rootPresContext->mRefreshDriver->LastTransactionId().Next());
nsPIDOMWindowInner* innerWindow = mDocument->GetInnerWindow();
if (innerWindow) {
mozilla::dom::Performance* perf = innerWindow->GetPerformance();
if (perf) {
DOMHighResTimeStamp highResTimeStamp =
perf->GetDOMTiming()->TimeStampToDOMHighRes(aTimeStamp);
RefPtr<PerformancePaintTiming> paintTiming =
new PerformancePaintTiming(
perf, u"first-contentful-paint"_ns,
nsRFPService::ReduceTimePrecisionAsMSecs(
highResTimeStamp, perf->GetRandomTimelineSeed(),
perf->IsSystemPrincipal(), perf->CrossOriginIsolated()));
perf->SetFCPTimingEntry(paintTiming);
}
}
}
}

View File

@ -1030,12 +1030,9 @@ class nsPresContext : public nsISupports, public mozilla::SupportsWeakPtr {
bool HadNonBlankPaint() const { return mHadNonBlankPaint; }
bool HadContentfulPaint() const { return mHadContentfulPaint; }
void NotifyNonBlankPaint();
void NotifyContentfulPaint(const mozilla::TimeStamp& aTimeStamp);
void NotifyContentfulPaint();
void NotifyDOMContentFlushed();
bool HasEverBuiltInvisibleText() const { return mHasEverBuiltInvisibleText; }
void SetBuiltInvisibleText() { mHasEverBuiltInvisibleText = true; }
bool UsesExChUnits() const { return mUsesExChUnits; }
void SetUsesExChUnits(bool aValue) { mUsesExChUnits = aValue; }
@ -1268,7 +1265,6 @@ class nsPresContext : public nsISupports, public mozilla::SupportsWeakPtr {
protected:
unsigned mInteractionTimeEnabled : 1;
unsigned mHasPendingInterrupt : 1;
unsigned mHasEverBuiltInvisibleText : 1;
unsigned mPendingInterruptFromTest : 1;
unsigned mInterruptsEnabled : 1;
unsigned mSendAfterPaintToContent : 1;

View File

@ -4881,9 +4881,6 @@ void nsTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
TextDecorations textDecs;
GetTextDecorations(PresContext(), eResolvedColors, textDecs);
if (!textDecs.HasDecorationLines()) {
if (auto* currentPresContext = aBuilder->CurrentPresContext()) {
currentPresContext->SetBuiltInvisibleText();
}
return;
}
}

View File

@ -507,13 +507,6 @@ class nsDisplayVideo : public nsPaintedDisplayItem {
return elem->IsPotentiallyPlaying() ? LayerState::LAYER_ACTIVE_FORCE
: LayerState::LAYER_INACTIVE;
}
// Only report FirstContentfulPaint when the video is set
virtual bool IsContentful() const override {
nsVideoFrame* f = static_cast<nsVideoFrame*>(Frame());
HTMLVideoElement* video = HTMLVideoElement::FromNode(f->GetContent());
return video->VideoWidth() > 0;
}
};
void nsVideoFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,

View File

@ -1058,8 +1058,7 @@ static bool DisplayListIsNonBlank(nsDisplayList* aList) {
// non-white canvas or SVG. This excludes any content of iframes, but
// includes text with pending webfonts. This is the first time users
// could start consuming page content."
static bool DisplayListIsContentful(nsDisplayListBuilder* aBuilder,
nsDisplayList* aList) {
static bool DisplayListIsContentful(nsDisplayList* aList) {
for (nsDisplayItem* i : *aList) {
DisplayItemType type = i->GetType();
nsDisplayList* children = i->GetChildren();
@ -1071,14 +1070,10 @@ static bool DisplayListIsContentful(nsDisplayListBuilder* aBuilder,
// actually tracking all modifications)
default:
if (i->IsContentful()) {
bool dummy;
nsRect bound = i->GetBounds(aBuilder, &dummy);
if (!bound.IsEmpty()) {
return true;
}
}
if (children) {
if (DisplayListIsContentful(aBuilder, children)) {
if (DisplayListIsContentful(children)) {
return true;
}
}
@ -1103,11 +1098,9 @@ void nsDisplayListBuilder::LeavePresShell(const nsIFrame* aReferenceFrame,
}
}
if (!pc->HadContentfulPaint()) {
if (!CurrentPresShellState()->mIsBackgroundOnly) {
if (pc->HasEverBuiltInvisibleText() ||
DisplayListIsContentful(this, aPaintedContents)) {
pc->NotifyContentfulPaint(TimeStamp::Now());
}
if (!CurrentPresShellState()->mIsBackgroundOnly &&
DisplayListIsContentful(aPaintedContents)) {
pc->NotifyContentfulPaint();
}
}
}

View File

@ -4678,14 +4678,6 @@ class nsDisplayBackgroundImage : public nsDisplayImageContainer {
nsDisplayImageContainer::RemoveFrame(aFrame);
}
// Match https://w3c.github.io/paint-timing/#contentful-image
virtual bool IsContentful() const override {
const auto& styleImage =
mBackgroundStyle->StyleBackground()->mImage.mLayers[mLayer].mImage;
return styleImage.IsSizeAvailable() && styleImage.IsUrl();
}
protected:
typedef class mozilla::layers::ImageContainer ImageContainer;
typedef class mozilla::layers::ImageLayer ImageLayer;

View File

@ -1,5 +1,4 @@
[basetest.html]
expected: TIMEOUT
[Basic test to check existence of FP and FCP.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -1,5 +1,4 @@
[buffered-flag.window.html]
expected: TIMEOUT
[PerformanceObserver with buffered flag sees previous paint entries.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -1,5 +1,4 @@
[child-painting-first-image.html]
expected: TIMEOUT
[Parent frame ignores paint-timing events fired from child image rendering.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-background-size.html]
[First contentful paint fires due to background size.]
expected: FAIL

View File

@ -1,5 +1,4 @@
[fcp-bg-image-set.html]
expected: TIMEOUT
[First contentful paint fires due to background image in image-set.]
expected: TIMEOUT # We don't have image-set supported yet
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-bg-image-two-steps.html]
[First contentful paint fires for background image only when visible.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-canvas-context.html]
[Canvas should count as contentful when context is created]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-gradient.html]
[Gradients should not count as contentful]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-invisible-3d-rotate-descendant.html]
[First contentful paint fires due to its ancestor getting rotating into view.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-invisible-3d-rotate.html]
[First contentful paint fires due to 3d rotation into view.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-invisible-scale-transition.html]
[First contentful paint fires when revealed during transition.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-invisible-scale.html]
[First contentful paint fires due to scale becoming positive.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-invisible-text.html]
[First contentful paint fires due to pseudo-element becoming visible.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-opacity-descendant.html]
[First contentful paint fires due to its ancestor getting positive opacity.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-opacity.html]
[First contentful paint fires due to opacity-revealed element.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-out-of-bounds-translate.html]
[First contentful paint fires due to transform-based intersection with document.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-out-of-bounds.html]
[First contentful paint fires due to intersection with document.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-pseudo-element-display.html]
[First contentful paint fires due to pseudo-element text.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-pseudo-element-image.html]
[First contentful paint fires due to pseudo-element image.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-pseudo-element-opacity.html]
[First contentful paint fires due to pseudo-element getting positive opacity.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-pseudo-element-text.html]
[First contentful paint fires due to pseudo-element text.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-pseudo-element-visibility.html]
[First contentful paint fires due to pseudo-element becoming visible.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-svg.html]
[First contentful paint fires when SVG becomes contentful.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-typographic-pseudo.html]
[First contentful paint fires only when some of the text is visible, considering ::first-letter.]
expected: FAIL

View File

@ -1,5 +1,4 @@
[fcp-video-frame.html]
expected: TIMEOUT
[Video should become contentful when first frame is loaded]
expected: TIMEOUT # Bug 1652605
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-video-poster.html]
[Video should become contentful when poster is loaded]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-whitespace.html]
[Whitespace should not count as contentful.]
expected: FAIL

View File

@ -0,0 +1,4 @@
[fcp-with-rtl.html]
[FCP should fire when coordinates are negative, if within document scrollable area]
expected: FAIL

View File

@ -1,5 +1,4 @@
[first-contentful-bg-image.html]
expected: TIMEOUT
[First contentful paint fires due to background image render.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -1,5 +1,4 @@
[first-contentful-canvas.html]
expected: TIMEOUT
[First contentful paint fires due to canvas render.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -2,5 +2,5 @@
expected:
if processor == "aarch64": [OK, TIMEOUT, CRASH]
[First contentful paint fires due to image render.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -1,5 +1,4 @@
[first-contentful-paint.html]
expected: TIMEOUT
[First Paint triggered by non-contentful paint. Image load triggers First Contentful Paint.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -1,5 +1,4 @@
[first-contentful-svg.html]
expected: TIMEOUT
[First contentful paint fires due to svg.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -1,5 +1,4 @@
[first-image-child.html]
expected: TIMEOUT
[Child iframe ignores paint-timing events fired from parent image rendering.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -1,5 +1,4 @@
[first-paint-bg-color.html]
expected: TIMEOUT
[First paint fires due to background color. No FCP]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -1,5 +1,4 @@
[first-paint-only.html]
expected: TIMEOUT
[Performance first paint timing entry exists. No first contentful paint.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -0,0 +1,32 @@
[idlharness.window.html]
expected:
if webrender and debug and (os == "linux"): ["OK", "TIMEOUT"]
[PerformancePaintTiming interface: existence and properties of interface object]
expected: FAIL
[PerformancePaintTiming interface object length]
expected: FAIL
[PerformancePaintTiming interface object name]
expected: FAIL
[PerformancePaintTiming interface: existence and properties of interface prototype object]
expected: FAIL
[PerformancePaintTiming interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
[PerformancePaintTiming interface: existence and properties of interface prototype object's @@unscopables property]
expected: FAIL
[PerformancePaintTiming must be primary interface of paintTiming]
expected: FAIL
[Stringification of paintTiming]
expected: FAIL
[idl_test setup]
expected:
if webrender and debug and (os == "linux"): ["FAIL", "TIMEOUT"]
FAIL

View File

@ -0,0 +1,5 @@
[input-text.html]
expected: TIMEOUT
[Text from a form control triggers First Contentful Paint.]
expected: TIMEOUT

View File

@ -1,5 +1,4 @@
[paint-visited.html]
expected: TIMEOUT
[Visited-attack test to check existence of FP and FCP.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -1,5 +1,4 @@
[sibling-painting-first-image.html]
expected: TIMEOUT
[Frame ignores paint-timing events fired from sibling frame.]
expected: TIMEOUT # Expect timeout because we don't have FP
expected: FAIL

View File

@ -0,0 +1,8 @@
[supported-paint-type.window.html]
expected: TIMEOUT
[supportedEntryTypes contains 'paint'.]
expected: FAIL
['paint' entries should be observable.]
expected: TIMEOUT

View File

@ -4,37 +4,19 @@
<script src="/resources/testharnessreport.js"></script>
<script>
var entriesExpectToReceive = [
{
'entryType': 'paint',
'name': 'first-paint'
},
{
'entryType': 'paint',
'name': 'first-contentful-paint'
}
];
setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
window.addEventListener('message', t.step_func(e => {
assert_equals(e.data, '2 paint first-paint paint first-contentful-paint');
// When only child frame paints, expect only first-paint.
for (let i = 0; i < entriesExpectToReceive.length; i++) {
if (entriesExpectToReceive[i].entryType == e.data.entryType &&
entriesExpectToReceive[i].name == e.data.name) {
entriesExpectToReceive.splice(i, 1);
break;
}
}
if (entriesExpectToReceive.length == 0) {
t.step_timeout( function() {
const bufferedEntries = performance.getEntriesByType('paint');
assert_equals(bufferedEntries.length, 1);
assert_equals(bufferedEntries[0].entryType, 'paint');
assert_equals(bufferedEntries[0].name, 'first-paint');
t.done();
}
}, 50);
}));
const iframe = document.createElement('iframe');
iframe.id = 'child-iframe';

View File

@ -22,17 +22,7 @@
<script src="../resources/utils.js"></script>
<div id="main"></div>
<script>
// Load the image into memory first to make sure it's decoded.
function load_image() {
const img = document.createElement("img");
img.src = "../resources/circles.png";
return new Promise(resolve => {
img.onload = async () => resolve();
});
}
test_fcp("First contentful paint fires due to background size.", load_image);
test_fcp("First contentful paint fires due to background size.");
</script>
</body>
</html>

View File

@ -20,17 +20,7 @@
<script src="../resources/utils.js"></script>
<div id="main"></div>
<script>
// Load the image into memory first to make sure it's decoded.
function load_image() {
const img = document.createElement("img");
img.src = "../resources/circles.png";
return new Promise(resolve => {
img.onload = async () => resolve();
});
}
test_fcp("First contentful paint fires due to background image in image-set.", load_image);
test_fcp("First contentful paint fires due to background image in image-set.");
</script>
</body>
</html>

View File

@ -27,17 +27,7 @@
<script src="../resources/utils.js"></script>
<div id="main"></div>
<script>
// Load the image into memory first to make sure it's decoded.
function load_image() {
const img = document.createElement("img");
img.src = "../resources/circles.png";
return new Promise(resolve => {
img.onload = async () => resolve();
});
}
test_fcp("First contentful paint fires for background image only when visible.", load_image);
test_fcp("First contentful paint fires for background image only when visible.");
</script>
</body>

View File

@ -1,27 +0,0 @@
<!DOCTYPE html>
<head>
<title>
Performance Paint Timing Test: Not only the top level document, paints
in the iframe should also generate the entry
</title>
</head>
<body>
<script src="../resources/utils.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
setup({"hide_test_state": true});
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
window.addEventListener('message', t.step_func(e => {
if (e.data.entryType == "paint" && e.data.name == "first-contentful-paint") {
t.done();
}
}));
const iframe = document.createElement('iframe');
iframe.src = '../resources/subframe-painting.html';
document.body.appendChild(iframe);
}, 'Parent frame ignores paint-timing events fired from child image rendering.');
</script>
</body>
</html>

View File

@ -24,17 +24,7 @@
<script src="../resources/utils.js"></script>
<div id="main"></div>
<script>
// Load the image into memory first to make sure it's decoded.
function load_image() {
const img = document.createElement("img");
img.src = "../resources/circles.png";
return new Promise(resolve => {
img.onload = async () => resolve();
});
}
test_fcp("First contentful paint fires due to scale becoming positive.", load_image)
test_fcp("First contentful paint fires due to scale becoming positive.")
</script>
</body>
</html>

View File

@ -24,17 +24,7 @@
<script src="../resources/utils.js"></script>
<div id="main"></div>
<script>
// Load the image into memory first to make sure it's decoded.
function load_image() {
const img = document.createElement("img");
img.src = "../resources/circles.png";
return new Promise(resolve => {
img.onload = async () => resolve();
});
}
test_fcp("First contentful paint fires due to opacity-revealed element.", load_image);
test_fcp("First contentful paint fires due to opacity-revealed element.");
</script>
</body>
</html>

View File

@ -23,17 +23,7 @@
<script src="../resources/utils.js"></script>
<div id="main"></div>
<script>
// Load the image into memory first to make sure it's decoded.
function load_image() {
const img = document.createElement("img");
img.src = "../resources/circles.png";
return new Promise(resolve => {
img.onload = async () => resolve();
});
}
test_fcp("First contentful paint fires due to intersection with document.", load_image)
test_fcp("First contentful paint fires due to intersection with document.")
</script>
</body>
</html>

View File

@ -21,17 +21,7 @@
<div id="main">
</div>
<script>
// Load the image into memory first to make sure it's decoded.
function load_image() {
const img = document.createElement("img");
img.src = "../resources/circles.png";
return new Promise(resolve => {
img.onload = async () => resolve();
});
}
test_fcp("First contentful paint fires due to pseudo-element image.", load_image)
test_fcp("First contentful paint fires due to pseudo-element image.")
</script>
</body>

View File

@ -29,17 +29,7 @@
<div id="text">TEXT</div>
</div>
<script>
// Load the image into memory first to make sure it's decoded.
function load_image() {
const img = document.createElement("img");
img.src = "../resources/circles.png";
return new Promise(resolve => {
img.onload = async () => resolve();
});
}
test_fcp("Whitespace should not count as contentful.", load_image)
test_fcp("Whitespace should not count as contentful.")
</script>
</body>
</html>

View File

@ -4,20 +4,22 @@
<script>
const img = document.createElement('IMG');
img.src = 'circles.png';
var observer = new PerformanceObserver(function(list, obj) {
var paintEntries = list.getEntries();
for (let i = 0; i < paintEntries.length; i++) {
// postMessage doesn't allow sending the entry object over directly
var dataToSend = {
"entryType": paintEntries[i]["entryType"],
"name": paintEntries[i]["name"]
};
parent.postMessage(dataToSend, '*');
img.onload = function() {
function sendPaintEntries() {
const paintEntries = performance.getEntriesByType('paint');
if (paintEntries.length < 2) {
setTimeout(sendPaintEntries, 20);
return;
}
});
observer.observe({"type": "paint"});
let entryContents = paintEntries.length + '';
for (let i = 0; i < paintEntries.length; i++) {
const entry = paintEntries[i];
entryContents += ' ' + entry.entryType + ' ' + entry.name;
}
parent.postMessage(entryContents, '*');
};
sendPaintEntries();
};
document.getElementById('image').appendChild(img);
</script>
</body>

View File

@ -32,7 +32,7 @@ async function assertFirstContentfulPaint(t) {
});
}
async function test_fcp(label, before_assert_fcp_func) {
async function test_fcp(label) {
setup({"hide_test_state": true});
const style = document.createElement('style');
document.head.appendChild(style);
@ -43,9 +43,6 @@ async function test_fcp(label, before_assert_fcp_func) {
await assertNoFirstContentfulPaint(t);
main.className = 'preFCP';
await assertNoFirstContentfulPaint(t);
if (before_assert_fcp_func) {
await before_assert_fcp_func();
}
main.className = 'contentful';
await assertFirstContentfulPaint(t);
}, label);

View File

@ -6,35 +6,17 @@
<iframe id="listening-iframe" src="resources/subframe-sending-paint.html"></iframe>
<script>
setup({"hide_test_state": true});
var entriesExpectToReceive = [
{
'entryType': 'paint',
'name': 'first-paint'
},
{
'entryType': 'paint',
'name': 'first-contentful-paint'
}
];
async_test(function (t) {
assert_implements(window.PerformancePaintTiming, "Paint Timing isn't supported.");
let paintingIframeHasDispatchedEntries = false;
window.addEventListener('message', t.step_func(e => {
if (!paintingIframeHasDispatchedEntries) {
// Check paint-timing entries from the painting iframe.
for (let i = 0; i < entriesExpectToReceive.length; i++) {
if (entriesExpectToReceive[i].entryType == e.data.entryType &&
entriesExpectToReceive[i].name == e.data.name) {
entriesExpectToReceive.splice(i, 1);
break;
}
}
if (entriesExpectToReceive.length == 0) {
assert_equals(e.data, '2 paint first-paint paint first-contentful-paint');
paintingIframeHasDispatchedEntries = true;
// Ask the listening iframe to send its paint-timing entries.
document.getElementById('listening-iframe').
contentWindow.postMessage('', '*');
}
return;
}
// Check the paint-timing entries from the listening iframe.