Files
palemoon27/layout/base/nsLayoutDebugger.cpp
T
roytam1 73d964adbf import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 930218 part 1. Factor out the computation of block-size taken up by box-sizing into a separate function so we can reuse it. r=dbaron (22033f4184)
- Bug 930218 part 2. Account for the parent's box-sizing whe figuring out the percentage height of a kid with an intrinsic ratio for purposes of determining the parent's shrink-wrap width. r=dbaron (041711f58f)
- Bug 1235306 - Fix -Wimplicit-fallthrough warnings in layout/. r=dholbert (581c212254)
- Bug 1074971 - Add support for reserved commandkey combinations that can't be handled by content (e10s-only feature). r=smaug (e43d39dcef)
- Bug 1186799 part.1 nsHTMLEditorEventListener should commit composition when it receives unacceptable mousedown event r=smaug (17f2c48e96)
- Bug 1230216 - Changing nsIDOM*Event interfaces so that they don't inherit nsIDOMEvent. r=smaug (df77f91ecc)
- fix cancelBubble situation and align to gecko (bc133dc50a)
- Bug 1211402. Re-enable the upload step, but take out the stuff that no longer works (as in, everything.) r=me (cb7abd67d2)
- align (bac4aec6cc)
- Bug 1243608: P1. Only use video time if video frame contains seek target. r=cpearce (21d9e988ed)
- Bug 1244477: Offset seek time by start time. r=jwwang (743c24b2f7)
- Bug 1243608: P2. Pass the full SeekTarget object to MediaDecoderReader::Seek. r=cpearce (6ff30b4b65)
- Bug 1243608: P3. Make SeekTarget::mTime a TimeUnit object. r=cpearce (357d9864de)
- Bug 1243608: P4. Have MediaDecoderReader::SeekPromise return a TimeUnit. r=cpearce (53b476c62d)
- Bug 1159343: Interrupt seek early when possible. r=jwwang (9e26e69593)
- Bug 1243608: P5. Add type utility methods to SeekTarget class. r=cpearce (8e740bab50)
- Bug 1243608: P6. Only seek audio to video seek time when performing a fast seek. r=cpearce (d2a51a71f0)
- Bug 1233650. Part 1 - extract OutputStreamManager to its own file. r=roc. (52d533f923)
- Bug 1230882. Part 2 - remove DecodedStream::BeginShutdown() and other unused code. r=roc. (b2820b8f14)
- Bug 1231091. Part 1 - Add mVideoCompleted so MDSM can check when audio/video is done rendering. This removes the only caller of DecodedStream::IsFinished(). r=roc. (536f63e385)
- Bug 1146086: Properly marking overridden member with override keyword. v2. a=bustage (b6ed1b4e6c)
- Bug 1177243 - Use PodZero rather than memset in WebM decoders. r=rillian (f9853b72ee)
- Bug 1230054: Remove unused WebMReader. r=kinetik (1f88fe3c43)
- Bug 1230054: Add missing headers ON A CLOSED TREE. r=me (6e33accf03)
- Bug 1231091. Part 2 - return correct promises when audio/video track is asked. r=roc. (aef6342e59)
- Bug 1231091. Part 3 - resolve the end promise when all frames are rendered. r=roc. (bbb180dd90)
- Bug 1231091. Part 4 - ensure the end promise is resolved in the special case where video duration is 0. r=roc. (7835c31e75)
- Bug 1231091. Part 5 - Remove DecodedStream::IsFinished() and unused code. r=roc. (6dd02e5d6b)
- Bug 1231091. Part 6 - fix test_streams_element_capture.html timeout. r=roc. (8aae5c09cc)
- Bug 1232520 - dont' invoke AbstractThread::MainThread()->Dispatch() to avoid reentrant of AutoTaskDispatcher during tail dispatching phase. r=jya. (5434d0f370)
- Bug 1233650. Part 2 - make OutputStreamManager ref-counted so it can be shared between MDSM and DecodedStream. r=roc. (93e7d0e065)
- Bug 1233650. Part 3 - move creation of OutputStreamManager from DecodedStream to MDSM. r=roc. (a469dbcc9f)
- Bug 1233650. Part 4 - remove unused functions from DecodedStream. r=roc. (ec8753365e)
- Bug 1248314. Part 1 - Since OutputStreamManager::Connect/Disconnect is tightly coupled with the constructor/destructor of DecodedStreamData, it would improve cohesion to let DecodedStreamData manage an OutputStreamManager and know when to call OutputStreamManager::Connect/Disconnect. r=roc. (467d1472ca)
- Bug 1234424. Part 1 - share the underlying value of MDSM::mSameOriginMedia with DecodedStream. r=roc. (ff0abefb26)
- Bug 1234424. Part 2 - remove unused code. r=roc. (5a8266779b)
- Bug 1248314. part 2 - move track initialization code into the constructor of DecodedStreamData. r=roc. (4d57f47654)
- Bug 1248229. Part 1 - add test case to test if playback can work correctly after GC. r=roc. (83c81dc7cc)
- Bug 1248229. Part 2 - GC might happen in between OutputStreamManager::Disconnect() and OutputStreamManager::Connect(). We need to check if the stream is already destroyed before trying to connect it. r=roc. (c5a0ed670c)
- remove PM leftover (ed9ce00aad)
- Bug 1236703: P1. Add debugging information for MSE to about:media plugin. r=kentuckyfriedtakahe (4385a86197)
- Bug 1236703: P2. Add methods to retrieve debugging data on plain readers. r=jwwang (34bf637124)
- Bug 1236703: P3. Add moz specific method to retrieve debug data to media object IDL. r=bz (65c95eff74)
- Bug 1194721: Add additional PDU pack and unpack functions, r=shuang (d6ae416a10)
- Bug 1261307: Convert Unix socket IPC code to |UniquePtr|, r=nfroyd (cd797f4581)
- Bug 1236574 - use UniquePtr<T[]> instead of nsAutoArrayPtr<T> in SocketBase subclasses; r=tzimmerman (6a20e9e905)
- Bug 1239207 - Don't process IPDL when not compiling; r=glandium (20ba7fb311)
- Bug 1210099 - Use diagnostic assert for union discriminator checks (r=jld) (74844eee1b)
- Bug 1208226 - Don't crash when failing to map a segment of shared memory. r=sotaro, billm (1822a634d9)
- Bug 1236635 - Fix compile error in IPC unit tests (r=jld) (c82e0bfe61)
- Bug 1263429 - Don't build libevent with sysctl on Linux. r=billm (00f248f61e)
- Bug 1304266 - Remove libevent workaround for MacOS 10.4 bug (r=dvander) a=jcristau (676758a926)
- Bug 1241776 - turn ENABLE_SHARED_ARRAY_BUFFER on for all channels. r=nbp (dc53fff545)
- Bug 1248851 part 1 - Explicitly mark some release() calls result-unused. r=Waldo (b377e3d86e)
- Bug 1246697 - Use simpler semantics for PersistentRooted<Traceable>; r=sfink (7afab5c807)
- bug 1225649 use CreatePlanarYCbCrImage() now that CreateImage() is gone r=dvander (b8a30f3d84)
- Bug 1234092: P1. Remove GStreamer support. r=kentuckyfriedtakahe (bf6a5d8811)
- Bug 1234092: P2. Remove GStreamer check from configure. r=glandium (73b69b41db)
- remove configure options (f9585af0d1)
- Bug 1168309 - Add the define, MOZ_GONK_MEDIACODEC, to dom/media. r=cpearce. (a4481af932)
- Bug 1240616 - mach mochitest-run suggests deprecated commands as an alternative r=cmanchester (17687db974)
- Bug 1249838 - Avoid dependency from the mozconfig loader on mach. r=gps (a88506c027)
- Bug 382721 - Part 0: Add missing includes and namespaces. r=jrmuizel (eecf253c5e)
2023-10-26 14:38:41 +08:00

291 lines
8.4 KiB
C++

/* -*- Mode: C++; 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/. */
/*
* implementation of interface that allows layout-debug extension access
* to some internals of layout
*/
#include "nsILayoutDebugger.h"
#include "nsAttrValue.h"
#include "nsFrame.h"
#include "nsDisplayList.h"
#include "FrameLayerBuilder.h"
#include "nsPrintfCString.h"
#include "DisplayItemScrollClip.h"
#include <stdio.h>
using namespace mozilla;
using namespace mozilla::layers;
#ifdef DEBUG
class nsLayoutDebugger : public nsILayoutDebugger {
public:
nsLayoutDebugger();
NS_DECL_ISUPPORTS
NS_IMETHOD SetShowFrameBorders(bool aEnable) override;
NS_IMETHOD GetShowFrameBorders(bool* aResult) override;
NS_IMETHOD SetShowEventTargetFrameBorder(bool aEnable) override;
NS_IMETHOD GetShowEventTargetFrameBorder(bool* aResult) override;
protected:
virtual ~nsLayoutDebugger();
};
nsresult
NS_NewLayoutDebugger(nsILayoutDebugger** aResult)
{
NS_PRECONDITION(aResult, "null OUT ptr");
if (!aResult) {
return NS_ERROR_NULL_POINTER;
}
nsLayoutDebugger* it = new nsLayoutDebugger();
return it->QueryInterface(NS_GET_IID(nsILayoutDebugger), (void**)aResult);
}
nsLayoutDebugger::nsLayoutDebugger()
{
}
nsLayoutDebugger::~nsLayoutDebugger()
{
}
NS_IMPL_ISUPPORTS(nsLayoutDebugger, nsILayoutDebugger)
NS_IMETHODIMP
nsLayoutDebugger::SetShowFrameBorders(bool aEnable)
{
nsFrame::ShowFrameBorders(aEnable);
return NS_OK;
}
NS_IMETHODIMP
nsLayoutDebugger::GetShowFrameBorders(bool* aResult)
{
*aResult = nsFrame::GetShowFrameBorders();
return NS_OK;
}
NS_IMETHODIMP
nsLayoutDebugger::SetShowEventTargetFrameBorder(bool aEnable)
{
nsFrame::ShowEventTargetFrameBorder(aEnable);
return NS_OK;
}
NS_IMETHODIMP
nsLayoutDebugger::GetShowEventTargetFrameBorder(bool* aResult)
{
*aResult = nsFrame::GetShowEventTargetFrameBorder();
return NS_OK;
}
#endif
std::ostream& operator<<(std::ostream& os, const nsPrintfCString& rhs) {
os << rhs.get();
return os;
}
static void
PrintDisplayListTo(nsDisplayListBuilder* aBuilder, const nsDisplayList& aList,
std::stringstream& aStream, uint32_t aIndent, bool aDumpHtml);
static void
PrintDisplayItemTo(nsDisplayListBuilder* aBuilder, nsDisplayItem* aItem,
std::stringstream& aStream, uint32_t aIndent, bool aDumpSublist, bool aDumpHtml)
{
std::stringstream ss;
if (!aDumpHtml) {
for (uint32_t indent = 0; indent < aIndent; indent++) {
aStream << " ";
}
}
nsAutoString contentData;
nsIFrame* f = aItem->Frame();
#ifdef DEBUG_FRAME_DUMP
f->GetFrameName(contentData);
#endif
nsIContent* content = f->GetContent();
if (content) {
nsString tmp;
if (content->GetID()) {
content->GetID()->ToString(tmp);
contentData.AppendLiteral(" id:");
contentData.Append(tmp);
}
if (content->GetClasses()) {
content->GetClasses()->ToString(tmp);
contentData.AppendLiteral(" class:");
contentData.Append(tmp);
}
}
bool snap;
nsRect rect = aItem->GetBounds(aBuilder, &snap);
nsRect layerRect = rect - (*aItem->GetAnimatedGeometryRoot())->GetOffsetToCrossDoc(aItem->ReferenceFrame());
nscolor color;
nsRect vis = aItem->GetVisibleRect();
nsRect component = aItem->GetComponentAlphaBounds(aBuilder);
nsDisplayList* list = aItem->GetChildren();
const DisplayItemClip& clip = aItem->GetClip();
nsRegion opaque = aItem->GetOpaqueRegion(aBuilder, &snap);
#ifdef MOZ_DUMP_PAINTING
if (aDumpHtml && aItem->Painted()) {
nsCString string(aItem->Name());
string.Append('-');
string.AppendInt((uint64_t)aItem);
aStream << nsPrintfCString("<a href=\"javascript:ViewImage('%s')\">", string.BeginReading());
}
#endif
aStream << nsPrintfCString("%s p=0x%p f=0x%p(%s) %sbounds(%d,%d,%d,%d) layerBounds(%d,%d,%d,%d) visible(%d,%d,%d,%d) componentAlpha(%d,%d,%d,%d) clip(%s) scrollClip(%s)%s ref=0x%p agr=0x%p",
aItem->Name(), aItem, (void*)f, NS_ConvertUTF16toUTF8(contentData).get(),
(aItem->ZIndex() ? nsPrintfCString("z=%d ", aItem->ZIndex()).get() : ""),
rect.x, rect.y, rect.width, rect.height,
layerRect.x, layerRect.y, layerRect.width, layerRect.height,
vis.x, vis.y, vis.width, vis.height,
component.x, component.y, component.width, component.height,
clip.ToString().get(),
DisplayItemScrollClip::ToString(aItem->ScrollClip()).get(),
aItem->IsUniform(aBuilder, &color) ? " uniform" : "",
aItem->ReferenceFrame(), aItem->GetAnimatedGeometryRoot()->mFrame);
for (auto iter = opaque.RectIter(); !iter.Done(); iter.Next()) {
const nsRect& r = iter.Get();
aStream << nsPrintfCString(" (opaque %d,%d,%d,%d)", r.x, r.y, r.width, r.height);
}
if (aItem->Frame()->StyleDisplay()->mWillChange.Length() > 0) {
aStream << " (will-change=";
for (size_t i = 0; i < aItem->Frame()->StyleDisplay()->mWillChange.Length(); i++) {
if (i > 0) {
aStream << ",";
}
aStream << NS_LossyConvertUTF16toASCII(aItem->Frame()->StyleDisplay()->mWillChange[i]).get();
}
aStream << ")";
}
// Display item specific debug info
aItem->WriteDebugInfo(aStream);
#ifdef MOZ_DUMP_PAINTING
if (aDumpHtml && aItem->Painted()) {
aStream << "</a>";
}
#endif
uint32_t key = aItem->GetPerFrameKey();
Layer* layer = mozilla::FrameLayerBuilder::GetDebugOldLayerFor(f, key);
if (layer) {
if (aDumpHtml) {
aStream << nsPrintfCString(" <a href=\"#%p\">layer=%p</a>", layer, layer);
} else {
aStream << nsPrintfCString(" layer=0x%p", layer);
}
}
#ifdef MOZ_DUMP_PAINTING
if (aItem->GetType() == nsDisplayItem::TYPE_SVG_EFFECTS) {
nsCString str;
(static_cast<nsDisplaySVGEffects*>(aItem))->PrintEffects(str);
aStream << str.get();
}
#endif
aStream << "\n";
#ifdef MOZ_DUMP_PAINTING
if (aDumpHtml && aItem->Painted()) {
nsCString string(aItem->Name());
string.Append('-');
string.AppendInt((uint64_t)aItem);
aStream << nsPrintfCString("<br><img id=\"%s\">\n", string.BeginReading());
}
#endif
if (aDumpSublist && list) {
PrintDisplayListTo(aBuilder, *list, aStream, aIndent+1, aDumpHtml);
}
}
static void
PrintDisplayListTo(nsDisplayListBuilder* aBuilder, const nsDisplayList& aList,
std::stringstream& aStream, uint32_t aIndent, bool aDumpHtml)
{
if (aDumpHtml) {
aStream << "<ul>";
}
for (nsDisplayItem* i = aList.GetBottom(); i != nullptr; i = i->GetAbove()) {
if (aDumpHtml) {
aStream << "<li>";
}
PrintDisplayItemTo(aBuilder, i, aStream, aIndent, true, aDumpHtml);
if (aDumpHtml) {
aStream << "</li>";
}
}
if (aDumpHtml) {
aStream << "</ul>";
}
}
void
nsFrame::PrintDisplayList(nsDisplayListBuilder* aBuilder,
const nsDisplayList& aList,
std::stringstream& aStream,
bool aDumpHtml)
{
PrintDisplayListTo(aBuilder, aList, aStream, 0, aDumpHtml);
}
#ifdef MOZ_DUMP_PAINTING
static void
PrintDisplayListSetItem(nsDisplayListBuilder* aBuilder,
const char* aItemName,
const nsDisplayList& aList,
std::stringstream& aStream,
bool aDumpHtml)
{
if (aDumpHtml) {
aStream << "<li>";
}
aStream << aItemName << "\n";
PrintDisplayListTo(aBuilder, aList, aStream, 0, aDumpHtml);
if (aDumpHtml) {
aStream << "</li>";
}
}
void
nsFrame::PrintDisplayListSet(nsDisplayListBuilder* aBuilder,
const nsDisplayListSet& aSet,
std::stringstream& aStream,
bool aDumpHtml)
{
if (aDumpHtml) {
aStream << "<ul>";
}
PrintDisplayListSetItem(aBuilder, "[BorderBackground]", *(aSet.BorderBackground()), aStream, aDumpHtml);
PrintDisplayListSetItem(aBuilder, "[BlockBorderBackgrounds]", *(aSet.BlockBorderBackgrounds()), aStream, aDumpHtml);
PrintDisplayListSetItem(aBuilder, "[Floats]", *(aSet.Floats()), aStream, aDumpHtml);
PrintDisplayListSetItem(aBuilder, "[PositionedDescendants]", *(aSet.PositionedDescendants()), aStream, aDumpHtml);
PrintDisplayListSetItem(aBuilder, "[Outlines]", *(aSet.Outlines()), aStream, aDumpHtml);
PrintDisplayListSetItem(aBuilder, "[Content]", *(aSet.Content()), aStream, aDumpHtml);
if (aDumpHtml) {
aStream << "</ul>";
}
}
#endif