зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
d720f61353
Коммит
7b214fd81a
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
virtual void SetFCPTimingEntry(PerformancePaintTiming* aEntry) override {
|
||||
MOZ_CRASH("This should not be called on workers.");
|
||||
}
|
||||
|
||||
TimeStamp CreationTimeStamp() const override;
|
||||
|
||||
DOMHighResTimeStamp CreationTime() const override;
|
||||
|
|
|
@ -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',
|
||||
|
|
Двоичные данные
dom/performance/tests/logo.png
Двоичные данные
dom/performance/tests/logo.png
Двоичный файл не отображается.
До Ширина: | Высота: | Размер: 21 KiB |
|
@ -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]
|
||||
|
|
|
@ -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() {
|
||||
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") {
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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',
|
||||
'PerformanceObserver.webidl',
|
||||
'PerformanceObserverEntryList.webidl',
|
||||
'PerformancePaintTiming.webidl',
|
||||
'PerformanceResourceTiming.webidl',
|
||||
'PerformanceServerTiming.webidl',
|
||||
'PerformanceTiming.webidl',
|
||||
|
|
|
@ -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),
|
||||
|
@ -2351,8 +2349,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,
|
||||
|
@ -2360,18 +2357,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) {
|
||||
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 HadContentfulPaint() const { return mHadContentfulPaint; }
|
||||
void NotifyNonBlankPaint();
|
||||
void NotifyContentfulPaint(const mozilla::TimeStamp& aTimeStamp);
|
||||
void NotifyContentfulPaint();
|
||||
void NotifyPaintStatusReset();
|
||||
void NotifyDOMContentFlushed();
|
||||
|
||||
bool HasEverBuiltInvisibleText() const { return mHasEverBuiltInvisibleText; }
|
||||
void SetBuiltInvisibleText() { mHasEverBuiltInvisibleText = true; }
|
||||
|
||||
bool UsesExChUnits() const { return mUsesExChUnits; }
|
||||
|
||||
void SetUsesExChUnits(bool aValue) { mUsesExChUnits = aValue; }
|
||||
|
@ -1280,7 +1277,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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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]
|
||||
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
|
||||
|
||||
|
|
|
@ -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]
|
||||
expected: TIMEOUT
|
||||
[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]
|
||||
expected: TIMEOUT
|
||||
[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]
|
||||
expected: TIMEOUT
|
||||
[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:
|
||||
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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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]
|
||||
expected: TIMEOUT
|
||||
[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]
|
||||
expected: TIMEOUT
|
||||
[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>
|
||||
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';
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
<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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
Загрузка…
Ссылка в новой задаче