mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Back out 3 changesets (bug 1216001) for Win8 reftest failures in 1193519-sideways-lr-3.html and 1193519-sideways-lr-4.html and intermittent OS X failures in font-display-2.html
CLOSED TREE Backed out changeset dbadb8fe5803 (bug 1216001) Backed out changeset a30593ebd58e (bug 1216001) Backed out changeset c1646ffa71b4 (bug 1216001)
This commit is contained in:
parent
8f831dd761
commit
a7a085691d
@ -151,34 +151,6 @@ GetNextRangeCommonAncestor(nsINode* aNode)
|
||||
return aNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* A Comparator suitable for mozilla::BinarySearchIf for searching a collection
|
||||
* of nsRange* for an overlap of (mNode, mStartOffset) .. (mNode, mEndOffset).
|
||||
*/
|
||||
struct IsItemInRangeComparator
|
||||
{
|
||||
nsINode* mNode;
|
||||
uint32_t mStartOffset;
|
||||
uint32_t mEndOffset;
|
||||
|
||||
int operator()(const nsRange* const aRange) const
|
||||
{
|
||||
int32_t cmp = nsContentUtils::ComparePoints(mNode, mEndOffset,
|
||||
aRange->GetStartParent(),
|
||||
aRange->StartOffset());
|
||||
if (cmp == 1) {
|
||||
cmp = nsContentUtils::ComparePoints(mNode, mStartOffset,
|
||||
aRange->GetEndParent(),
|
||||
aRange->EndOffset());
|
||||
if (cmp == -1) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
||||
/* static */ bool
|
||||
nsRange::IsNodeSelected(nsINode* aNode, uint32_t aStartOffset,
|
||||
uint32_t aEndOffset)
|
||||
@ -188,45 +160,24 @@ nsRange::IsNodeSelected(nsINode* aNode, uint32_t aStartOffset,
|
||||
nsINode* n = GetNextRangeCommonAncestor(aNode);
|
||||
NS_ASSERTION(n || !aNode->IsSelectionDescendant(),
|
||||
"orphan selection descendant");
|
||||
|
||||
// Collect the potential ranges and their selection objects.
|
||||
RangeHashTable ancestorSelectionRanges;
|
||||
nsTHashtable<nsPtrHashKey<Selection>> ancestorSelections;
|
||||
uint32_t maxRangeCount = 0;
|
||||
for (; n; n = GetNextRangeCommonAncestor(n->GetParentNode())) {
|
||||
RangeHashTable* ranges =
|
||||
static_cast<RangeHashTable*>(n->GetProperty(nsGkAtoms::range));
|
||||
for (auto iter = ranges->ConstIter(); !iter.Done(); iter.Next()) {
|
||||
nsRange* range = iter.Get()->GetKey();
|
||||
if (range->IsInSelection() && !range->Collapsed()) {
|
||||
ancestorSelectionRanges.PutEntry(range);
|
||||
Selection* selection = range->mSelection;
|
||||
ancestorSelections.PutEntry(selection);
|
||||
maxRangeCount = std::max(maxRangeCount, selection->RangeCount());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!ancestorSelectionRanges.IsEmpty()) {
|
||||
nsTArray<const nsRange*> sortedRanges(maxRangeCount);
|
||||
for (auto iter = ancestorSelections.ConstIter(); !iter.Done(); iter.Next()) {
|
||||
Selection* selection = iter.Get()->GetKey();
|
||||
// Sort the found ranges for |selection| in document order
|
||||
// (Selection::GetRangeAt returns its ranges ordered).
|
||||
for (uint32_t i = 0, len = selection->RangeCount(); i < len; ++i) {
|
||||
nsRange* range = selection->GetRangeAt(i);
|
||||
if (ancestorSelectionRanges.Contains(range)) {
|
||||
sortedRanges.AppendElement(range);
|
||||
int32_t cmp = nsContentUtils::ComparePoints(aNode, aEndOffset,
|
||||
range->GetStartParent(),
|
||||
range->StartOffset());
|
||||
if (cmp == 1) {
|
||||
cmp = nsContentUtils::ComparePoints(aNode, aStartOffset,
|
||||
range->GetEndParent(),
|
||||
range->EndOffset());
|
||||
if (cmp == -1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
MOZ_ASSERT(!sortedRanges.IsEmpty());
|
||||
// Binary search the now sorted ranges.
|
||||
IsItemInRangeComparator comparator = { aNode, aStartOffset, aEndOffset };
|
||||
size_t unused;
|
||||
if (mozilla::BinarySearchIf(sortedRanges, 0, sortedRanges.Length(), comparator, &unused)) {
|
||||
return true;
|
||||
}
|
||||
sortedRanges.ClearAndRetainStorage();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@ -3154,12 +3105,6 @@ nsRange::Constructor(const GlobalObject& aGlobal,
|
||||
return window->GetDoc()->CreateRange(aRv);
|
||||
}
|
||||
|
||||
static bool ExcludeIfNextToNonSelectable(nsIContent* aContent)
|
||||
{
|
||||
return aContent->IsNodeOfType(nsINode::eTEXT) &&
|
||||
aContent->HasFlag(NS_CREATE_FRAME_IF_NON_WHITESPACE);
|
||||
}
|
||||
|
||||
void
|
||||
nsRange::ExcludeNonSelectableNodes(nsTArray<RefPtr<nsRange>>* aOutRanges)
|
||||
{
|
||||
@ -3178,10 +3123,6 @@ nsRange::ExcludeNonSelectableNodes(nsTArray<RefPtr<nsRange>>* aOutRanges)
|
||||
|
||||
bool added = false;
|
||||
bool seenSelectable = false;
|
||||
// |firstNonSelectableContent| is the first node in a consecutive sequence
|
||||
// of non-IsSelectable nodes. When we find a selectable node after such
|
||||
// a sequence we'll end the last nsRange, create a new one and restart
|
||||
// the outer loop.
|
||||
nsIContent* firstNonSelectableContent = nullptr;
|
||||
while (true) {
|
||||
ErrorResult err;
|
||||
@ -3191,19 +3132,12 @@ nsRange::ExcludeNonSelectableNodes(nsTArray<RefPtr<nsRange>>* aOutRanges)
|
||||
nsIContent* content =
|
||||
node && node->IsContent() ? node->AsContent() : nullptr;
|
||||
if (content) {
|
||||
if (firstNonSelectableContent && ExcludeIfNextToNonSelectable(content)) {
|
||||
// Ignorable whitespace next to a sequence of non-selectable nodes
|
||||
// counts as non-selectable (bug 1216001).
|
||||
selectable = false;
|
||||
nsIFrame* frame = content->GetPrimaryFrame();
|
||||
for (nsIContent* p = content; !frame && (p = p->GetParent()); ) {
|
||||
frame = p->GetPrimaryFrame();
|
||||
}
|
||||
if (selectable) {
|
||||
nsIFrame* frame = content->GetPrimaryFrame();
|
||||
for (nsIContent* p = content; !frame && (p = p->GetParent()); ) {
|
||||
frame = p->GetPrimaryFrame();
|
||||
}
|
||||
if (frame) {
|
||||
frame->IsSelectable(&selectable, nullptr);
|
||||
}
|
||||
if (frame) {
|
||||
frame->IsSelectable(&selectable, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -252,14 +252,6 @@ public:
|
||||
bool *outNodeBefore,
|
||||
bool *outNodeAfter);
|
||||
|
||||
/**
|
||||
* Return true if any part of (aNode, aStartOffset) .. (aNode, aEndOffset)
|
||||
* overlaps any nsRange in aNode's GetNextRangeCommonAncestor ranges (i.e.
|
||||
* where aNode is a descendant of a range's common ancestor node).
|
||||
* If a nsRange starts in (aNode, aEndOffset) or if it ends in
|
||||
* (aNode, aStartOffset) then it is non-overlapping and the result is false
|
||||
* for that nsRange. Collapsed ranges always counts as non-overlapping.
|
||||
*/
|
||||
static bool IsNodeSelected(nsINode* aNode, uint32_t aStartOffset,
|
||||
uint32_t aEndOffset);
|
||||
|
||||
@ -306,14 +298,6 @@ protected:
|
||||
*/
|
||||
nsINode* GetRegisteredCommonAncestor();
|
||||
|
||||
// Helper to IsNodeSelected.
|
||||
static bool IsNodeInSortedRanges(nsINode* aNode,
|
||||
uint32_t aStartOffset,
|
||||
uint32_t aEndOffset,
|
||||
const nsTArray<const nsRange*>& aRanges,
|
||||
size_t aRangeStart,
|
||||
size_t aRangeEnd);
|
||||
|
||||
struct MOZ_STACK_CLASS AutoInvalidateSelection
|
||||
{
|
||||
explicit AutoInvalidateSelection(nsRange* aRange) : mRange(aRange)
|
||||
|
@ -12,7 +12,7 @@
|
||||
src: url("Ahem.ttf");
|
||||
}
|
||||
body { font-family: Ahem; font-size: 20px; }
|
||||
s, .non-selectable { -moz-user-select: none; }
|
||||
s { -moz-user-select: none; }
|
||||
n { display: none; }
|
||||
a { position:absolute; bottom: 0; right:0; }
|
||||
.text { -moz-user-select: text; }
|
||||
@ -34,16 +34,6 @@ a { position:absolute; bottom: 0; right:0; }
|
||||
<div id="testB"><n><s>aaaa</s>aaa</n>bbbbbbbbccccccc</div>
|
||||
<div id="testC">aaaaaaabbbbbbbb<n>cc<s>c</s>cccc</n></div>
|
||||
<div id="testE">aaa<s id="testEc1">aaaa<a class="text">bbbb</a>dd<a>cccc</a>ddddddd</s>eeee</div>
|
||||
<div id="testF">aaaa
|
||||
<div class="non-selectable">x</div>
|
||||
<div class="non-selectable">x</div>
|
||||
<div class="non-selectable">x</div>
|
||||
bbbb</div>
|
||||
<div id="testG" style="white-space:pre">aaaa
|
||||
<div class="non-selectable">x</div>
|
||||
<div class="non-selectable">x</div>
|
||||
<div class="non-selectable">x</div>
|
||||
bbbb</div>
|
||||
|
||||
<iframe id="testD" src="data:text/html,<body>aaaa<span style='-moz-user-select:none'>bbbb</span>cccc"></iframe>
|
||||
|
||||
@ -110,11 +100,9 @@ function test()
|
||||
is(NL(r.toString()), text, e.id + ": range["+index+"].toString()")
|
||||
}
|
||||
|
||||
function node(e, arg)
|
||||
function node(e, index)
|
||||
{
|
||||
if (typeof arg == "number")
|
||||
return arg == -1 ? e : e.childNodes[arg];
|
||||
return arg;
|
||||
return index == -1 ? e : e.childNodes[index];
|
||||
}
|
||||
|
||||
function checkRangeCount(n, e)
|
||||
@ -270,22 +258,6 @@ function test()
|
||||
checkRanges([[0,1,-1,1]], e);
|
||||
doneTest(e);
|
||||
|
||||
clear();
|
||||
e = document.getElementById('testF');
|
||||
synthesizeMouse(e, 1, 1, {});
|
||||
synthesizeMouse(e, 400, 100, { shiftKey: true });
|
||||
checkText("aaaa bbbb", e);
|
||||
checkRanges([[0,0,-1,1],[6,0,6,5]], e);
|
||||
doneTest(e);
|
||||
|
||||
clear();
|
||||
e = document.getElementById('testG');
|
||||
synthesizeMouse(e, 1, 1, {});
|
||||
synthesizeMouse(e, 400, 180, { shiftKey: true });
|
||||
checkText("aaaa bbbb", e); // XXX this doesn't seem right - bug 1247799
|
||||
checkRanges([[0,0,-1,1],[2,0,-1,3],[4,0,-1,5],[6,0,6,5]], e);
|
||||
doneTest(e);
|
||||
|
||||
// ======================================================
|
||||
// ==================== Script tests ====================
|
||||
// ======================================================
|
||||
|
@ -27,7 +27,6 @@
|
||||
#include "DisplayListClipState.h"
|
||||
#include "LayerState.h"
|
||||
#include "FrameMetrics.h"
|
||||
#include "mozilla/Maybe.h"
|
||||
#include "mozilla/UniquePtr.h"
|
||||
#include "mozilla/gfx/UserData.h"
|
||||
|
||||
@ -4376,8 +4375,6 @@ public:
|
||||
// regardless of bidi directionality; top and bottom in vertical modes).
|
||||
nscoord mVisIStartEdge;
|
||||
nscoord mVisIEndEdge;
|
||||
// Cached result of mFrame->IsSelected(). Only initialized when needed.
|
||||
mutable mozilla::Maybe<bool> mIsFrameSelected;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -4657,12 +4657,10 @@ nsTextFrame::CharacterDataChanged(CharacterDataChangeInfo* aInfo)
|
||||
|
||||
class nsDisplayText : public nsCharClipDisplayItem {
|
||||
public:
|
||||
nsDisplayText(nsDisplayListBuilder* aBuilder, nsTextFrame* aFrame,
|
||||
Maybe<bool> aIsSelected) :
|
||||
nsDisplayText(nsDisplayListBuilder* aBuilder, nsTextFrame* aFrame) :
|
||||
nsCharClipDisplayItem(aBuilder, aFrame),
|
||||
mOpacity(1.0f),
|
||||
mDisableSubpixelAA(false) {
|
||||
mIsFrameSelected = aIsSelected;
|
||||
MOZ_COUNT_CTOR(nsDisplayText);
|
||||
}
|
||||
#ifdef NS_BUILD_REFCNT_LOGGING
|
||||
@ -4836,22 +4834,18 @@ nsTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
||||
|
||||
DO_GLOBAL_REFLOW_COUNT_DSP("nsTextFrame");
|
||||
|
||||
Maybe<bool> isSelected;
|
||||
if (((GetStateBits() & TEXT_NO_RENDERED_GLYPHS) ||
|
||||
(NS_GET_A(StyleColor()->mColor) == 0 && !StyleText()->HasTextShadow())) &&
|
||||
aBuilder->IsForPainting() && !IsSVGText()) {
|
||||
isSelected.emplace(IsSelected());
|
||||
if (!isSelected) {
|
||||
TextDecorations textDecs;
|
||||
GetTextDecorations(PresContext(), eResolvedColors, textDecs);
|
||||
if (!textDecs.HasDecorationLines()) {
|
||||
return;
|
||||
}
|
||||
aBuilder->IsForPainting() && !IsSVGText() && !IsSelected()) {
|
||||
TextDecorations textDecs;
|
||||
GetTextDecorations(PresContext(), eResolvedColors, textDecs);
|
||||
if (!textDecs.HasDecorationLines()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
aLists.Content()->AppendNewToTop(
|
||||
new (aBuilder) nsDisplayText(aBuilder, this, isSelected));
|
||||
new (aBuilder) nsDisplayText(aBuilder, this));
|
||||
}
|
||||
|
||||
static nsIFrame*
|
||||
@ -6496,12 +6490,9 @@ nsTextFrame::PaintText(nsRenderingContext* aRenderingContext, nsPoint aPt,
|
||||
return;
|
||||
|
||||
PropertyProvider provider(this, iter, nsTextFrame::eInflated);
|
||||
if (aItem.mIsFrameSelected.isNothing()) {
|
||||
aItem.mIsFrameSelected.emplace(IsSelected());
|
||||
}
|
||||
// Trim trailing whitespace, unless we're painting a selection highlight,
|
||||
// which should include trailing spaces if present (bug 1146754).
|
||||
provider.InitializeForDisplay(!aItem.mIsFrameSelected.value());
|
||||
provider.InitializeForDisplay(!IsSelected());
|
||||
|
||||
gfxContext* ctx = aRenderingContext->ThebesContext();
|
||||
const bool reversed = mTextRun->IsInlineReversed();
|
||||
@ -6545,7 +6536,7 @@ nsTextFrame::PaintText(nsRenderingContext* aRenderingContext, nsPoint aPt,
|
||||
gfxRect dirtyRect(aDirtyRect.x, aDirtyRect.y,
|
||||
aDirtyRect.width, aDirtyRect.height);
|
||||
// Fork off to the (slower) paint-with-selection path if necessary.
|
||||
if (aItem.mIsFrameSelected.value()) {
|
||||
if (IsSelected()) {
|
||||
MOZ_ASSERT(aOpacity == 1.0f, "We don't support opacity with selections!");
|
||||
gfxSkipCharsIterator tmp(provider.GetStart());
|
||||
int32_t contentOffset = tmp.ConvertSkippedToOriginal(startOffset);
|
||||
|
@ -47,7 +47,7 @@ namespace mozilla {
|
||||
* struct Comparator {
|
||||
* int operator()(int val) const {
|
||||
* if (mTarget < val) return -1;
|
||||
* if (mTarget > val) return 1;
|
||||
* if (mValue > val) return 1;
|
||||
* return 0;
|
||||
* }
|
||||
* Comparator(int target) : mTarget(target) {}
|
||||
|
Loading…
Reference in New Issue
Block a user