mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-30 04:17:31 +09:00
Bug 1377648 - Fix HTMLSummaryElement::IsSummary() on removing the element
* Use inFlowFrame to check the target frame is summary and its parent is details * Check summary frame instead of summary element on removing the summary Tag #1375
This commit is contained in:
parent
9b868f0298
commit
84d3b44b86
4 changed files with 35 additions and 12 deletions
|
|
@ -9395,23 +9395,6 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (insertionFrame &&
|
|
||||||
aFrame->GetParent()->GetType() == nsGkAtoms::detailsFrame) {
|
|
||||||
HTMLSummaryElement* summary =
|
|
||||||
HTMLSummaryElement::FromContent(insertionFrame->GetContent());
|
|
||||||
|
|
||||||
if (summary && summary->IsMainSummary()) {
|
|
||||||
// When removing a summary, we should reframe the parent details frame to
|
|
||||||
// ensure that another summary is used or the default summary is
|
|
||||||
// generated.
|
|
||||||
RecreateFramesForContent(aFrame->GetParent()->GetContent(),
|
|
||||||
false, REMOVE_FOR_RECONSTRUCTION,
|
|
||||||
aDestroyedFramesFor);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now check for possibly needing to reconstruct due to a pseudo parent
|
|
||||||
nsIFrame* inFlowFrame =
|
nsIFrame* inFlowFrame =
|
||||||
(aFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW) ?
|
(aFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW) ?
|
||||||
aFrame->GetPlaceholderFrame() : aFrame;
|
aFrame->GetPlaceholderFrame() : aFrame;
|
||||||
|
|
@ -9419,6 +9402,27 @@ nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame,
|
||||||
MOZ_ASSERT(inFlowFrame == inFlowFrame->FirstContinuation(),
|
MOZ_ASSERT(inFlowFrame == inFlowFrame->FirstContinuation(),
|
||||||
"placeholder for primary frame has previous continuations?");
|
"placeholder for primary frame has previous continuations?");
|
||||||
nsIFrame* parent = inFlowFrame->GetParent();
|
nsIFrame* parent = inFlowFrame->GetParent();
|
||||||
|
|
||||||
|
if (parent && parent->GetType() == nsGkAtoms::detailsFrame) {
|
||||||
|
HTMLSummaryElement* summary =
|
||||||
|
HTMLSummaryElement::FromContent(aFrame->GetContent());
|
||||||
|
DetailsFrame* detailsFrame = static_cast<DetailsFrame*>(parent);
|
||||||
|
|
||||||
|
// Unlike adding summary element cases, we need to check children of the
|
||||||
|
// parent details frame since at this moment the summary element has been
|
||||||
|
// already removed from the parent details element's child list.
|
||||||
|
if (summary && detailsFrame->HasMainSummaryFrame(aFrame)) {
|
||||||
|
// When removing a summary, we should reframe the parent details frame to
|
||||||
|
// ensure that another summary is used or the default summary is
|
||||||
|
// generated.
|
||||||
|
RecreateFramesForContent(parent->GetContent(),
|
||||||
|
false, REMOVE_FOR_RECONSTRUCTION,
|
||||||
|
aDestroyedFramesFor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now check for possibly needing to reconstruct due to a pseudo parent
|
||||||
// For the case of ruby pseudo parent, effectively, only pseudo rb/rt frame
|
// For the case of ruby pseudo parent, effectively, only pseudo rb/rt frame
|
||||||
// need to be checked here, since all other types of parent will be catched
|
// need to be checked here, since all other types of parent will be catched
|
||||||
// by "Check ruby containers" section below.
|
// by "Check ruby containers" section below.
|
||||||
|
|
|
||||||
|
|
@ -129,3 +129,12 @@ DetailsFrame::AppendAnonymousContentTo(nsTArray<nsIContent*>& aElements,
|
||||||
aElements.AppendElement(mDefaultSummary);
|
aElements.AppendElement(mDefaultSummary);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
DetailsFrame::HasMainSummaryFrame(nsIFrame* aSummaryFrame)
|
||||||
|
{
|
||||||
|
nsIFrame* firstChild =
|
||||||
|
nsPlaceholderFrame::GetRealFrameFor(mFrames.FirstChild());
|
||||||
|
|
||||||
|
return aSummaryFrame == firstChild;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,12 @@ public:
|
||||||
|
|
||||||
void AppendAnonymousContentTo(nsTArray<nsIContent*>& aElements,
|
void AppendAnonymousContentTo(nsTArray<nsIContent*>& aElements,
|
||||||
uint32_t aFilter) override;
|
uint32_t aFilter) override;
|
||||||
|
// Returns true if |aSummaryFrame| is the main summary (i.e. the first child
|
||||||
|
// of this details frame).
|
||||||
|
// This function is used when the summary element is removed from the parent
|
||||||
|
// details element since at that moment the summary element has been already
|
||||||
|
// removed from the details element children.
|
||||||
|
bool HasMainSummaryFrame(nsIFrame* aSummaryFrame);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
nsCOMPtr<nsIContent> mDefaultSummary;
|
nsCOMPtr<nsIContent> mDefaultSummary;
|
||||||
|
|
|
||||||
|
|
@ -101,3 +101,7 @@ fuzzy(1,1) == mouse-click-twice-float-details.html float-details.html # Bug 1316
|
||||||
== details-before.html single-summary.html
|
== details-before.html single-summary.html
|
||||||
== open-details-after.html open-single-summary.html
|
== open-details-after.html open-single-summary.html
|
||||||
== open-details-before.html open-single-summary.html
|
== open-details-before.html open-single-summary.html
|
||||||
|
|
||||||
|
# Move summary element
|
||||||
|
== move-float-summary-to-different-details.html move-float-summary-to-different-details-ref.html
|
||||||
|
== move-position-absolute-summary-to-different-details.html move-position-absolute-summary-to-different-details-ref.html
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue