Files
palemoon27/docshell/base/timeline/ObservedDocShell.cpp
T
roytam1 71cc47fa2f import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1208937 - Remove gfxPattern::GraphicsPatternType. r=jwatt. (eeb6dec919)
- Bug 1196927 - Force plugin BGRX image surface data to always have valid alpha. r=jrmuizel, r=BenWa (80667ce488)
- Bug 1156800: Post a task to send async NPP_New result from child to parent; r=jimm (81c40319a5)
- Bug 1194955 - Fix -Wunreachable-code warnings in dom/ipc and dom/plugins. r=jimm (939ae937a8)
- Bug 1151694 - Part 3: Manage mIsRunningOnCompositor flags for each properties respectively. r=bbirtles (3146a696cc)
- Bug 1182931 - Expose assert_unreached in subwindows. r=bbirtles (1b2e6f05b5)
- Bug 1151694 - Part 4 - Able to use testcommon.js in the window which has no opener. r=bbirtles (82bc744d44)
- Bug 1151694 - Part 0: Rewrite test_running_on_compositor.html with add_task(). r=bbirtles (2e209051e3)
- Bug 1151694 - Part 5 - Additional tests for Animation.IsRunningOnCompositor. r=bbirtles (de9858a004)
- Bug 1151694 - Part 6 - A test case of Animation.isRunningOnCompositor for transition. r=bbirtles (54bd2a22ea)
- Bug 1184377 - Move nsDocShell::PopProfileTimelineMarkers logic to ObservedDocShell, r=smaug (31e96712ac)
- Bug 1190826 - Rename "AddMarkerTo*" to "AddMarkerFor*" to reflect the new philosophy behind markers, r=tromey (b7d5ae6314)
- Bug 1152080 - Plugin configuration clip rects should be treated as visible rects. r=roc (4a18e0bd33)
- Bug 1050498 - Record compositing operations, r=jsantell,smaug,tromey (4efa28f063)
- Bug 1161900 - Use ICU normalization support during shaping if available, to support decomposable characters in more recently-encoded scripts. r=jdaggett,gps (d687a634cf)
- Bug 1164835 - Use vertical presentation forms (where available) in vertical-upright text as fallback if the font does not support the 'vert' feature. r=jdaggett (983a6f0c20)
- Bug 1139646 - Ensure gfxHarfBuzzShaper only loads the vmtx table once, to avoid leaking it. r=smontagu (72b5e2a698)
- Bug 1139888 - Check for missing glyph metrics tables. r=jdaggett (7574fdcf7b)
- Bug 1137588 - patch 1 - Read the second array in 'vmtx' correctly to get glyph vertical origins. r=jdaggett (c835835237)
- Bug 1137588 - patch 2 - Use a better default vOrigin in fonts without real vertical metrics. r=jdaggett (ad1e27029e)
- Bug 1187145 - Replace nsBaseHashtable::Enumerate() calls in gfx/ with iterators r=njn (597ff872bc)
- Bug 729993 - Use finer HarfBuzz cluster level. r=jfkthame (9b99d11def)
- missing of Bug 1148660 - Correct the handling of glyph positioning offsets in vertical-upright mode. r=jdaggett (b32d14d197)
- Bug 1178753 - Always enable async-video when OMTC is enabled. r=sotaro (c61f2a0be3)
- Bug 1164735 - Move gPrefLangToLangGroups[] inside a function to avoid a static constructor. r=jdaggett (a6a4060db9)
- Bug 1163488 - use the preprocessor to keep font lang arrays in sync. r=m_kato (6d9747d144)
- Bug 1188995 - Increase tile size to 512/1024 on OSX. r=jrmuizel,mstange (e94187af4b)
- Bug 1186661 - Use monitors-changed signal to update screen manager on GTK. r=karlt (97e0393eb6)
- Bug 1191040 - Ensure that we only compute the tile size once. r=BenWa (b954ce41ac)
- Bug 1182665 - Add gfxPlatform::GetScreenSize() and use nsIScreen for gfxPlatform::GetScreenDepth() r=nical (91a24e82ec)
- Bug 1182665 - Adjust tile sizes depending on the screen size r=nical (319945c03a)
- Bug 1173579 - Take the first valid default font. r=jdagget (d03c594b94)
- Bug 1189158 - shutdown font loader thread in separate event. r=m_kato (c497e32155)
- Bug 1189129 - annotate no default font aborts. r=bas (c20fc90269)
- Bug 1204400 - Fix -Wshadow warnings in gfx/thebes and suppress those from Skia headers. r=BenWa (435b12fbb2)
- Bug 1192699 - eliminate the two-stage system fontlist initialization under DirectWrite. r=m_kato (eb458720a1)
- Bug 1194707 - Remove the docshell param from TimelineMarker constructors, r=tromey (c77c934021)
- Bug 1195838 - Maintain all the TimelineMarker subclasses in a single place, r=tromey (c2da168977)
- Bug 697981 - Prevent reloading of spelling dictionary on unfocused editors; r=roc (ec2ed87554)
- Bug 1184249 - Remove warning if rootContent is null in nsEditorSpellCheck::UpdateCurrentDictionary. r=ehsan (8a828662d6)
- Bug 717433 - Make selected language stick, regardless of whether it partly matches (test). r=roc (38a92a487f)
- adapt Bug 717433 - Make selected language stick, regardless of whether it partly matches. r=roc (6a0d7f2a8b)
- extended Bug 1200533 - Fix spellchecker dictionary logic. r=smaug (39228d4225)
- Bug 1204147 - Prevent content preferences being written when they shouldn't. r=roc (bff4c98f6d)
- Bug 1193293 - Don't pick a new dictionary which checking. r=roc (021da43b73)
- Bug 1205983 - Remove all observer code from nsEditor. r=ehsan (aaf27ca6dc)
- Bug 1205796 - "Coverity 1323784 indicates a useless passed-by-value argument in nsEditorSpellCheck::TryDictionary". r=smaug (a60feb5f61)
- Bug 309731 - Allow document.execCommand('inserthtml') with an empty string parameter. r=ehsan (4956ee404b)
2022-08-29 09:53:04 +08:00

130 lines
4.8 KiB
C++

/* -*- 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 "ObservedDocShell.h"
#include "TimelineMarker.h"
#include "LayerTimelineMarker.h"
#include "mozilla/Move.h"
namespace mozilla {
ObservedDocShell::ObservedDocShell(nsDocShell* aDocShell)
: mDocShell(aDocShell)
{}
void
ObservedDocShell::AddMarker(UniquePtr<TimelineMarker>&& aMarker)
{
mTimelineMarkers.AppendElement(Move(aMarker));
}
void
ObservedDocShell::ClearMarkers()
{
mTimelineMarkers.Clear();
}
void
ObservedDocShell::PopMarkers(JSContext* aCx,
nsTArray<dom::ProfileTimelineMarker>& aStore)
{
// If we see an unpaired START, we keep it around for the next call
// to ObservedDocShell::PopMarkers. We store the kept START objects here.
nsTArray<UniquePtr<TimelineMarker>> keptStartMarkers;
for (uint32_t i = 0; i < mTimelineMarkers.Length(); ++i) {
UniquePtr<TimelineMarker>& startPayload = mTimelineMarkers[i];
// If this is a TRACING_TIMESTAMP marker, there's no corresponding END
// as it's a single unit of time, not a duration.
if (startPayload->GetMetaData() == TRACING_TIMESTAMP) {
dom::ProfileTimelineMarker* marker = aStore.AppendElement();
marker->mName = NS_ConvertUTF8toUTF16(startPayload->GetName());
marker->mStart = startPayload->GetTime();
marker->mEnd = startPayload->GetTime();
marker->mStack = startPayload->GetStack();
startPayload->AddDetails(aCx, *marker);
continue;
}
// Whenever a START marker is found, look for the corresponding END
// and build a {name,start,end} JS object.
if (startPayload->GetMetaData() == TRACING_INTERVAL_START) {
bool hasSeenEnd = false;
// "Paint" markers are different because painting is handled at root
// docshell level. The information that a paint was done is stored at
// sub-docshell level, but we can only be sure that a paint did actually
// happen in if a "Layer" marker was recorded too.
bool startIsPaintType = strcmp(startPayload->GetName(), "Paint") == 0;
bool hasSeenLayerType = false;
// If we are processing a "Paint" marker, we append information from
// all the embedded "Layer" markers to this array.
dom::Sequence<dom::ProfileTimelineLayerRect> layerRectangles;
// DOM events can be nested, so we must take care when searching
// for the matching end. It doesn't hurt to apply this logic to
// all event types.
uint32_t markerDepth = 0;
// The assumption is that the devtools timeline flushes markers frequently
// enough for the amount of markers to always be small enough that the
// nested for loop isn't going to be a performance problem.
for (uint32_t j = i + 1; j < mTimelineMarkers.Length(); ++j) {
UniquePtr<TimelineMarker>& endPayload = mTimelineMarkers[j];
bool endIsLayerType = strcmp(endPayload->GetName(), "Layer") == 0;
// Look for "Layer" markers to stream out "Paint" markers.
if (startIsPaintType && endIsLayerType) {
LayerTimelineMarker* layerPayload = static_cast<LayerTimelineMarker*>(endPayload.get());
layerPayload->AddLayerRectangles(layerRectangles);
hasSeenLayerType = true;
}
if (!startPayload->Equals(*endPayload)) {
continue;
}
if (endPayload->GetMetaData() == TRACING_INTERVAL_START) {
++markerDepth;
continue;
}
if (endPayload->GetMetaData() == TRACING_INTERVAL_END) {
if (markerDepth > 0) {
--markerDepth;
continue;
}
if (!startIsPaintType || (startIsPaintType && hasSeenLayerType)) {
dom::ProfileTimelineMarker* marker = aStore.AppendElement();
marker->mName = NS_ConvertUTF8toUTF16(startPayload->GetName());
marker->mStart = startPayload->GetTime();
marker->mEnd = endPayload->GetTime();
marker->mStack = startPayload->GetStack();
if (hasSeenLayerType) {
marker->mRectangles.Construct(layerRectangles);
}
startPayload->AddDetails(aCx, *marker);
endPayload->AddDetails(aCx, *marker);
}
hasSeenEnd = true;
break;
}
}
// If we did not see the corresponding END, keep the START.
if (!hasSeenEnd) {
keptStartMarkers.AppendElement(Move(mTimelineMarkers[i]));
mTimelineMarkers.RemoveElementAt(i);
--i;
}
}
}
mTimelineMarkers.SwapElements(keptStartMarkers);
}
} // namespace mozilla