Backed out 6 changesets (bug 1518999) for geckoview failures on scrollToVerticalOnZoomedContentAuto.

Backed out changeset 10bf1552e301 (bug 1518999)
Backed out changeset e62cd63e3595 (bug 1518999)
Backed out changeset 1bf0b02bb0e0 (bug 1518999)
Backed out changeset 2203a9c52afa (bug 1518999)
Backed out changeset 10f07ca7a246 (bug 1518999)
Backed out changeset b90cf6b54c09 (bug 1518999)
This commit is contained in:
Cosmin Sabou 2020-08-25 01:02:36 +03:00
Родитель d720f61353
Коммит 7b214fd81a
80 изменённых файлов: 210 добавлений и 613 удалений

Просмотреть файл

@ -192,20 +192,13 @@ add_task(async function runRTPTests() {
content.performance.measure("Test-Measure", "Test", "Test-End"); content.performance.measure("Test-Measure", "Test", "Test-End");
// Check the entries for performance.getEntries/getEntriesByType/getEntriesByName. // 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( is(
content.performance.getEntries().length, content.performance.getEntries().length,
5, 4,
"For reduceTimerPrecision, there should be 4 entries for performance.getEntries()" "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 startTime = content.performance.getEntries()[i].startTime;
let duration = content.performance.getEntries()[i].duration; let duration = content.performance.getEntries()[i].duration;
ok( ok(

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -1,47 +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;
NS_IMPL_CYCLE_COLLECTION_INHERITED(PerformancePaintTiming, PerformanceEntry,
mPerformance)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(PerformancePaintTiming)
NS_INTERFACE_MAP_END_INHERITING(PerformanceEntry)
NS_IMPL_ADDREF_INHERITED(PerformancePaintTiming, PerformanceEntry)
NS_IMPL_RELEASE_INHERITED(PerformancePaintTiming, PerformanceEntry)
PerformancePaintTiming::PerformancePaintTiming(Performance* aPerformance,
const nsAString& aName,
const TimeStamp& aStartTime)
: PerformanceEntry(aPerformance->GetParentObject(), aName, u"paint"_ns),
mPerformance(aPerformance),
mStartTime(aStartTime) {}
PerformancePaintTiming::~PerformancePaintTiming() = default;
JSObject* PerformancePaintTiming::WrapObject(
JSContext* aCx, JS::Handle<JSObject*> aGivenProto) {
return PerformancePaintTiming_Binding::Wrap(aCx, this, aGivenProto);
}
DOMHighResTimeStamp PerformancePaintTiming::StartTime() const {
DOMHighResTimeStamp rawValue =
mPerformance->GetDOMTiming()->TimeStampToDOMHighRes(mStartTime);
return nsRFPService::ReduceTimePrecisionAsMSecs(
rawValue, mPerformance->GetRandomTimelineSeed(),
mPerformance->IsSystemPrincipal(), mPerformance->CrossOriginIsolated());
}
size_t PerformancePaintTiming::SizeOfIncludingThis(
mozilla::MallocSizeOf aMallocSizeOf) const {
return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf);
}

Просмотреть файл

@ -1,48 +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,
const TimeStamp& aStartTime);
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(PerformancePaintTiming,
PerformanceEntry)
JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
DOMHighResTimeStamp StartTime() const override;
size_t SizeOfIncludingThis(
mozilla::MallocSizeOf aMallocSizeOf) const override;
private:
~PerformancePaintTiming();
RefPtr<Performance> mPerformance;
const TimeStamp mStartTime;
};
} // namespace dom
} // namespace mozilla
#endif /* mozilla_dom_PerformanacePaintTiming_h___ */

Просмотреть файл

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

Просмотреть файл

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

Двоичные данные
dom/performance/tests/logo.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 21 KiB

Просмотреть файл

@ -14,14 +14,6 @@ support-files =
[test_performance_observer.html] [test_performance_observer.html]
[test_performance_user_timing.html] [test_performance_user_timing.html]
[test_performance_navigation_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_user_timing.html]
[test_worker_observer.html] [test_worker_observer.html]
[test_sharedWorker_performance_user_timing.html] [test_sharedWorker_performance_user_timing.html]

Просмотреть файл

@ -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>

Просмотреть файл

@ -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>

Просмотреть файл

@ -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>

Просмотреть файл

@ -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>

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -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
{
};

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -507,13 +507,6 @@ class nsDisplayVideo : public nsPaintedDisplayItem {
return elem->IsPotentiallyPlaying() ? LayerState::LAYER_ACTIVE_FORCE return elem->IsPotentiallyPlaying() ? LayerState::LAYER_ACTIVE_FORCE
: LayerState::LAYER_INACTIVE; : 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, void nsVideoFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,

Просмотреть файл

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

Просмотреть файл

@ -4678,14 +4678,6 @@ class nsDisplayBackgroundImage : public nsDisplayImageContainer {
nsDisplayImageContainer::RemoveFrame(aFrame); 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: protected:
typedef class mozilla::layers::ImageContainer ImageContainer; typedef class mozilla::layers::ImageContainer ImageContainer;
typedef class mozilla::layers::ImageLayer ImageLayer; typedef class mozilla::layers::ImageLayer ImageLayer;

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -1,5 +1,4 @@
[first-contentful-paint.html] [first-contentful-paint.html]
expected: TIMEOUT
[First Paint triggered by non-contentful paint. Image load triggers First Contentful Paint.] [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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

@ -22,17 +22,7 @@
<script src="../resources/utils.js"></script> <script src="../resources/utils.js"></script>
<div id="main"></div> <div id="main"></div>
<script> <script>
// Load the image into memory first to make sure it's decoded. test_fcp("First contentful paint fires due to background size.");
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);
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@ -20,17 +20,7 @@
<script src="../resources/utils.js"></script> <script src="../resources/utils.js"></script>
<div id="main"></div> <div id="main"></div>
<script> <script>
// Load the image into memory first to make sure it's decoded. test_fcp("First contentful paint fires due to background image in image-set.");
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);
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@ -27,17 +27,7 @@
<script src="../resources/utils.js"></script> <script src="../resources/utils.js"></script>
<div id="main"></div> <div id="main"></div>
<script> <script>
// Load the image into memory first to make sure it's decoded. test_fcp("First contentful paint fires for background image only when visible.");
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);
</script> </script>
</body> </body>

Просмотреть файл

@ -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>

Просмотреть файл

@ -24,17 +24,7 @@
<script src="../resources/utils.js"></script> <script src="../resources/utils.js"></script>
<div id="main"></div> <div id="main"></div>
<script> <script>
// Load the image into memory first to make sure it's decoded. test_fcp("First contentful paint fires due to scale becoming positive.")
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)
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@ -24,17 +24,7 @@
<script src="../resources/utils.js"></script> <script src="../resources/utils.js"></script>
<div id="main"></div> <div id="main"></div>
<script> <script>
// Load the image into memory first to make sure it's decoded. test_fcp("First contentful paint fires due to opacity-revealed element.");
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);
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@ -23,17 +23,7 @@
<script src="../resources/utils.js"></script> <script src="../resources/utils.js"></script>
<div id="main"></div> <div id="main"></div>
<script> <script>
// Load the image into memory first to make sure it's decoded. test_fcp("First contentful paint fires due to intersection with document.")
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)
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@ -21,17 +21,7 @@
<div id="main"> <div id="main">
</div> </div>
<script> <script>
// Load the image into memory first to make sure it's decoded. test_fcp("First contentful paint fires due to pseudo-element image.")
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)
</script> </script>
</body> </body>

Просмотреть файл

@ -29,17 +29,7 @@
<div id="text">TEXT</div> <div id="text">TEXT</div>
</div> </div>
<script> <script>
// Load the image into memory first to make sure it's decoded. test_fcp("Whitespace should not count as contentful.")
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)
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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