diff options
author | Moonchild <moonchild@palemoon.org> | 2020-09-23 23:45:46 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2020-09-23 23:45:46 +0000 |
commit | 9f5c27ba479c54d4ebb1bd59b61fbf793f6df93f (patch) | |
tree | 831e0ae1649d6135429def03688bc93ff7c86b03 /layout | |
parent | 42f895f27f239e973c9c06241f7a58da7381353c (diff) | |
parent | f624bd1375655dea196cdcb70a9860bc5817df49 (diff) | |
download | UXP-RC_20200924.tar UXP-RC_20200924.tar.gz UXP-RC_20200924.tar.lz UXP-RC_20200924.tar.xz UXP-RC_20200924.zip |
Merge branch 'redwood' into releaseRELBASE_20200929RC_20200924
Diffstat (limited to 'layout')
86 files changed, 306 insertions, 1746 deletions
diff --git a/layout/base/crashtests/265027-1.html b/layout/base/crashtests/265027-1.html deleted file mode 100644 index 9b455da41..000000000 --- a/layout/base/crashtests/265027-1.html +++ /dev/null @@ -1,19 +0,0 @@ -<HTML> -<HEAD> -<MARQUEE> -<TABLE> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<MARQUEE HEIGHT=100000000> -<TBODY> -Attack of the marquees! - - diff --git a/layout/base/crashtests/265986-1.html b/layout/base/crashtests/265986-1.html deleted file mode 100644 index 8d4ca290f..000000000 --- a/layout/base/crashtests/265986-1.html +++ /dev/null @@ -1,10 +0,0 @@ -<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>
-<HTML>
-<HEAD>
-</HEAD>
-<BODY>
-<IFRAME STYLE="MARGIN:99999999999px; PADDING:-99999999999px;"></IFRAME>
-<APPLET STYLE="HEIGHT:9999999999pt; float:left; MARGIN:-99999999999px; border:99999999999px solid blue;"></APPLET>
-<MARQUEE STYLE=" WIDTH:9999999999px;">W</MARQUEE>
-</BODY>
-</HTML>
diff --git a/layout/base/crashtests/265999-1.html b/layout/base/crashtests/265999-1.html deleted file mode 100644 index 7e6e3d416..000000000 --- a/layout/base/crashtests/265999-1.html +++ /dev/null @@ -1,8 +0,0 @@ -<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>
-<HTML>
-<HEAD>
-</HEAD>
-<BODY>
-<MARQUEE STYLE="HEIGHT:9999999999px; float:right; border:99999999999px solid blue;"></MARQUEE>
-</BODY>
-</HTML>
diff --git a/layout/base/crashtests/367498-2.html b/layout/base/crashtests/367498-2.html deleted file mode 100644 index 2c85ac0a4..000000000 --- a/layout/base/crashtests/367498-2.html +++ /dev/null @@ -1,14 +0,0 @@ -<html><head> -</head><body> -<marquee> -<div style="border: 1px solid black; -moz-border-radius: 2em;"> -<marquee> -<span style="display: -moz-grid-line;"> -<select></select> -</span> -</marquee> -</div> -</marquee> - -</body> -</html> diff --git a/layout/base/crashtests/404491-1.html b/layout/base/crashtests/404491-1.html deleted file mode 100644 index 540a0f6a1..000000000 --- a/layout/base/crashtests/404491-1.html +++ /dev/null @@ -1,5 +0,0 @@ -<html> -<body> -<marquee><marquee></marquee><img></marquee> -</body> -</html> diff --git a/layout/base/crashtests/580129-1.html b/layout/base/crashtests/580129-1.html deleted file mode 100644 index 228051b5a..000000000 --- a/layout/base/crashtests/580129-1.html +++ /dev/null @@ -1,19 +0,0 @@ -<html> -<head> -<script> - -function boom() -{ - var a = document.documentElement; - var b = document.createElementNS("http://www.w3.org/1999/xhtml", "body"); - b.setAttributeNS(null, "style", "-moz-column-width: 20em;"); - a.innerHTML = "<frameset>"; - b.innerHTML = "<dd><marquee>x"; - document.removeChild(a); - document.appendChild(b); -} - -</script> -</head> -<body onload="boom();"></body> -</html> diff --git a/layout/base/crashtests/580494-1.html b/layout/base/crashtests/580494-1.html deleted file mode 100644 index c76125f74..000000000 --- a/layout/base/crashtests/580494-1.html +++ /dev/null @@ -1 +0,0 @@ -<html><body><marquee><video></video></marquee></body></html>
\ No newline at end of file diff --git a/layout/base/crashtests/597924-1.html b/layout/base/crashtests/597924-1.html deleted file mode 100644 index d855997ee..000000000 --- a/layout/base/crashtests/597924-1.html +++ /dev/null @@ -1,16 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<script> - -function boom() -{ - document.getElementById("s").appendChild(document.createElement("div")); - var marq = document.getElementById("f").contentDocument.documentElement; - marq.behavior = "alternate"; -} - -</script> -</head> -<body onload="boom();"><span id="s"></span><iframe src="data:text/xml,%3Cmarquee%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3EX%3C%2Fmarquee%3E" id="f"></iframe></body> -</html> diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 6642a090d..d28e60740 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -2614,7 +2614,8 @@ nsCSSFrameConstructor::ConstructDocElementFrame(Element* aDocEle newFrame = frameItems.FirstChild(); NS_ASSERTION(frameItems.OnlyChild(), "multiple root element frames"); } else { - MOZ_ASSERT(display->mDisplay == StyleDisplay::Block, + MOZ_ASSERT(display->mDisplay == StyleDisplay::Block || + display->mDisplay == StyleDisplay::FlowRoot, "Unhandled display type for root element"); contentFrame = NS_NewBlockFormattingContext(mPresShell, styleContext); nsFrameItems frameItems; @@ -4758,6 +4759,7 @@ nsCSSFrameConstructor::FindDisplayData(const nsStyleDisplay* aDisplay, static const FrameConstructionDataByDisplay sDisplayData[] = { FCDATA_FOR_DISPLAY(StyleDisplay::None, UNREACHABLE_FCDATA()), FCDATA_FOR_DISPLAY(StyleDisplay::Block, UNREACHABLE_FCDATA()), + FCDATA_FOR_DISPLAY(StyleDisplay::FlowRoot, UNREACHABLE_FCDATA()), // To keep the hash table small don't add inline frames (they're // typically things like FONT and B), because we can quickly // find them if we need to. @@ -4943,7 +4945,7 @@ nsCSSFrameConstructor::ConstructNonScrollableBlockWithConstructor( StyleDisplay::InlineBlock == aDisplay->mDisplay || clipPaginatedOverflow) && !aParentFrame->IsSVGText()) { - flags = NS_BLOCK_FLOAT_MGR | NS_BLOCK_MARGIN_ROOT; + flags = NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS; if (clipPaginatedOverflow) { flags |= NS_BLOCK_CLIP_PAGINATED_OVERFLOW; } @@ -5112,7 +5114,7 @@ nsCSSFrameConstructor::FlushAccumulatedBlock(nsFrameConstructorState& aState, // is not a suitable block. nsContainerFrame* blockFrame = NS_NewMathMLmathBlockFrame(mPresShell, blockContext); - blockFrame->AddStateBits(NS_BLOCK_FLOAT_MGR | NS_BLOCK_MARGIN_ROOT); + blockFrame->AddStateBits(NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS); InitAndRestoreFrame(aState, aContent, aParentFrame, blockFrame); ReparentFrames(this, blockFrame, aBlockItems); diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 5de6f2013..9b204d734 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -149,6 +149,7 @@ using namespace mozilla::gfx; #define GRID_ENABLED_PREF_NAME "layout.css.grid.enabled" #define GRID_TEMPLATE_SUBGRID_ENABLED_PREF_NAME "layout.css.grid-template-subgrid-value.enabled" #define WEBKIT_PREFIXES_ENABLED_PREF_NAME "layout.css.prefixes.webkit" +#define DISPLAY_FLOW_ROOT_ENABLED_PREF_NAME "layout.css.display-flow-root.enabled" #define DISPLAY_CONTENTS_ENABLED_PREF_NAME "layout.css.display-contents.enabled" #define TEXT_ALIGN_UNSAFE_ENABLED_PREF_NAME "layout.css.text-align-unsafe-value.enabled" #define FLOAT_LOGICAL_VALUES_ENABLED_PREF_NAME "layout.css.float-logical-values.enabled" @@ -314,6 +315,37 @@ WebkitPrefixEnabledPrefChangeCallback(const char* aPrefName, void* aClosure) } } +// When the pref "layout.css.display-flow-root.enabled" changes, this function is +// invoked to let us update kDisplayKTable, to selectively disable or restore +// the entries for "flow-root" in that table. +static void +DisplayFlowRootEnabledPrefChangeCallback(const char* aPrefName, void* aClosure) +{ + NS_ASSERTION(strcmp(aPrefName, DISPLAY_FLOW_ROOT_ENABLED_PREF_NAME) == 0, + "Did you misspell " DISPLAY_FLOW_ROOT_ENABLED_PREF_NAME " ?"); + + static bool sIsDisplayFlowRootKeywordIndexInitialized; + static int32_t sIndexOfFlowRootInDisplayTable; + bool isDisplayFlowRootEnabled = + Preferences::GetBool(DISPLAY_FLOW_ROOT_ENABLED_PREF_NAME, false); + + if (!sIsDisplayFlowRootKeywordIndexInitialized) { + // First run: find the position of "flow-root" in kDisplayKTable. + sIndexOfFlowRootInDisplayTable = + nsCSSProps::FindIndexOfKeyword(eCSSKeyword_flow_root, + nsCSSProps::kDisplayKTable); + sIsDisplayFlowRootKeywordIndexInitialized = true; + } + + // OK -- now, stomp on or restore the "flow-root" entry in kDisplayKTable, + // depending on whether the pref is enabled vs. disabled. + if (sIndexOfFlowRootInDisplayTable >= 0) { + nsCSSProps::kDisplayKTable[sIndexOfFlowRootInDisplayTable].mKeyword = + isDisplayFlowRootEnabled ? eCSSKeyword_flow_root : eCSSKeyword_UNKNOWN; + } +} + + // When the pref "layout.css.display-contents.enabled" changes, this function is // invoked to let us update kDisplayKTable, to selectively disable or restore // the entries for "contents" in that table. @@ -7635,6 +7667,8 @@ static const PrefCallbacks kPrefCallbacks[] = { WebkitPrefixEnabledPrefChangeCallback }, { TEXT_ALIGN_UNSAFE_ENABLED_PREF_NAME, TextAlignUnsafeEnabledPrefChangeCallback }, + { DISPLAY_FLOW_ROOT_ENABLED_PREF_NAME, + DisplayFlowRootEnabledPrefChangeCallback }, { DISPLAY_CONTENTS_ENABLED_PREF_NAME, DisplayContentsEnabledPrefChangeCallback }, { FLOAT_LOGICAL_VALUES_ENABLED_PREF_NAME, diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp index befb5deb2..1d90b967a 100644 --- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -1931,33 +1931,13 @@ nsPresContext::MediaFeatureValuesChanged(nsRestyleHint aRestyleHint, if (!PR_CLIST_IS_EMPTY(mDocument->MediaQueryLists())) { // We build a list of all the notifications we're going to send - // before we send any of them. (The spec says the notifications - // should be a queued task, so any removals that happen during the - // notifications shouldn't affect what gets notified.) Furthermore, - // we hold strong pointers to everything we're going to make - // notification calls to, since each notification involves calling - // arbitrary script that might otherwise destroy these objects, or, - // for that matter, |this|. - // - // Note that we intentionally send the notifications to media query - // list in the order they were created and, for each list, to the - // listeners in the order added. - nsTArray<MediaQueryList::HandleChangeData> notifyList; + // before we send any of them. for (PRCList *l = PR_LIST_HEAD(mDocument->MediaQueryLists()); l != mDocument->MediaQueryLists(); l = PR_NEXT_LINK(l)) { + nsAutoMicroTask mt; MediaQueryList *mql = static_cast<MediaQueryList*>(l); - mql->MediumFeaturesChanged(notifyList); + mql->MaybeNotify(); } - - if (!notifyList.IsEmpty()) { - for (uint32_t i = 0, i_end = notifyList.Length(); i != i_end; ++i) { - nsAutoMicroTask mt; - MediaQueryList::HandleChangeData &d = notifyList[i]; - d.callback->Call(*d.mql); - } - } - - // NOTE: When |notifyList| goes out of scope, our destructor could run. } } diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 63f512af4..0544a69a4 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -9090,6 +9090,11 @@ PresShell::DidDoReflow(bool aInterruptible) docShell->NotifyReflowObservers(aInterruptible, mLastReflowStart, now); } + // Notify resize observers on reflow. + if (!mPresContext->HasPendingInterrupt()) { + mDocument->ScheduleResizeObserversNotification(); + } + if (sSynthMouseMove) { SynthesizeMouseMove(false); } diff --git a/layout/forms/nsLegendFrame.cpp b/layout/forms/nsLegendFrame.cpp index 95efc2c87..b985ed8fc 100644 --- a/layout/forms/nsLegendFrame.cpp +++ b/layout/forms/nsLegendFrame.cpp @@ -24,9 +24,7 @@ NS_NewLegendFrame(nsIPresShell* aPresShell, nsStyleContext* aContext) #endif nsIFrame* f = new (aPresShell) nsLegendFrame(aContext); - if (f) { - f->AddStateBits(NS_BLOCK_FLOAT_MGR | NS_BLOCK_MARGIN_ROOT); - } + f->AddStateBits(NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS); return f; } diff --git a/layout/generic/ReflowInput.cpp b/layout/generic/ReflowInput.cpp index 78eca8c6c..e55b629e3 100644 --- a/layout/generic/ReflowInput.cpp +++ b/layout/generic/ReflowInput.cpp @@ -844,6 +844,7 @@ ReflowInput::InitFrameType(nsIAtom* aFrameType) case StyleDisplay::Flex: case StyleDisplay::WebkitBox: case StyleDisplay::Grid: + case StyleDisplay::FlowRoot: case StyleDisplay::RubyTextContainer: frameType = NS_CSS_FRAME_TYPE_BLOCK; break; diff --git a/layout/generic/crashtests/265867-1.html b/layout/generic/crashtests/265867-1.html deleted file mode 100644 index e9da8c7f6..000000000 --- a/layout/generic/crashtests/265867-1.html +++ /dev/null @@ -1,11 +0,0 @@ -<HTML> -<HEAD> -</HEAD> -<BODY> -<BODY STYLE="FLOAT:RIGHT;"></BODY> -<MARQUEE STYLE="MARGIN:99999999999px;"></MARQUEE> -<B STYLE="FLOAT:RIGHT; PADDING:99999999999px;"></B> -</BODY> -</HTML> - - diff --git a/layout/generic/crashtests/348510-1.html b/layout/generic/crashtests/348510-1.html deleted file mode 100644 index 6e00e71f1..000000000 --- a/layout/generic/crashtests/348510-1.html +++ /dev/null @@ -1,7 +0,0 @@ -<marquee> -<a> -<object> -<dd> -<form> -</object> -aaaaaaa diff --git a/layout/generic/crashtests/348510-2.html b/layout/generic/crashtests/348510-2.html deleted file mode 100644 index 8f8c998cf..000000000 --- a/layout/generic/crashtests/348510-2.html +++ /dev/null @@ -1,7 +0,0 @@ -<listing> -<marquee> -<aa> -<object> -<fieldset> -</object> -a
\ No newline at end of file diff --git a/layout/generic/crashtests/363722-1.html b/layout/generic/crashtests/363722-1.html deleted file mode 100644 index f83671c5a..000000000 --- a/layout/generic/crashtests/363722-1.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<body> - <marquee style="background: yellow;"> - <marquee style="background: lightgreen;"> - I am a double-marquee. - </marquee> - </marquee> -</body> -</html> diff --git a/layout/generic/crashtests/363722-2.html b/layout/generic/crashtests/363722-2.html deleted file mode 100644 index 1a12a227e..000000000 --- a/layout/generic/crashtests/363722-2.html +++ /dev/null @@ -1,10 +0,0 @@ -<html> -<body> - <marquee style="background: yellow;"> - [inside OUTER marquee] - <marquee style="background: lightgreen;"> - [inside INNER marquee] - </marquee> - </marquee> -</body> -</html> diff --git a/layout/generic/crashtests/370866-1.xhtml b/layout/generic/crashtests/370866-1.xhtml deleted file mode 100644 index dbc673cc4..000000000 --- a/layout/generic/crashtests/370866-1.xhtml +++ /dev/null @@ -1,14 +0,0 @@ -<html xmlns="http://www.w3.org/1999/xhtml"> - -<head> -</head> - -<body> - -<table style="display: -moz-deck;"><tbody><tr><td> - <span style="position: relative;"><marquee><marquee><span style="position: absolute;">X</span></marquee></marquee></span> -</td></tr></tbody></table> - -</body> - -</html> diff --git a/layout/generic/crashtests/379917-1.xhtml b/layout/generic/crashtests/379917-1.xhtml deleted file mode 100644 index a99bd7f4a..000000000 --- a/layout/generic/crashtests/379917-1.xhtml +++ /dev/null @@ -1,35 +0,0 @@ -<html xmlns="http://www.w3.org/1999/xhtml" - xmlns:math="http://www.w3.org/1998/Math/MathML" - class="reftest-wait"> -<head> -<script> - -// This testcase uses long timeouts to make sure the marquee has a chance to animate. - -function boom() -{ - var div1 = document.getElementById("div1"); - var marquee = document.getElementById("marquee"); - - div1.parentNode.removeChild(div1); - marquee.width = 4; - - setTimeout(done, 100); -} - -function done() -{ - document.documentElement.removeAttribute("class"); -} - -</script> -</head> - -<body onload="setTimeout(boom, 100);"> - -<math:math><div id="div1"/>xע</math:math> -<marquee id="marquee">m</marquee> -<div/> - -</body> -</html> diff --git a/layout/generic/crashtests/398332-3.html b/layout/generic/crashtests/398332-3.html deleted file mode 100644 index 991aa6d3d..000000000 --- a/layout/generic/crashtests/398332-3.html +++ /dev/null @@ -1,4 +0,0 @@ -<marquee style="position: relative; right: 20%;">"Ë”Öqü®Û;<span style="position: relative; word-spacing: -100px;"><span style="position: absolute;"> -<style>span::before { content:"before textbefore textbefore textbefore textbefore textbefore text"; }</style> - - diff --git a/layout/generic/crashtests/421671.html b/layout/generic/crashtests/421671.html deleted file mode 100644 index e3919e635..000000000 --- a/layout/generic/crashtests/421671.html +++ /dev/null @@ -1,202 +0,0 @@ -<marquee> -<xmp style="-moz-column-count: 99999999"> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> - -<a> -<a> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<a> -<a> -<a> -<a> - -<a> -<a> - -<a> -<a>
\ No newline at end of file diff --git a/layout/generic/crashtests/619021.html b/layout/generic/crashtests/619021.html deleted file mode 100644 index 586c0f2db..000000000 --- a/layout/generic/crashtests/619021.html +++ /dev/null @@ -1,5 +0,0 @@ -<foo> <marquee> <marquee> <marquee> <marquee> <marquee> <marquee> -<foo> <marquee> <foo> <marquee> <foo> <object> <marquee> <foo> -<marquee> <marquee> <foo> <foo> <marquee> <marquee> <foo> <marquee> -<marquee> <marquee> <foo> <marquee> <foo> <foo> <marquee> <marquee> -<marquee> </marquee> <foo> <foo> <pre> diff --git a/layout/generic/crashtests/724235.html b/layout/generic/crashtests/724235.html deleted file mode 100644 index 7054a99f5..000000000 --- a/layout/generic/crashtests/724235.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<title>Testcase for bug 724235</title> -</head> - -<body onload="setTimeout(function(){m=document.getElementsByTagName('marquee')[0]; m.style.fontSize='72px'},0)"> - -<a href="#"> - -<center> - -<marquee>This is a marquee ... </marquee> - -<table> - <tr> - <td><a href="#">click me to CRASH!</a></td> - </tr> -</table> - -<iframe></iframe> - -<script>document.body.offsetHeight;</script> - -<a href="#"></a> - - -</body></html> diff --git a/layout/generic/nsBlockFrame.cpp b/layout/generic/nsBlockFrame.cpp index 57838207d..41437c8f8 100644 --- a/layout/generic/nsBlockFrame.cpp +++ b/layout/generic/nsBlockFrame.cpp @@ -305,7 +305,7 @@ NS_NewBlockFormattingContext(nsIPresShell* aPresShell, nsStyleContext* aStyleContext) { nsBlockFrame* blockFrame = NS_NewBlockFrame(aPresShell, aStyleContext); - blockFrame->AddStateBits(NS_BLOCK_FLOAT_MGR | NS_BLOCK_MARGIN_ROOT); + blockFrame->AddStateBits(NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS); return blockFrame; } @@ -6896,10 +6896,11 @@ nsBlockFrame::Init(nsIContent* aContent, // (http://dev.w3.org/csswg/css-writing-modes/#block-flow) // If the box has contain: paint (or contain: strict), then it should also // establish a formatting context. - if ((GetParent() && StyleVisibility()->mWritingMode != + if (StyleDisplay()->mDisplay == mozilla::StyleDisplay::FlowRoot || + (GetParent() && StyleVisibility()->mWritingMode != GetParent()->StyleVisibility()->mWritingMode) || StyleDisplay()->IsContainPaint()) { - AddStateBits(NS_BLOCK_FLOAT_MGR | NS_BLOCK_MARGIN_ROOT); + AddStateBits(NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS); } if ((GetStateBits() & diff --git a/layout/generic/nsFrameStateBits.h b/layout/generic/nsFrameStateBits.h index f8b1e541c..ba43e37d4 100644 --- a/layout/generic/nsFrameStateBits.h +++ b/layout/generic/nsFrameStateBits.h @@ -483,6 +483,9 @@ FRAME_STATE_BIT(Block, 22, NS_BLOCK_MARGIN_ROOT) // used to reserve space for the floated frames. FRAME_STATE_BIT(Block, 23, NS_BLOCK_FLOAT_MGR) +// For setting the relevant bits on a block formatting context: +#define NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS (NS_BLOCK_FLOAT_MGR | NS_BLOCK_MARGIN_ROOT) + FRAME_STATE_BIT(Block, 24, NS_BLOCK_HAS_LINE_CURSOR) FRAME_STATE_BIT(Block, 25, NS_BLOCK_HAS_OVERFLOW_LINES) diff --git a/layout/generic/nsHTMLParts.h b/layout/generic/nsHTMLParts.h index 89a7a6edd..b11d49e08 100644 --- a/layout/generic/nsHTMLParts.h +++ b/layout/generic/nsHTMLParts.h @@ -27,8 +27,7 @@ class nsTableColFrame; // These are all the block specific frame bits, they are copied from // the prev-in-flow to a newly created next-in-flow, except for the // NS_BLOCK_FLAGS_NON_INHERITED_MASK bits below. -#define NS_BLOCK_FLAGS_MASK (NS_BLOCK_MARGIN_ROOT | \ - NS_BLOCK_FLOAT_MGR | \ +#define NS_BLOCK_FLAGS_MASK (NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS | \ NS_BLOCK_CLIP_PAGINATED_OVERFLOW | \ NS_BLOCK_HAS_FIRST_LETTER_STYLE | \ NS_BLOCK_FRAME_HAS_OUTSIDE_BULLET | \ diff --git a/layout/inspector/inDOMUtils.cpp b/layout/inspector/inDOMUtils.cpp index e212e20df..2095fb775 100644 --- a/layout/inspector/inDOMUtils.cpp +++ b/layout/inspector/inDOMUtils.cpp @@ -846,7 +846,7 @@ PropertySupportsVariant(nsCSSPropertyID aPropertyID, uint32_t aVariant) case eCSSProperty_grid_row_end: case eCSSProperty_font_weight: case eCSSProperty_initial_letter: - supported = VARIANT_NUMBER; + supported = VARIANT_NUMBER | VARIANT_OPACITY; break; default: @@ -909,7 +909,7 @@ inDOMUtils::CssPropertySupportsType(const nsAString& aProperty, uint32_t aType, break; case TYPE_NUMBER: // Include integers under "number"? - variant = VARIANT_NUMBER | VARIANT_INTEGER; + variant = VARIANT_NUMBER | VARIANT_INTEGER | VARIANT_OPACITY; break; default: // Unknown type diff --git a/layout/reftests/bidi/logicalmarquee.html b/layout/reftests/bidi/logicalmarquee.html deleted file mode 100644 index cb13827de..000000000 --- a/layout/reftests/bidi/logicalmarquee.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE HTML> -<html> - <head> - <meta http-equiv="Content-type" content="text/html; charset=iso-8859-8-i"> - <title>Marquee in Logical Hebrew</title> - </head> - - <body> - <marquee scrollamount="0" behavior="alternate" direction="right">עד שיפוח היום ונסו הצלילים</marquee> - </body> -</html> diff --git a/layout/reftests/bidi/marquee-ref.html b/layout/reftests/bidi/marquee-ref.html deleted file mode 100644 index d8778dc88..000000000 --- a/layout/reftests/bidi/marquee-ref.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE HTML> -<html> - <head> - <meta http-equiv="Content-type" content="text/html; charset=iso-8859-8-i"> - <title>Marquee in Logical Hebrew</title> - </head> - - <body> - <div dir="rtl" align="left">עד שיפוח היום ונסו הצלילים</div> - </body> -</html> diff --git a/layout/reftests/bidi/reftest-stylo.list b/layout/reftests/bidi/reftest-stylo.list index b6a48f9ca..d0a854e7f 100644 --- a/layout/reftests/bidi/reftest-stylo.list +++ b/layout/reftests/bidi/reftest-stylo.list @@ -21,9 +21,6 @@ skip == bidiSVG-03.svg bidiSVG-03.svg == bidiSVG-04.svg bidiSVG-04.svg == bidiSVG-05.svg bidiSVG-05.svg random-if(/^Windows\x20NT\x205\.1/.test(http.oscpu)) HTTP(..) == bidiMirroring.svg bidiMirroring.svg -fuzzy-if(Android,9,134) random-if(layersGPUAccelerated) == visualmarquee.html visualmarquee.html -fuzzy-if(Android,9,134) random-if(layersGPUAccelerated) == logicalmarquee.html logicalmarquee.html -== visualmarquee.html visualmarquee.html # test for glyph mirroring in right-to-left text == mirroring-01.html mirroring-01.html # quote marks are not supposed to mirror, but Unicode 5.0 said they should, so some systems do it diff --git a/layout/reftests/bidi/reftest.list b/layout/reftests/bidi/reftest.list index eeabd0beb..5044e657f 100644 --- a/layout/reftests/bidi/reftest.list +++ b/layout/reftests/bidi/reftest.list @@ -18,9 +18,6 @@ random-if(cocoaWidget) == bidi-006-j.html bidi-006-ref.html # bug 734313 fuzzy-if(skiaContent,1,1) == bidiSVG-04.svg bidiSVG-04-ref.svg == bidiSVG-05.svg bidiSVG-05-ref.svg random-if(/^Windows\x20NT\x205\.1/.test(http.oscpu)) HTTP(..) == bidiMirroring.svg bidiMirroring-ref.svg -fuzzy-if(Android,9,134) random-if(layersGPUAccelerated) == visualmarquee.html marquee-ref.html -fuzzy-if(Android,9,134) random-if(layersGPUAccelerated) == logicalmarquee.html marquee-ref.html -== visualmarquee.html logicalmarquee.html # test for glyph mirroring in right-to-left text == mirroring-01.html mirroring-01-ref.html # quote marks are not supposed to mirror, but Unicode 5.0 said they should, so some systems do it diff --git a/layout/reftests/bidi/visualmarquee.html b/layout/reftests/bidi/visualmarquee.html deleted file mode 100644 index 932fd775a..000000000 --- a/layout/reftests/bidi/visualmarquee.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> - <head> - <meta http-equiv="Content-type" content="text/html; charset=iso-8859-8"> - <title>Marquee in Visual Hebrew</title> - </head> - - <body> - <marquee scrollamount="0" behavior="alternate" direction="right">םילילצה וסנו םויה חופיש דע</marquee> - </body> -</html> diff --git a/layout/reftests/marquee/1160342-1.html b/layout/reftests/marquee/1160342-1.html deleted file mode 100644 index 85e7215fb..000000000 --- a/layout/reftests/marquee/1160342-1.html +++ /dev/null @@ -1,10 +0,0 @@ -<html>
-<head>
-<title>Bug 1160342 - Implement marquee using mutation observers</title>
-</head>
-<body onload="document.getElementById('a').setAttribute('behavior', 'alternate')">
-<marquee id="a" scrollamount=0 direction=right>
-This text should be visible
-</marquee>
-</body>
-</html>
diff --git a/layout/reftests/marquee/1160342-2.html b/layout/reftests/marquee/1160342-2.html deleted file mode 100644 index 99b288568..000000000 --- a/layout/reftests/marquee/1160342-2.html +++ /dev/null @@ -1,10 +0,0 @@ -<html>
-<head>
-<title>Bug 1160342 - Implement marquee using mutation observers</title>
-</head>
-<body onload="document.getElementById('a').setAttribute('direction', 'right')">
-<marquee id="a" behavior=alternate scrollamount=0>
-This text should be visible
-</marquee>
-</body>
-</html>
diff --git a/layout/reftests/marquee/1160342-ref.html b/layout/reftests/marquee/1160342-ref.html deleted file mode 100644 index d56c90642..000000000 --- a/layout/reftests/marquee/1160342-ref.html +++ /dev/null @@ -1,10 +0,0 @@ -<html>
-<head>
-<title>Bug 1160342 - Implement marquee using mutation observers</title>
-</head>
-<body>
-<marquee id="a" behavior=alternate scrollamount=0 direction=right>
-This text should be visible
-</marquee>
-</body>
-</html>
diff --git a/layout/reftests/marquee/166591-dynamic-1-ref.html b/layout/reftests/marquee/166591-dynamic-1-ref.html deleted file mode 100644 index a9bed7d5f..000000000 --- a/layout/reftests/marquee/166591-dynamic-1-ref.html +++ /dev/null @@ -1,6 +0,0 @@ -<html><head> -</head> -<body> -<div id="test"><marquee behavior="alternate" scrollamount="0">dynamic marquee</marquee></div> -</body> -</html>
\ No newline at end of file diff --git a/layout/reftests/marquee/166591-dynamic-1.html b/layout/reftests/marquee/166591-dynamic-1.html deleted file mode 100644 index 278b2a37b..000000000 --- a/layout/reftests/marquee/166591-dynamic-1.html +++ /dev/null @@ -1,11 +0,0 @@ -<html><head> -<script> -function init() { - document.getElementById('test').innerHTML = '<marquee behavior="alternate" scrollamount="0">dynamic marquee</marquee>'; -} -</script> -</head> -<body onload="init();"> -<div id="test"></div> -</body> -</html>
\ No newline at end of file diff --git a/layout/reftests/marquee/336736-1-ref.html b/layout/reftests/marquee/336736-1-ref.html deleted file mode 100644 index 116e5ade2..000000000 --- a/layout/reftests/marquee/336736-1-ref.html +++ /dev/null @@ -1,5 +0,0 @@ -<html> -<body> -<div style="background: green; width: 50px"> </div> -</body> -</html> diff --git a/layout/reftests/marquee/336736-1a.html b/layout/reftests/marquee/336736-1a.html deleted file mode 100644 index fb54f3060..000000000 --- a/layout/reftests/marquee/336736-1a.html +++ /dev/null @@ -1,13 +0,0 @@ -<html> -<body dir="rtl"> -<!-- The "alternate" behavior is necessary for the - marquee text to start out on the screen. --> -<marquee - direction="right" - scrollamount="0" - behavior="alternate" -> -<div style="background: green; width: 50px"> </div> -</marquee> -</body> -</html> diff --git a/layout/reftests/marquee/336736-1b.html b/layout/reftests/marquee/336736-1b.html deleted file mode 100644 index 85338167c..000000000 --- a/layout/reftests/marquee/336736-1b.html +++ /dev/null @@ -1,13 +0,0 @@ -<html> -<body> -<!-- The "alternate" behavior is necessary for the - marquee text to start out on the screen. --> -<marquee - direction="right" - scrollamount="0" - behavior="alternate" -> -<div style="background: green; width: 50px"> </div> -</marquee> -</body> -</html> diff --git a/layout/reftests/marquee/406073-1-ref.html b/layout/reftests/marquee/406073-1-ref.html deleted file mode 100644 index 751bb5db7..000000000 --- a/layout/reftests/marquee/406073-1-ref.html +++ /dev/null @@ -1,11 +0,0 @@ -<html class="reftest-wait"> -<body style="border:3px solid;" onload="setTimeout(doe, 0)"> -<marquee behavior="alternate" scrollamount="100"><span style="background-color: lime;">marquee</span></marquee> - <script> - function doe() { - document.getElementsByTagName('marquee')[0].stop(); - document.documentElement.className = ""; - } - </script> -</body> -</html> diff --git a/layout/reftests/marquee/406073-1.html b/layout/reftests/marquee/406073-1.html deleted file mode 100644 index 01787afda..000000000 --- a/layout/reftests/marquee/406073-1.html +++ /dev/null @@ -1,23 +0,0 @@ -<html class="reftest-wait"> -<body style="border:3px solid;" onload="setTimeout(doe, 0)"> -<marquee behavior="alternate" scrollamount="100"><span style="background-color: lime;">marquee</span></marquee> - <script> - function doe() { - document.getElementsByTagName('marquee')[0].stop(); - document.getElementsByTagName('marquee')[0].start(); - document.getElementsByTagName('marquee')[0].stop(); - document.getElementsByTagName('marquee')[0].start(); - document.getElementsByTagName('marquee')[0].stop(); - document.getElementsByTagName('marquee')[0].start(); - document.getElementsByTagName('marquee')[0].stop(); - document.getElementsByTagName('marquee')[0].start(); - document.getElementsByTagName('marquee')[0].stop(); - document.getElementsByTagName('marquee')[0].start(); - document.getElementsByTagName('marquee')[0].stop(); - document.getElementsByTagName('marquee')[0].start(); - document.getElementsByTagName('marquee')[0].stop(); - document.documentElement.className = ""; - } - </script> -</body> -</html> diff --git a/layout/reftests/marquee/407016-2-ref.html b/layout/reftests/marquee/407016-2-ref.html deleted file mode 100644 index 25fee1b7d..000000000 --- a/layout/reftests/marquee/407016-2-ref.html +++ /dev/null @@ -1,5 +0,0 @@ -<html> -<body> -<div style="background-color: lime; height: 50px;"></div> -</body> -</html> diff --git a/layout/reftests/marquee/407016-2.html b/layout/reftests/marquee/407016-2.html deleted file mode 100644 index 65e1273b9..000000000 --- a/layout/reftests/marquee/407016-2.html +++ /dev/null @@ -1,7 +0,0 @@ -<html> -<body> -<marquee scrollamount="0" style="height: 50px; background-color: lime;"> -<div style="width: 9999px;"> </div> -</marquee> -</body> -</html> diff --git a/layout/reftests/marquee/413027-4-ref.html b/layout/reftests/marquee/413027-4-ref.html deleted file mode 100644 index 22fdd42e6..000000000 --- a/layout/reftests/marquee/413027-4-ref.html +++ /dev/null @@ -1,10 +0,0 @@ -<html><head> -<title>Testcase for bug 413027 - Marquee height is sized too small, clipping text vertically</title> -</head> -<body> - -<div style="background-color: lime; width: 600px; float:left;"> - <div style="margin: 100px 0px; padding-left: 2px;">text</div> -</div> - -</body></html> diff --git a/layout/reftests/marquee/413027-4.html b/layout/reftests/marquee/413027-4.html deleted file mode 100644 index d57f2f121..000000000 --- a/layout/reftests/marquee/413027-4.html +++ /dev/null @@ -1,15 +0,0 @@ -<html><head> -<title>Testcase for bug 413027 - Marquee height is sized too small, clipping text vertically</title> -</head> -<body> - -<marquee scrollamount="0" behavior="alternate" direction="right" style="background-color: lime; width: 600px;"> -<div> -<!-- padding-left used to avoid risk of an antialiasing pixel that may - project to the left of the origin, causing a spurious test failure - (see bugs 476927, 475968) --> - <div style="margin: 100px 0px; padding-left: 2px;">text</div> -</div> -</marquee> - -</body></html> diff --git a/layout/reftests/marquee/425247-1-ref.html b/layout/reftests/marquee/425247-1-ref.html deleted file mode 100644 index 3b3a84d41..000000000 --- a/layout/reftests/marquee/425247-1-ref.html +++ /dev/null @@ -1,9 +0,0 @@ -<html><head> -<title>Bug 425247 – Marquee with uppercase UP or DOWN as direction doesn't work properly</title> -</head> -<body> -<marquee direction="up" bgcolor="magenta" behavior="alternate" scrollamount="0"> -<marquee bgcolor="yellow" behavior="alternate" scrollamount="0">marquee up</marquee> -</marquee> -</body> -</html>
\ No newline at end of file diff --git a/layout/reftests/marquee/425247-1.html b/layout/reftests/marquee/425247-1.html deleted file mode 100644 index dfa5021c4..000000000 --- a/layout/reftests/marquee/425247-1.html +++ /dev/null @@ -1,9 +0,0 @@ -<html><head> -<title>Bug 425247 – Marquee with uppercase UP or DOWN as direction doesn't work properly</title> -</head> -<body> -<MARQUEE DIRECTION=UP BGCOLOR=MAGENTA BEHAVIOR=ALTERNATE SCROLLAMOUNT=0> -<MARQUEE BGCOLOR=YELLOW BEHAVIOR=ALTERNATE SCROLLAMOUNT=0>marquee up</MARQUEE> -</MARQUEE> -</body> -</html>
\ No newline at end of file diff --git a/layout/reftests/marquee/425247-2-ref.html b/layout/reftests/marquee/425247-2-ref.html deleted file mode 100644 index 564d74979..000000000 --- a/layout/reftests/marquee/425247-2-ref.html +++ /dev/null @@ -1,9 +0,0 @@ -<html><head> -<title>Bug 425247 – Marquee with uppercase UP or DOWN as direction doesn't work properly</title> -</head> -<body> -<marquee direction="down" bgcolor="magenta" behavior="alternate" scrollamount="0"> -<marquee bgcolor="yellow" behavior="alternate" scrollamount="0">marquee down</marquee> -</marquee> -</body> -</html>
\ No newline at end of file diff --git a/layout/reftests/marquee/425247-2.html b/layout/reftests/marquee/425247-2.html deleted file mode 100644 index 4cb66b901..000000000 --- a/layout/reftests/marquee/425247-2.html +++ /dev/null @@ -1,9 +0,0 @@ -<html><head> -<title>Bug 425247 – Marquee with uppercase UP or DOWN as direction doesn't work properly</title> -</head> -<body> -<MARQUEE DIRECTION=DOWN BGCOLOR=MAGENTA BEHAVIOR=ALTERNATE SCROLLAMOUNT=0> -<MARQUEE BGCOLOR=YELLOW BEHAVIOR=ALTERNATE SCROLLAMOUNT=0>marquee down</MARQUEE> -</MARQUEE> -</body> -</html>
\ No newline at end of file diff --git a/layout/reftests/marquee/429849-1-ref.html b/layout/reftests/marquee/429849-1-ref.html deleted file mode 100644 index 3b9c3166e..000000000 --- a/layout/reftests/marquee/429849-1-ref.html +++ /dev/null @@ -1,10 +0,0 @@ -<html>
-<head>
-<title>Bug 429849 – marquee text not on one line , part of this line on top and second part on bottom</title>
-</head>
-<body>
-<marquee behavior=alternate scrollamount=0 direction=right>
-This text should be on one line
-</marquee>
-</body>
-</html>
diff --git a/layout/reftests/marquee/429849-1.html b/layout/reftests/marquee/429849-1.html deleted file mode 100644 index 6b1757fd0..000000000 --- a/layout/reftests/marquee/429849-1.html +++ /dev/null @@ -1,10 +0,0 @@ -<html>
-<head>
-<title>Bug 429849 – marquee text not on one line , part of this line on top and second part on bottom</title>
-</head>
-<body>
-<marquee behavior=alternate scrollamount=0 direction=right>
-This text <script>document.body.offsetHeight;</script>should be on one line
-</marquee>
-</body>
-</html>
diff --git a/layout/reftests/marquee/reftest-stylo.list b/layout/reftests/marquee/reftest-stylo.list deleted file mode 100644 index 26c77acf9..000000000 --- a/layout/reftests/marquee/reftest-stylo.list +++ /dev/null @@ -1,16 +0,0 @@ -# DO NOT EDIT! This is a auto-generated temporary list for Stylo testing -random-if((B2G&&browserIsRemote)||Mulet) == 166591-dynamic-1.html 166591-dynamic-1.html -# Initial mulet triage: parity with B2G/B2G Desktop -skip-if(B2G) fuzzy-if(Android,8,50) == 336736-1a.html 336736-1a.html -# Bug 1168747 for random b2g timeouts -skip-if(B2G) fuzzy-if(Android,8,50) == 336736-1b.html 336736-1b.html -# Bug 1168747 for random b2g timeouts -== 406073-1.html 406073-1.html -== 407016-2.html 407016-2.html -fuzzy-if(Android,8,220) == 413027-4.html 413027-4.html -fuzzy-if(Android,8,30) == 425247-1.html 425247-1.html -fuzzy-if(Android,8,30) == 425247-2.html 425247-2.html -random == 429849-1.html 429849-1.html -# bug 432288 -== 1160342-1.html 1160342-1.html -== 1160342-2.html 1160342-2.html diff --git a/layout/reftests/marquee/reftest.list b/layout/reftests/marquee/reftest.list deleted file mode 100644 index f033b4634..000000000 --- a/layout/reftests/marquee/reftest.list +++ /dev/null @@ -1,11 +0,0 @@ -== 166591-dynamic-1.html 166591-dynamic-1-ref.html -fuzzy-if(Android,8,50) == 336736-1a.html 336736-1-ref.html -fuzzy-if(Android,8,50) == 336736-1b.html 336736-1-ref.html -== 406073-1.html 406073-1-ref.html -== 407016-2.html 407016-2-ref.html -fuzzy-if(Android,8,220) == 413027-4.html 413027-4-ref.html -fuzzy-if(Android,8,30) == 425247-1.html 425247-1-ref.html -fuzzy-if(Android,8,30) == 425247-2.html 425247-2-ref.html -random == 429849-1.html 429849-1-ref.html # bug 432288 -== 1160342-1.html 1160342-ref.html -== 1160342-2.html 1160342-ref.html diff --git a/layout/reftests/moz.build b/layout/reftests/moz.build index d486e5639..3ab3d4246 100644 --- a/layout/reftests/moz.build +++ b/layout/reftests/moz.build @@ -201,8 +201,6 @@ with Files('list-item/**'): BUG_COMPONENT = ('Core', 'Layout: Block and Inline') with Files('margin-collapsing/**'): BUG_COMPONENT = ('Core', 'Layout: Block and Inline') -with Files('marquee/**'): - BUG_COMPONENT = ('Core', 'CSS Parsing and Computation') with Files('mathml/**'): BUG_COMPONENT = ('Core', 'MathML') with Files('native-theme/**'): diff --git a/layout/reftests/reftest-stylo.list b/layout/reftests/reftest-stylo.list index 7d4078f22..54afc3dac 100644 --- a/layout/reftests/reftest-stylo.list +++ b/layout/reftests/reftest-stylo.list @@ -249,9 +249,6 @@ include mathml/reftest-stylo.list # margin-collapsing include margin-collapsing/reftest-stylo.list -# marquee/ -include marquee/reftest-stylo.list - # native-theme/ # skipping for B2G since something around radio-nonnative.html makes the whole suite hang skip-if(B2G||Android||Mulet) include native-theme/reftest-stylo.list diff --git a/layout/reftests/reftest.list b/layout/reftests/reftest.list index b2da025d5..b06eba58e 100644 --- a/layout/reftests/reftest.list +++ b/layout/reftests/reftest.list @@ -247,9 +247,6 @@ include mathml/reftest.list # margin-collapsing include margin-collapsing/reftest.list -# marquee/ -include marquee/reftest.list - # native-theme/ # (no XUL theme on Android) skip-if(Android) include native-theme/reftest.list diff --git a/layout/reftests/writing-mode/reftest-stylo.list b/layout/reftests/writing-mode/reftest-stylo.list index 5574d9b5b..76f6813e6 100644 --- a/layout/reftests/writing-mode/reftest-stylo.list +++ b/layout/reftests/writing-mode/reftest-stylo.list @@ -65,8 +65,6 @@ HTTP(..) == 1115916-1-vertical-metrics.html 1115916-1-vertical-metrics.html == ua-style-sheet-border-3.html ua-style-sheet-border-3.html == ua-style-sheet-border-4.html ua-style-sheet-border-4.html == ua-style-sheet-border-5.html ua-style-sheet-border-5.html -== ua-style-sheet-size-1.html ua-style-sheet-size-1.html -== ua-style-sheet-size-2.html ua-style-sheet-size-2.html == ua-style-sheet-fieldset-1.html ua-style-sheet-fieldset-1.html skip-if(Android||B2G||Mulet||(winWidget&&!/^Windows\x20NT\x205\.1/.test(http.oscpu))) == ua-style-sheet-textarea-1.html ua-style-sheet-textarea-1.html diff --git a/layout/reftests/writing-mode/reftest.list b/layout/reftests/writing-mode/reftest.list index b670dbd13..13c58d2cb 100644 --- a/layout/reftests/writing-mode/reftest.list +++ b/layout/reftests/writing-mode/reftest.list @@ -58,8 +58,6 @@ fuzzy(116,94) fuzzy-if(winWidget,135,124) HTTP(..) == 1115916-1-vertical-metrics == ua-style-sheet-border-3.html ua-style-sheet-border-3-ref.html == ua-style-sheet-border-4.html ua-style-sheet-border-4-ref.html == ua-style-sheet-border-5.html ua-style-sheet-border-5-ref.html -== ua-style-sheet-size-1.html ua-style-sheet-size-1-ref.html -== ua-style-sheet-size-2.html ua-style-sheet-size-2-ref.html == ua-style-sheet-fieldset-1.html ua-style-sheet-fieldset-1-ref.html skip-if(Android||(winWidget&&!/^Windows\x20NT\x205\.1/.test(http.oscpu))) == ua-style-sheet-textarea-1.html ua-style-sheet-textarea-1a-ref.html diff --git a/layout/reftests/writing-mode/ua-style-sheet-size-1-ref.html b/layout/reftests/writing-mode/ua-style-sheet-size-1-ref.html deleted file mode 100644 index 06f6d5700..000000000 --- a/layout/reftests/writing-mode/ua-style-sheet-size-1-ref.html +++ /dev/null @@ -1,22 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<title>Test for logical margins on marquee elements in the UA style sheet</title> -<style> -.v-rl { writing-mode: vertical-rl; } -.ltr, .rtl, .v-rl { border: 1px solid blue; padding: 16px; } -marquee { background-color: yellow; color: transparent; } -.ltr marquee { width: -moz-available; height: auto; } -.rtl marquee { width: -moz-available; height: auto; } -.v-rl marquee { width: auto; height: -moz-available; } -</style> -<div class=ltr> - <marquee>A</marquee> -</div> -<div class=rtl dir=rtl> - <marquee>A</marquee> -</div> -<!-- disabled until bug 1132308 -<div class=v-rl> - <marquee>A</marquee> -</div> ---> diff --git a/layout/reftests/writing-mode/ua-style-sheet-size-1.html b/layout/reftests/writing-mode/ua-style-sheet-size-1.html deleted file mode 100644 index 754908501..000000000 --- a/layout/reftests/writing-mode/ua-style-sheet-size-1.html +++ /dev/null @@ -1,19 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<title>Test for logical sizes on marquee elements in the UA style sheet</title> -<style> -.v-rl { writing-mode: vertical-rl; } -.ltr, .rtl, .v-rl { border: 1px solid blue; padding: 16px; } -marquee { background-color: yellow; color: transparent; } -</style> -<div class=ltr> - <marquee>A</marquee> -</div> -<div class=rtl dir=rtl> - <marquee>A</marquee> -</div> -<!-- disabled until bug 1132308 -<div class=v-rl> - <marquee>A</marquee> -</div> ---> diff --git a/layout/reftests/writing-mode/ua-style-sheet-size-2-ref.html b/layout/reftests/writing-mode/ua-style-sheet-size-2-ref.html deleted file mode 100644 index 3c53326ba..000000000 --- a/layout/reftests/writing-mode/ua-style-sheet-size-2-ref.html +++ /dev/null @@ -1,22 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<title>Test for logical margins on marquee elements in the UA style sheet</title> -<style> -.v-rl { writing-mode: vertical-rl; } -.ltr, .rtl, .v-rl { border: 1px solid blue; padding: 16px; } -marquee { background-color: yellow; color: transparent; } -.ltr marquee { width: -moz-available; height: 200px; } -.rtl marquee { width: -moz-available; height: 200px; } -.v-rl marquee { width: 200px; height: -moz-available; } -</style> -<div class=ltr> - <marquee direction=down>A</marquee> -</div> -<div class=rtl dir=rtl> - <marquee direction=down>A</marquee> -</div> -<!-- disabled until bug 1132308 -<div class=v-rl> - <marquee direction=down>A</marquee> -</div> ---> diff --git a/layout/reftests/writing-mode/ua-style-sheet-size-2.html b/layout/reftests/writing-mode/ua-style-sheet-size-2.html deleted file mode 100644 index 1c0be6f4b..000000000 --- a/layout/reftests/writing-mode/ua-style-sheet-size-2.html +++ /dev/null @@ -1,19 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<title>Test for logical sizes on marquee elements in the UA style sheet</title> -<style> -.v-rl { writing-mode: vertical-rl; } -.ltr, .rtl, .v-rl { border: 1px solid blue; padding: 16px; } -marquee { background-color: yellow; color: transparent; } -</style> -<div class=ltr> - <marquee direction=down>A</marquee> -</div> -<div class=rtl dir=rtl> - <marquee direction=down>A</marquee> -</div> -<!-- disabled until bug 1132308 -<div class=v-rl> - <marquee direction=down>A</marquee> -</div> ---> diff --git a/layout/style/Loader.cpp b/layout/style/Loader.cpp index df523174d..a06dd3737 100644 --- a/layout/style/Loader.cpp +++ b/layout/style/Loader.cpp @@ -2272,7 +2272,6 @@ Loader::LoadChildSheet(StyleSheet* aParentSheet, state = eSheetComplete; } else { bool isAlternate; - bool isExplicitlyEnabled; const nsSubstring& empty = EmptyString(); // For now, use CORS_NONE for child sheets rv = CreateSheet(aURL, nullptr, principal, @@ -2282,8 +2281,9 @@ Loader::LoadChildSheet(StyleSheet* aParentSheet, parentData ? parentData->mSyncLoad : false, false, empty, state, &isAlternate, &sheet); NS_ENSURE_SUCCESS(rv, rv); - - PrepareSheet(sheet, empty, empty, aMedia, nullptr, isAlternate, isExplicitlyEnabled); + // For now, child sheets are not explicitly enabled (seventh argument is + // always false here). + PrepareSheet(sheet, empty, empty, aMedia, nullptr, isAlternate, false); } rv = InsertChildSheet(sheet, aParentSheet, aParentRule); @@ -2396,7 +2396,6 @@ Loader::InternalLoadNonDocumentSheet(nsIURI* aURL, StyleSheetState state; bool isAlternate; - bool isExplicitlyEnabled; RefPtr<StyleSheet> sheet; bool syncLoad = (aObserver == nullptr); const nsSubstring& empty = EmptyString(); @@ -2406,7 +2405,10 @@ Loader::InternalLoadNonDocumentSheet(nsIURI* aURL, false, empty, state, &isAlternate, &sheet); NS_ENSURE_SUCCESS(rv, rv); - PrepareSheet(sheet, empty, empty, nullptr, nullptr, isAlternate, isExplicitlyEnabled); + // Sheets can only be explicitly enabled after creation and preparation, so + // we always pass false for the initial value of the explicitly enabled flag + // when calling PrepareSheet. + PrepareSheet(sheet, empty, empty, nullptr, nullptr, isAlternate, false); if (state == eSheetComplete) { LOG((" Sheet already complete")); diff --git a/layout/style/MediaQueryList.cpp b/layout/style/MediaQueryList.cpp index db3781b76..5838645be 100644 --- a/layout/style/MediaQueryList.cpp +++ b/layout/style/MediaQueryList.cpp @@ -1,5 +1,4 @@ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=8 autoindent cindent expandtab: */ /* 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/. */ @@ -7,19 +6,26 @@ /* implements DOM interface for querying and observing media queries */ #include "mozilla/dom/MediaQueryList.h" +#include "mozilla/dom/MediaQueryListEvent.h" +#include "mozilla/dom/EventTarget.h" +#include "mozilla/dom/EventTargetBinding.h" #include "nsPresContext.h" #include "nsIMediaList.h" #include "nsCSSParser.h" #include "nsIDocument.h" +// Fixed event target type +#define ONCHANGE_STRING NS_LITERAL_STRING("change") + namespace mozilla { namespace dom { MediaQueryList::MediaQueryList(nsIDocument *aDocument, const nsAString &aMediaQueryList) - : mDocument(aDocument), - mMediaList(new nsMediaList), - mMatchesValid(false) + : mDocument(aDocument) + , mMediaList(new nsMediaList) + , mMatchesValid(false) + , mIsKeptAlive(false) { PR_INIT_CLIST(this); @@ -36,30 +42,24 @@ MediaQueryList::~MediaQueryList() NS_IMPL_CYCLE_COLLECTION_CLASS(MediaQueryList) -NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(MediaQueryList) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(MediaQueryList, DOMEventTargetHelper) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocument) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCallbacks) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END -NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(MediaQueryList) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MediaQueryList, DOMEventTargetHelper) if (tmp->mDocument) { PR_REMOVE_LINK(tmp); NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocument) } - tmp->RemoveAllListeners(); + tmp->Disconnect(); NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END -NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(MediaQueryList) - -NS_INTERFACE_MAP_BEGIN(MediaQueryList) - NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY - NS_INTERFACE_MAP_ENTRY(nsISupports) - NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(MediaQueryList) -NS_INTERFACE_MAP_END +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaQueryList) +NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) -NS_IMPL_CYCLE_COLLECTING_ADDREF(MediaQueryList) -NS_IMPL_CYCLE_COLLECTING_RELEASE(MediaQueryList) +NS_IMPL_ADDREF_INHERITED(MediaQueryList, DOMEventTargetHelper) +NS_IMPL_RELEASE_INHERITED(MediaQueryList, DOMEventTargetHelper) void MediaQueryList::GetMedia(nsAString &aMedia) @@ -80,57 +80,124 @@ MediaQueryList::Matches() } void -MediaQueryList::AddListener(MediaQueryListListener& aListener) +MediaQueryList::AddListener(EventListener* aListener, ErrorResult& aRv) { - if (!HasListeners()) { - // When we have listeners, the pres context owns a reference to - // this. This is a cyclic reference that can only be broken by - // cycle collection. - NS_ADDREF_THIS(); + if (!aListener) { + return; } + AddEventListenerOptionsOrBoolean options; + options.SetAsBoolean() = false; + + AddEventListener(ONCHANGE_STRING, aListener, options, Nullable<bool>(), aRv); +} + +void +MediaQueryList::AddEventListener(const nsAString& aType, + EventListener* aCallback, + const AddEventListenerOptionsOrBoolean& aOptions, + const dom::Nullable<bool>& aWantsUntrusted, + ErrorResult& aRv) +{ if (!mMatchesValid) { MOZ_ASSERT(!HasListeners(), "when listeners present, must keep mMatches current"); RecomputeMatches(); } - for (uint32_t i = 0; i < mCallbacks.Length(); ++i) { - if (aListener == *mCallbacks[i]) { - // Already registered - return; - } + DOMEventTargetHelper::AddEventListener(aType, aCallback, aOptions, + aWantsUntrusted, aRv); + + if (aRv.Failed()) { + return; } - if (!mCallbacks.AppendElement(&aListener, fallible)) { - if (!HasListeners()) { - // Append failed; undo the AddRef above. - NS_RELEASE_THIS(); - } + UpdateMustKeepAlive(); +} + +void +MediaQueryList::RemoveListener(EventListener* aListener, ErrorResult& aRv) +{ + if (!aListener) { + return; } + + EventListenerOptionsOrBoolean options; + options.SetAsBoolean() = false; + + RemoveEventListener(ONCHANGE_STRING, aListener, options, aRv); } void -MediaQueryList::RemoveListener(MediaQueryListListener& aListener) -{ - for (uint32_t i = 0; i < mCallbacks.Length(); ++i) { - if (aListener == *mCallbacks[i]) { - mCallbacks.RemoveElementAt(i); - if (!HasListeners()) { - // See NS_ADDREF_THIS() in AddListener. - NS_RELEASE_THIS(); - } - break; - } +MediaQueryList::RemoveEventListener(const nsAString& aType, + EventListener* aCallback, + const EventListenerOptionsOrBoolean& aOptions, + ErrorResult& aRv) +{ + DOMEventTargetHelper::RemoveEventListener(aType, aCallback, aOptions, aRv); + + if (aRv.Failed()) { + return; + } + + UpdateMustKeepAlive(); +} + +EventHandlerNonNull* +MediaQueryList::GetOnchange() +{ + if (NS_IsMainThread()) { + return GetEventHandler(nsGkAtoms::onchange, EmptyString()); + } + return GetEventHandler(nullptr, ONCHANGE_STRING); +} + +void +MediaQueryList::SetOnchange(EventHandlerNonNull* aCallback) +{ + if (NS_IsMainThread()) { + SetEventHandler(nsGkAtoms::onchange, EmptyString(), aCallback); + } else { + SetEventHandler(nullptr, ONCHANGE_STRING, aCallback); } + + UpdateMustKeepAlive(); } void -MediaQueryList::RemoveAllListeners() +MediaQueryList::UpdateMustKeepAlive() { - bool hadListeners = HasListeners(); - mCallbacks.Clear(); - if (hadListeners) { + bool toKeepAlive = HasListeners(); + if (toKeepAlive == mIsKeptAlive) { + return; + } + + // When we have listeners, the pres context owns a reference to + // this. This is a cyclic reference that can only be broken by + // cycle collection. + + mIsKeptAlive = toKeepAlive; + + if (toKeepAlive) { + NS_ADDREF_THIS(); + } else { + NS_RELEASE_THIS(); + } +} + +bool +MediaQueryList::HasListeners() +{ + return HasListenersFor(ONCHANGE_STRING); +} + +void +MediaQueryList::Disconnect() +{ + DisconnectFromOwner(); + + if (mIsKeptAlive) { + mIsKeptAlive = false; // See NS_ADDREF_THIS() in AddListener. NS_RELEASE_THIS(); } @@ -169,27 +236,6 @@ MediaQueryList::RecomputeMatches() mMatchesValid = true; } -void -MediaQueryList::MediumFeaturesChanged( - nsTArray<HandleChangeData>& aListenersToNotify) -{ - mMatchesValid = false; - - if (HasListeners()) { - bool oldMatches = mMatches; - RecomputeMatches(); - if (mMatches != oldMatches) { - for (uint32_t i = 0, i_end = mCallbacks.Length(); i != i_end; ++i) { - HandleChangeData *d = aListenersToNotify.AppendElement(fallible); - if (d) { - d->mql = this; - d->callback = mCallbacks[i]; - } - } - } - } -} - nsISupports* MediaQueryList::GetParentObject() const { @@ -202,5 +248,36 @@ MediaQueryList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) return MediaQueryListBinding::Wrap(aCx, this, aGivenProto); } +void +MediaQueryList::MaybeNotify() +{ + mMatchesValid = false; + + if (!HasListeners()) { + return; + } + + bool oldMatches = mMatches; + RecomputeMatches(); + + // No need to notify the change. + if (mMatches == oldMatches) { + return; + } + + MediaQueryListEventInit init; + init.mBubbles = false; + init.mCancelable = false; + init.mMatches = mMatches; + mMediaList->GetText(init.mMedia); + + RefPtr<MediaQueryListEvent> event = + MediaQueryListEvent::Constructor(this, ONCHANGE_STRING, init); + event->SetTrusted(true); + + bool dummy; + DispatchEvent(event, &dummy); +} + } // namespace dom } // namespace mozilla diff --git a/layout/style/MediaQueryList.h b/layout/style/MediaQueryList.h index 5ba568528..d2acb34c1 100644 --- a/layout/style/MediaQueryList.h +++ b/layout/style/MediaQueryList.h @@ -16,6 +16,7 @@ #include "prclist.h" #include "mozilla/Attributes.h" #include "nsWrapperCache.h" +#include "mozilla/DOMEventTargetHelper.h" #include "mozilla/dom/MediaQueryListBinding.h" class nsIDocument; @@ -24,8 +25,7 @@ class nsMediaList; namespace mozilla { namespace dom { -class MediaQueryList final : public nsISupports, - public nsWrapperCache, +class MediaQueryList final : public DOMEventTargetHelper, public PRCList { public: @@ -37,33 +37,45 @@ private: ~MediaQueryList(); public: - NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(MediaQueryList) + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaQueryList, DOMEventTargetHelper) nsISupports* GetParentObject() const; - struct HandleChangeData { - RefPtr<MediaQueryList> mql; - RefPtr<mozilla::dom::MediaQueryListListener> callback; - }; - - // Appends listeners that need notification to aListenersToNotify - void MediumFeaturesChanged(nsTArray<HandleChangeData>& aListenersToNotify); - - bool HasListeners() const { return !mCallbacks.IsEmpty(); } - - void RemoveAllListeners(); + void MaybeNotify(); JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override; // WebIDL methods void GetMedia(nsAString& aMedia); bool Matches(); - void AddListener(mozilla::dom::MediaQueryListListener& aListener); - void RemoveListener(mozilla::dom::MediaQueryListListener& aListener); + void AddListener(EventListener* aListener, ErrorResult& aRv); + void RemoveListener(EventListener* aListener, ErrorResult& aRv); + + EventHandlerNonNull* GetOnchange(); + void SetOnchange(EventHandlerNonNull* aCallback); + + using nsIDOMEventTarget::AddEventListener; + using nsIDOMEventTarget::RemoveEventListener; + + virtual void AddEventListener(const nsAString& aType, + EventListener* aCallback, + const AddEventListenerOptionsOrBoolean& aOptions, + const Nullable<bool>& aWantsUntrusted, + ErrorResult& aRv) override; + virtual void RemoveEventListener(const nsAString& aType, + EventListener* aCallback, + const EventListenerOptionsOrBoolean& aOptions, + ErrorResult& aRv) override; + + bool HasListeners(); + + void Disconnect(); private: void RecomputeMatches(); + + void UpdateMustKeepAlive(); // We only need a pointer to the document to support lazy // reevaluation following dynamic changes. However, this lazy @@ -84,7 +96,7 @@ private: RefPtr<nsMediaList> mMediaList; bool mMatches; bool mMatchesValid; - nsTArray<RefPtr<mozilla::dom::MediaQueryListListener>> mCallbacks; + bool mIsKeptAlive; }; } // namespace dom diff --git a/layout/style/contenteditable.css b/layout/style/contenteditable.css index c550bc7c9..6d569f75e 100644 --- a/layout/style/contenteditable.css +++ b/layout/style/contenteditable.css @@ -80,15 +80,6 @@ input[contenteditable="true"][type="file"] { -moz-user-focus: none !important; } -/* emulation of non-standard HTML <marquee> tag */ -marquee:-moz-read-write { - -moz-binding: url('chrome://xbl-marquee/content/xbl-marquee.xml#marquee-horizontal-editable'); -} - -marquee[direction="up"]:-moz-read-write, marquee[direction="down"]:-moz-read-write { - -moz-binding: url('chrome://xbl-marquee/content/xbl-marquee.xml#marquee-vertical-editable'); -} - *|*:-moz-read-write > input[type="hidden"], input[contenteditable="true"][type="hidden"] { border: 1px solid black !important; diff --git a/layout/style/moz.build b/layout/style/moz.build index ff06b5101..bdc86ee99 100644 --- a/layout/style/moz.build +++ b/layout/style/moz.build @@ -19,7 +19,6 @@ with Files('CSSRuleList.*'): with Files('nsDOM*'): BUG_COMPONENT = ('Core', 'DOM: CSS Object Model') -DIRS += ['xbl-marquee'] TEST_DIRS += ['test'] XPIDL_SOURCES += [ diff --git a/layout/style/nsCSSKeywordList.h b/layout/style/nsCSSKeywordList.h index 34a46ffce..9045da9ff 100644 --- a/layout/style/nsCSSKeywordList.h +++ b/layout/style/nsCSSKeywordList.h @@ -285,6 +285,7 @@ CSS_KEY(flex, flex) CSS_KEY(flex-end, flex_end) CSS_KEY(flex-start, flex_start) CSS_KEY(flip, flip) +CSS_KEY(flow-root, flow_root) CSS_KEY(forwards, forwards) CSS_KEY(fraktur, fraktur) CSS_KEY(from-image, from_image) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index 556e35406..1525c5f9a 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -1300,7 +1300,7 @@ protected: } bool ParseNonNegativeNumber(nsCSSValue& aValue) { - return ParseSingleTokenNonNegativeVariant(aValue, VARIANT_NUMBER, nullptr); + return ParseSingleTokenNonNegativeVariant(aValue, VARIANT_NUMBER | VARIANT_OPACITY, nullptr); } // Helpers for some common ParseSingleTokenOneOrLargerVariant calls. @@ -1310,7 +1310,7 @@ protected: } bool ParseOneOrLargerNumber(nsCSSValue& aValue) { - return ParseSingleTokenOneOrLargerVariant(aValue, VARIANT_NUMBER, nullptr); + return ParseSingleTokenOneOrLargerVariant(aValue, VARIANT_NUMBER | VARIANT_OPACITY, nullptr); } // http://dev.w3.org/csswg/css-values/#custom-idents @@ -5941,8 +5941,6 @@ CSSParserImpl::ParseAttributeSelector(int32_t& aDataMask, "language", "defer", "type", - // additional attributes not in HTML4 - "direction", // marquee nullptr }; short i = 0; @@ -7791,6 +7789,7 @@ CSSParserImpl::ParseNonNegativeVariant(nsCSSValue& aValue, VARIANT_NUMBER | VARIANT_LENGTH | VARIANT_PERCENT | + VARIANT_OPACITY | VARIANT_INTEGER)) == 0, "need to update code below to handle additional variants"); @@ -7831,6 +7830,7 @@ CSSParserImpl::ParseOneOrLargerVariant(nsCSSValue& aValue, // that we specifically handle. MOZ_ASSERT((aVariantMask & ~(VARIANT_ALL_NONNUMERIC | VARIANT_NUMBER | + VARIANT_OPACITY | VARIANT_INTEGER)) == 0, "need to update code below to handle additional variants"); @@ -7959,9 +7959,9 @@ CSSParserImpl::ParseVariant(nsCSSValue& aValue, } } } - // Check VARIANT_NUMBER and VARIANT_INTEGER before VARIANT_LENGTH or - // VARIANT_ZERO_ANGLE. - if (((aVariantMask & VARIANT_NUMBER) != 0) && + // Check VARIANT_NUMBER, number tokens for VARIANT_OPACITY, and + // VARIANT_INTEGER before VARIANT_LENGTH or VARIANT_ZERO_ANGLE. + if (((aVariantMask & (VARIANT_NUMBER | VARIANT_OPACITY)) != 0) && (eCSSToken_Number == tk->mType)) { aValue.SetFloatValue(tk->mNumber, eCSSUnit_Number); return CSSParseResult::Ok; @@ -7971,6 +7971,7 @@ CSSParserImpl::ParseVariant(nsCSSValue& aValue, aValue.SetIntValue(tk->mInteger, eCSSUnit_Integer); return CSSParseResult::Ok; } + if (((aVariantMask & (VARIANT_LENGTH | VARIANT_ANGLE | VARIANT_FREQUENCY | VARIANT_TIME)) != 0 && eCSSToken_Dimension == tk->mType) || @@ -7996,6 +7997,15 @@ CSSParserImpl::ParseVariant(nsCSSValue& aValue, aValue.SetPercentValue(tk->mNumber); return CSSParseResult::Ok; } + // We need to store eCSSToken_Percentage in eCSSUnit_Number in order to + // serialize opacity according to spec. All percentage tokens are stored + // as floats, so no type conversion is needed to make this possible. + // Percentage tokens have to be evaluated later than number tokens. + if (((aVariantMask & VARIANT_OPACITY) != 0) && + (eCSSToken_Percentage == tk->mType)) { + aValue.SetFloatValue(tk->mNumber, eCSSUnit_Number); + return CSSParseResult::Ok; + } if (mUnitlessLengthQuirk) { // NONSTANDARD: Nav interprets unitless numbers as px if (((aVariantMask & VARIANT_LENGTH) != 0) && (eCSSToken_Number == tk->mType)) { @@ -8474,7 +8484,7 @@ CSSParserImpl::ParseImageRect(nsCSSValue& aImage) break; } - static const int32_t VARIANT_SIDE = VARIANT_NUMBER | VARIANT_PERCENT; + static const int32_t VARIANT_SIDE = VARIANT_NUMBER | VARIANT_PERCENT | VARIANT_OPACITY; if (!ParseSingleTokenNonNegativeVariant(top, VARIANT_SIDE, nullptr) || !ExpectSymbol(',', true) || !ParseSingleTokenNonNegativeVariant(right, VARIANT_SIDE, nullptr) || @@ -10883,7 +10893,7 @@ CSSParserImpl::ParseWebkitGradientColorStop(nsCSSValueGradient* aGradient) if (mToken.mIdent.LowerCaseEqualsLiteral("color-stop")) { // Parse stop location, followed by comma. if (!ParseSingleTokenVariant(stop->mLocation, - VARIANT_NUMBER | VARIANT_PERCENT, + VARIANT_NUMBER | VARIANT_PERCENT | VARIANT_OPACITY, nullptr) || !ExpectSymbol(',', true)) { SkipUntil(')'); // Skip to end of color-stop(...) expression. @@ -15318,17 +15328,17 @@ CSSParserImpl::ParseFontFeatureSettings(nsCSSValue& aValue) return true; } -bool
-CSSParserImpl::ParseFontVariationSettings(nsCSSValue& aValue)
-{
- // TODO: Actually implement this.
-
- // This stub is here because websites insist on considering this
- // very hardware-dependent and O.S.-variable low-level font-control
- // as a "critical feature" which it isn't as there is 0 guarantee
- // that font variation settings are supported or honored by any
- // operating system used by the client.
- return true;
+bool +CSSParserImpl::ParseFontVariationSettings(nsCSSValue& aValue) +{ + // TODO: Actually implement this. + + // This stub is here because websites insist on considering this + // very hardware-dependent and O.S.-variable low-level font-control + // as a "critical feature" which it isn't as there is 0 guarantee + // that font variation settings are supported or honored by any + // operating system used by the client. + return true; } bool @@ -16046,7 +16056,7 @@ static bool GetFunctionParseInformation(nsCSSKeyword aToken, {VARIANT_LBCALC, VARIANT_LBCALC, VARIANT_LBCALC}, {VARIANT_ANGLE_OR_ZERO}, {VARIANT_ANGLE_OR_ZERO, VARIANT_ANGLE_OR_ZERO}, - {VARIANT_NUMBER}, + {VARIANT_NUMBER|VARIANT_OPACITY}, {VARIANT_LENGTH|VARIANT_NONNEGATIVE_DIMENSION}, {VARIANT_LB|VARIANT_NONNEGATIVE_DIMENSION}, {VARIANT_NUMBER, VARIANT_NUMBER}, @@ -17628,7 +17638,7 @@ CSSParserImpl::ParseScrollSnapPoints(nsCSSValue& aValue, nsCSSPropertyID aPropID nsCSSKeywords::LookupKeyword(mToken.mIdent) == eCSSKeyword_repeat) { nsCSSValue lengthValue; if (ParseNonNegativeVariant(lengthValue, - VARIANT_LENGTH | VARIANT_PERCENT | VARIANT_CALC, + VARIANT_LENGTH | VARIANT_PERCENT | VARIANT_OPACITY | VARIANT_CALC, nullptr) != CSSParseResult::Ok) { REPORT_UNEXPECTED(PEExpectedNonnegativeNP); SkipUntil(')'); diff --git a/layout/style/nsCSSPropList.h b/layout/style/nsCSSPropList.h index f62aa3827..890019245 100644 --- a/layout/style/nsCSSPropList.h +++ b/layout/style/nsCSSPropList.h @@ -1703,7 +1703,7 @@ CSS_PROP_SVG( FillOpacity, CSS_PROPERTY_PARSE_VALUE, "", - VARIANT_HN | VARIANT_OPENTYPE_SVG_KEYWORD, + VARIANT_INHERIT | VARIANT_OPACITY | VARIANT_OPENTYPE_SVG_KEYWORD, kContextOpacityKTable, offsetof(nsStyleSVG, mFillOpacity), eStyleAnimType_float) @@ -1841,7 +1841,7 @@ CSS_PROP_SVGRESET( FloodOpacity, CSS_PROPERTY_PARSE_VALUE, "", - VARIANT_HN, + VARIANT_INHERIT | VARIANT_OPACITY, nullptr, offsetof(nsStyleSVGReset, mFloodOpacity), eStyleAnimType_float) @@ -3070,7 +3070,7 @@ CSS_PROP_EFFECTS( CSS_PROPERTY_CAN_ANIMATE_ON_COMPOSITOR | CSS_PROPERTY_CREATES_STACKING_CONTEXT, "", - VARIANT_HN, + VARIANT_INHERIT | VARIANT_OPACITY, nullptr, offsetof(nsStyleEffects, mOpacity), eStyleAnimType_float) @@ -3761,7 +3761,7 @@ CSS_PROP_SVGRESET( StopOpacity, CSS_PROPERTY_PARSE_VALUE, "", - VARIANT_HN, + VARIANT_INHERIT | VARIANT_OPACITY, nullptr, offsetof(nsStyleSVGReset, mStopOpacity), eStyleAnimType_float) @@ -3836,7 +3836,7 @@ CSS_PROP_SVG( StrokeOpacity, CSS_PROPERTY_PARSE_VALUE, "", - VARIANT_HN | VARIANT_OPENTYPE_SVG_KEYWORD, + VARIANT_INHERIT | VARIANT_OPACITY | VARIANT_OPENTYPE_SVG_KEYWORD, kContextOpacityKTable, offsetof(nsStyleSVG, mStrokeOpacity), eStyleAnimType_float) diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp index ac2978c27..24c97cf33 100644 --- a/layout/style/nsCSSProps.cpp +++ b/layout/style/nsCSSProps.cpp @@ -1345,6 +1345,9 @@ KTableEntry nsCSSProps::kDisplayKTable[] = { // The next entry is controlled by the layout.css.display-contents.enabled // pref. { eCSSKeyword_contents, StyleDisplay::Contents }, + // The next entry is controlled by the layout.css.display-flow-root.enabled + // pref. + { eCSSKeyword_flow_root, StyleDisplay::FlowRoot }, { eCSSKeyword_UNKNOWN, -1 } }; diff --git a/layout/style/nsCSSProps.h b/layout/style/nsCSSProps.h index aabbac07a..34d457c08 100644 --- a/layout/style/nsCSSProps.h +++ b/layout/style/nsCSSProps.h @@ -43,6 +43,7 @@ #define VARIANT_IDENTIFIER 0x002000 // D #define VARIANT_IDENTIFIER_NO_INHERIT 0x004000 // like above, but excluding // 'inherit' and 'initial' +#define VARIANT_OPACITY 0x008000 // Take floats and percents as input, output float. #define VARIANT_AUTO 0x010000 // A #define VARIANT_INHERIT 0x020000 // H eCSSUnit_Initial, eCSSUnit_Inherit, eCSSUnit_Unset #define VARIANT_NONE 0x040000 // O diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index 1a451a2ef..036d97f86 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -250,6 +250,7 @@ nsRuleNode::EnsureBlockDisplay(StyleDisplay& display, case StyleDisplay::Flex: case StyleDisplay::WebkitBox: case StyleDisplay::Grid: + case StyleDisplay::FlowRoot: // do not muck with these at all - already blocks // This is equivalent to nsStyleDisplay::IsBlockOutside. (XXX Maybe we // should just call that?) @@ -293,6 +294,7 @@ nsRuleNode::EnsureInlineDisplay(StyleDisplay& display) // see if the display value is already inline switch (display) { case StyleDisplay::Block: + case StyleDisplay::FlowRoot: display = StyleDisplay::InlineBlock; break; case StyleDisplay::Table: diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 6d207aec9..f54387aa8 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -524,6 +524,7 @@ enum class FillMode : uint32_t; enum class StyleDisplay : uint8_t { None = 0, Block, + FlowRoot, Inline, InlineBlock, ListItem, diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index 4bda817dd..f49cdc43e 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -2890,7 +2890,8 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleDisplay return mozilla::StyleDisplay::Block == mDisplay || mozilla::StyleDisplay::ListItem == mDisplay || mozilla::StyleDisplay::InlineBlock == mDisplay || - mozilla::StyleDisplay::TableCaption == mDisplay; + mozilla::StyleDisplay::TableCaption == mDisplay || + mozilla::StyleDisplay::FlowRoot == mDisplay; // Should TABLE_CELL be included here? They have // block frames nested inside of them. // (But please audit all callers before changing.) @@ -2902,7 +2903,8 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleDisplay mozilla::StyleDisplay::WebkitBox == mDisplay || mozilla::StyleDisplay::Grid == mDisplay || mozilla::StyleDisplay::ListItem == mDisplay || - mozilla::StyleDisplay::Table == mDisplay; + mozilla::StyleDisplay::Table == mDisplay || + mozilla::StyleDisplay::FlowRoot == mDisplay; } static bool IsDisplayTypeInlineOutside(mozilla::StyleDisplay aDisplay) { diff --git a/layout/style/res/html.css b/layout/style/res/html.css index 44e41c8d0..b975bf0c9 100644 --- a/layout/style/res/html.css +++ b/layout/style/res/html.css @@ -64,7 +64,6 @@ legend, li, listing, main, -marquee, menu, nav, noframes, @@ -819,25 +818,9 @@ dialog:not([open]) { display: none; } -/* emulation of non-standard HTML <marquee> tag */ -marquee { - inline-size: -moz-available; - display: inline-block; - vertical-align: text-bottom; - text-align: start; - -moz-binding: url('chrome://xbl-marquee/content/xbl-marquee.xml#marquee-horizontal'); -} - -marquee[direction="up"], marquee[direction="down"] { - -moz-binding: url('chrome://xbl-marquee/content/xbl-marquee.xml#marquee-vertical'); - block-size: 200px; -} - /* PRINT ONLY rules follow */ @media print { - marquee { -moz-binding: none; } - } /* Ruby */ diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index c75f7b498..bc4383630 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -3540,7 +3540,7 @@ var gCSSProperties = { inherited: false, type: CSS_TYPE_LONGHAND, initial_values: [ "1", "17", "397.376", "3e1", "3e+1", "3e0", "3e+0", "3e-0" ], - other_values: [ "0", "0.4", "0.0000", "-3", "3e-1" ], + other_values: [ "0", "0.4", "0.0000", "-3", "3e-1" "-100%", "50%" ], invalid_values: [ "0px", "1px" ] }, "-moz-orient": { @@ -4272,8 +4272,8 @@ var gCSSProperties = { domProp: "fillOpacity", inherited: true, type: CSS_TYPE_LONGHAND, - initial_values: [ "1", "2.8", "1.000", "context-fill-opacity", "context-stroke-opacity" ], - other_values: [ "0", "0.3", "-7.3" ], + initial_values: [ "1", "2.8", "1.000", "300%", "context-fill-opacity", "context-stroke-opacity" ], + other_values: [ "0", "0.3", "-7.3", "-100%", "50%" ], invalid_values: [] }, "fill-rule": { @@ -4305,8 +4305,8 @@ var gCSSProperties = { domProp: "floodOpacity", inherited: false, type: CSS_TYPE_LONGHAND, - initial_values: [ "1", "2.8", "1.000" ], - other_values: [ "0", "0.3", "-7.3" ], + initial_values: [ "1", "2.8", "1.000", "300%" ], + other_values: [ "0", "0.3", "-7.3", "-100%", "50%" ], invalid_values: [] }, "image-rendering": { @@ -4380,8 +4380,8 @@ var gCSSProperties = { domProp: "stopOpacity", inherited: false, type: CSS_TYPE_LONGHAND, - initial_values: [ "1", "2.8", "1.000" ], - other_values: [ "0", "0.3", "-7.3" ], + initial_values: [ "1", "2.8", "1.000", "300%" ], + other_values: [ "0", "0.3", "-7.3", "-100%", "50%" ], invalid_values: [] }, "stroke": { @@ -4436,8 +4436,8 @@ var gCSSProperties = { domProp: "strokeOpacity", inherited: true, type: CSS_TYPE_LONGHAND, - initial_values: [ "1", "2.8", "1.000", "context-fill-opacity", "context-stroke-opacity" ], - other_values: [ "0", "0.3", "-7.3" ], + initial_values: [ "1", "2.8", "1.000", "300%", "context-fill-opacity", "context-stroke-opacity" ], + other_values: [ "0", "0.3", "-7.3", "-100%", "50% ], invalid_values: [] }, "stroke-width": { @@ -7892,6 +7892,10 @@ if (IsCSSPropertyPrefEnabled("layout.css.background-clip-text.enabled")) { ); } +if (IsCSSPropertyPrefEnabled("layout.css.display-flow-root.enabled")) { + gCSSProperties["display"].other_values.push("flow-root"); +} + // Copy aliased properties' fields from their alias targets. for (var prop in gCSSProperties) { var entry = gCSSProperties[prop]; diff --git a/layout/style/xbl-marquee/jar.mn b/layout/style/xbl-marquee/jar.mn deleted file mode 100644 index 9247cb4a1..000000000 --- a/layout/style/xbl-marquee/jar.mn +++ /dev/null @@ -1,8 +0,0 @@ -# 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/. - -toolkit.jar: -% content xbl-marquee %content/xbl-marquee/ contentaccessible=yes - content/xbl-marquee/xbl-marquee.xml - content/xbl-marquee/xbl-marquee.css diff --git a/layout/style/xbl-marquee/moz.build b/layout/style/xbl-marquee/moz.build deleted file mode 100644 index eb4454d28..000000000 --- a/layout/style/xbl-marquee/moz.build +++ /dev/null @@ -1,7 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# 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/. - -JAR_MANIFESTS += ['jar.mn']
\ No newline at end of file diff --git a/layout/style/xbl-marquee/xbl-marquee.css b/layout/style/xbl-marquee/xbl-marquee.css deleted file mode 100644 index e6d3ee94b..000000000 --- a/layout/style/xbl-marquee/xbl-marquee.css +++ /dev/null @@ -1,12 +0,0 @@ -/* 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/. */ - -/* PRINT ONLY rules */ -@media print { - - marquee > * > * { - margin: 0 !important; - padding: 0 !important; - } /* This hack is needed until bug 119078 gets fixed */ -} diff --git a/layout/style/xbl-marquee/xbl-marquee.xml b/layout/style/xbl-marquee/xbl-marquee.xml deleted file mode 100644 index bb837624d..000000000 --- a/layout/style/xbl-marquee/xbl-marquee.xml +++ /dev/null @@ -1,733 +0,0 @@ -<?xml version="1.0"?> -<!-- 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/. --> - -<bindings id="marqueeBindings" - xmlns="http://www.mozilla.org/xbl" - xmlns:html="http://www.w3.org/1999/xhtml" - xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" - xmlns:xbl="http://www.mozilla.org/xbl"> - - - <binding id="marquee" bindToUntrustedContent="true"> - - <resources> - <stylesheet src="chrome://xbl-marquee/content/xbl-marquee.css"/> - </resources> - <implementation> - - <property name="scrollAmount" exposeToUntrustedContent="true"> - <getter> - <![CDATA[ - this._mutationActor(this._mutationObserver.takeRecords()); - return this._scrollAmount; - ]]> - </getter> - <setter> - <![CDATA[ - var val = parseInt(val); - if (val < 0) { - return; - } - if (isNaN(val)) { - val = 0; - } - this.setAttribute("scrollamount", val); - ]]> - </setter> - </property> - - <property name="scrollDelay" exposeToUntrustedContent="true"> - <getter> - <![CDATA[ - this._mutationActor(this._mutationObserver.takeRecords()); - var val = parseInt(this.getAttribute("scrolldelay")); - - if (val <= 0 || isNaN(val)) { - return this._scrollDelay; - } - - return val; - ]]> - </getter> - <setter> - var val = parseInt(val); - if (val > 0 ) { - this.setAttribute("scrolldelay", val); - } - </setter> - </property> - - <property name="trueSpeed" exposeToUntrustedContent="true"> - <getter> - <![CDATA[ - if (!this.hasAttribute("truespeed")) { - return false; - } - - return true; - ]]> - </getter> - <setter> - <![CDATA[ - if (val) { - this.setAttribute("truespeed", ""); - } else { - this.removeAttribute('truespeed'); - } - ]]> - </setter> - </property> - - <property name="direction" exposeToUntrustedContent="true"> - <getter> - this._mutationActor(this._mutationObserver.takeRecords()); - return this._direction; - </getter> - <setter> - <![CDATA[ - if (typeof val == 'string') { - val = val.toLowerCase(); - } else { - return; - } - if (val != 'left' && val != 'right' && val != 'up' && val != 'down') { - val = 'left'; - } - - this.setAttribute("direction", val); - ]]> - </setter> - </property> - - <property name="behavior" exposeToUntrustedContent="true"> - <getter> - this._mutationActor(this._mutationObserver.takeRecords()); - return this._behavior; - </getter> - <setter> - if (typeof val == 'string') { - val = val.toLowerCase(); - } - if (val == "alternate" || val == "slide" || val == 'scroll') { - this.setAttribute("behavior", val); - } - </setter> - </property> - - - <property name="loop" exposeToUntrustedContent="true"> - <getter> - <![CDATA[ - this._mutationActor(this._mutationObserver.takeRecords()); - return this._loop; - ]]> - </getter> - <setter> - <![CDATA[ - var val = parseInt(val); - if (val == -1 || val > 0) { - this.setAttribute("loop", val); - } - ]]> - </setter> - </property> - - - <property name="onstart" exposeToUntrustedContent="true"> - <getter> - return this.getAttribute("onstart"); - </getter> - <setter> - this._setEventListener("start", val, true); - this.setAttribute("onstart", val); - </setter> - </property> - - <property name="onfinish" exposeToUntrustedContent="true"> - <getter> - return this.getAttribute("onfinish"); - </getter> - <setter> - this._setEventListener("finish", val, true); - this.setAttribute("onfinish", val); - </setter> - </property> - - <property name="onbounce" exposeToUntrustedContent="true"> - <getter> - return this.getAttribute("onbounce"); - </getter> - <setter> - this._setEventListener("bounce", val, true); - this.setAttribute("onbounce", val); - </setter> - </property> - - <property name="outerDiv" - onget="return document.getAnonymousNodes(this)[0]" - /> - - <property name="innerDiv" - onget="return document.getAnonymousElementByAttribute(this, 'class', 'innerDiv');" - /> - - <property name="height" exposeToUntrustedContent="true" - onget="return this.getAttribute('height');" - onset="this.setAttribute('height', val);" - /> - - <property name="width" exposeToUntrustedContent="true" - onget="return this.getAttribute('width');" - onset="this.setAttribute('width', val);" - /> - - <method name="_set_scrollDelay"> - <parameter name="aValue"/> - <body> - <![CDATA[ - aValue = parseInt(aValue); - if (aValue <= 0) { - return; - } else if (isNaN(aValue)) { - this._scrollDelay = 85; - } else if (aValue < 60) { - if (this.trueSpeed == true) { - this._scrollDelay = aValue; - } else { - this._scrollDelay = 60; - } - } else { - this._scrollDelay = aValue; - } - ]]> - </body> - </method> - - <method name="_set_scrollAmount"> - <parameter name="aValue"/> - <body> - <![CDATA[ - aValue = parseInt(aValue); - if (isNaN(aValue)) { - this._scrollAmount = 6; - } else if (aValue < 0) { - return; - } else { - this._scrollAmount = aValue; - } - ]]> - </body> - </method> - - <method name="_set_behavior"> - <parameter name="aValue"/> - <body> - <![CDATA[ - if (typeof aValue == 'string') { - aValue = aValue.toLowerCase(); - } - if (aValue != 'alternate' && aValue != 'slide' && aValue != 'scroll') { - this._behavior = 'scroll'; - } else { - this._behavior = aValue; - } - ]]> - </body> - </method> - - <method name="_set_direction"> - <parameter name="aValue"/> - <body> - <![CDATA[ - if (typeof aValue == 'string') { - aValue = aValue.toLowerCase(); - } - if (aValue != 'left' && aValue != 'right' && aValue != 'up' && aValue != 'down') { - aValue = 'left'; - } - - if (aValue != this._direction) { - this.startNewDirection = true; - } - this._direction = aValue; - ]]> - </body> - </method> - - <method name="_set_loop"> - <parameter name="aValue"/> - <body> - <![CDATA[ - var aValue = parseInt(aValue); - if (aValue == 0) { - return; - } - if (isNaN(aValue) || aValue <= -1) { - aValue = -1; - } - this._loop = aValue; - ]]> - </body> - </method> - - <method name="_setEventListener"> - <parameter name="aName"/> - <parameter name="aValue"/> - <parameter name="aIgnoreNextCall"/> - <body> - <![CDATA[ - // _setEventListener is only used for setting the attribute event - // handlers, which we want to ignore if our document is sandboxed - // without the allow-scripts keyword. - if (document.hasScriptsBlockedBySandbox) { - return true; - } - - // attribute event handlers should only be added if the - // document's CSP allows it. - if (!document.inlineScriptAllowedByCSP) { - return true; - } - - if (this._ignoreNextCall) { - return this._ignoreNextCall = false; - } - - if (aIgnoreNextCall) { - this._ignoreNextCall = true; - } - - if (typeof this["_on" + aName] == 'function') { - this.removeEventListener(aName, this["_on" + aName], false); - } - - switch (typeof aValue) - { - case "function": - this["_on" + aName] = aValue; - this.addEventListener(aName, this["_on" + aName], false); - break; - - case "string": - if (!aIgnoreNextCall) { - try { - // Function Xrays make this simple and safe. \o/ - this["_on" + aName] = new window.Function("event", aValue); - } - catch(e) { - return false; - } - this.addEventListener(aName, this["_on" + aName], false); - } - else { - this["_on" + aName] = aValue; - } - break; - - case "object": - this["_on" + aName] = aValue; - break; - - default: - this._ignoreNextCall = false; - throw new Error("Invalid argument for Marquee::on" + aName); - } - return true; - ]]> - </body> - </method> - - <method name="_fireEvent"> - <parameter name="aName"/> - <parameter name="aBubbles"/> - <parameter name="aCancelable"/> - <body> - <![CDATA[ - var e = document.createEvent("Events"); - e.initEvent(aName, aBubbles, aCancelable); - this.dispatchEvent(e); - ]]> - </body> - </method> - - <method name="start" exposeToUntrustedContent="true"> - <body> - <![CDATA[ - if (this.runId == 0) { - var myThis = this; - var lambda = function myTimeOutFunction(){myThis._doMove(false);} - this.runId = window.setTimeout(lambda, this._scrollDelay - this._deltaStartStop); - this._deltaStartStop = 0; - } - ]]> - </body> - </method> - - <method name="stop" exposeToUntrustedContent="true"> - <body> - <![CDATA[ - if (this.runId != 0) { - this._deltaStartStop = Date.now()- this._lastMoveDate; - clearTimeout(this.runId); - } - - this.runId = 0; - ]]> - </body> - </method> - - <method name="_doMove"> - <parameter name="aResetPosition"/> - <body> - <![CDATA[ - this._lastMoveDate = Date.now(); - - //startNewDirection is true at first load and whenever the direction is changed - if (this.startNewDirection) { - this.startNewDirection = false; //we only want this to run once every scroll direction change - - var corrvalue = 0; - - switch (this._direction) - { - case "up": - var height = document.defaultView.getComputedStyle(this, "").height; - this.outerDiv.style.height = height; - if (this.originalHeight > this.outerDiv.offsetHeight) { - corrvalue = this.originalHeight - this.outerDiv.offsetHeight; - } - this.innerDiv.style.padding = height + " 0"; - this.dirsign = 1; - this.startAt = (this._behavior == 'alternate') ? (this.originalHeight - corrvalue) : 0; - this.stopAt = (this._behavior == 'alternate' || this._behavior == 'slide') ? - (parseInt(height) + corrvalue) : (this.originalHeight + parseInt(height)); - break; - - case "down": - var height = document.defaultView.getComputedStyle(this, "").height; - this.outerDiv.style.height = height; - if (this.originalHeight > this.outerDiv.offsetHeight) { - corrvalue = this.originalHeight - this.outerDiv.offsetHeight; - } - this.innerDiv.style.padding = height + " 0"; - this.dirsign = -1; - this.startAt = (this._behavior == 'alternate') ? - (parseInt(height) + corrvalue) : (this.originalHeight + parseInt(height)); - this.stopAt = (this._behavior == 'alternate' || this._behavior == 'slide') ? - (this.originalHeight - corrvalue) : 0; - break; - - case "right": - if (this.innerDiv.offsetWidth > this.outerDiv.offsetWidth) { - corrvalue = this.innerDiv.offsetWidth - this.outerDiv.offsetWidth; - } - this.dirsign = -1; - this.stopAt = (this._behavior == 'alternate' || this._behavior == 'slide') ? - (this.innerDiv.offsetWidth - corrvalue) : 0; - this.startAt = this.outerDiv.offsetWidth + ((this._behavior == 'alternate') ? - corrvalue : (this.innerDiv.offsetWidth + this.stopAt)); - break; - - case "left": - default: - if (this.innerDiv.offsetWidth > this.outerDiv.offsetWidth) { - corrvalue = this.innerDiv.offsetWidth - this.outerDiv.offsetWidth; - } - this.dirsign = 1; - this.startAt = (this._behavior == 'alternate') ? (this.innerDiv.offsetWidth - corrvalue) : 0; - this.stopAt = this.outerDiv.offsetWidth + - ((this._behavior == 'alternate' || this._behavior == 'slide') ? - corrvalue : (this.innerDiv.offsetWidth + this.startAt)); - } - - if (aResetPosition) { - this.newPosition = this.startAt; - this._fireEvent("start", false, false); - } - } //end if - - this.newPosition = this.newPosition + (this.dirsign * this._scrollAmount); - - if ((this.dirsign == 1 && this.newPosition > this.stopAt) || - (this.dirsign == -1 && this.newPosition < this.stopAt)) - { - switch (this._behavior) - { - case 'alternate': - // lets start afresh - this.startNewDirection = true; - - // swap direction - const swap = {left: "right", down: "up", up: "down", right: "left"}; - this._direction = swap[this._direction]; - this.newPosition = this.stopAt; - - if ((this._direction == "up") || (this._direction == "down")) { - this.outerDiv.scrollTop = this.newPosition; - } else { - this.outerDiv.scrollLeft = this.newPosition; - } - - if (this._loop != 1) { - this._fireEvent("bounce", false, true); - } - break; - - case 'slide': - if (this._loop > 1) { - this.newPosition = this.startAt; - } - break; - - default: - this.newPosition = this.startAt; - - if ((this._direction == "up") || (this._direction == "down")) { - this.outerDiv.scrollTop = this.newPosition; - } else { - this.outerDiv.scrollLeft = this.newPosition; - } - - //dispatch start event, even when this._loop == 1, comp. with IE6 - this._fireEvent("start", false, false); - } - - if (this._loop > 1) { - this._loop--; - } else if (this._loop == 1) { - if ((this._direction == "up") || (this._direction == "down")) { - this.outerDiv.scrollTop = this.stopAt; - } else { - this.outerDiv.scrollLeft = this.stopAt; - } - this.stop(); - this._fireEvent("finish", false, true); - return; - } - } - else { - if ((this._direction == "up") || (this._direction == "down")) { - this.outerDiv.scrollTop = this.newPosition; - } else { - this.outerDiv.scrollLeft = this.newPosition; - } - } - - var myThis = this; - var lambda = function myTimeOutFunction(){myThis._doMove(false);} - this.runId = window.setTimeout(lambda, this._scrollDelay); - ]]> - </body> - </method> - - <method name="init"> - <body> - <![CDATA[ - this.stop(); - - if ((this._direction != "up") && (this._direction != "down")) { - var width = window.getComputedStyle(this, "").width; - this.innerDiv.parentNode.style.margin = '0 ' + width; - - //XXX Adding the margin sometimes causes the marquee to widen, - // see testcase from bug bug 364434: - // https://bugzilla.mozilla.org/attachment.cgi?id=249233 - // Just add a fixed width with current marquee's width for now - if (width != window.getComputedStyle(this, "").width) { - var width = window.getComputedStyle(this, "").width; - this.outerDiv.style.width = width; - this.innerDiv.parentNode.style.margin = '0 ' + width; - } - } - else { - // store the original height before we add padding - this.innerDiv.style.padding = 0; - this.originalHeight = this.innerDiv.offsetHeight; - } - - this._doMove(true); - ]]> - </body> - </method> - - <method name="_mutationActor"> - <parameter name="aMutations"/> - <body> - <![CDATA[ - while (aMutations.length > 0) { - var mutation = aMutations.shift(); - var attrName = mutation.attributeName.toLowerCase(); - var oldValue = mutation.oldValue; - var target = mutation.target; - var newValue = target.getAttribute(attrName); - - if (oldValue != newValue) { - switch (attrName) { - case "loop": - target._set_loop(newValue); - if (target.rundId == 0) { - target.start(); - } - break; - case "scrollamount": - target._set_scrollAmount(newValue); - break; - case "scrolldelay": - target._set_scrollDelay(newValue); - target.stop(); - target.start(); - break; - case "truespeed": - //needed to update target._scrollDelay - var myThis = target; - var lambda = function() {myThis._set_scrollDelay(myThis.getAttribute('scrolldelay'));} - window.setTimeout(lambda, 0); - break; - case "behavior": - target._set_behavior(newValue); - target.startNewDirection = true; - if ((oldValue == "slide" && target.newPosition == target.stopAt) || - newValue == "alternate" || newValue == "slide") { - target.stop(); - target._doMove(true); - } - break; - case "direction": - if (!newValue) { - newValue = "left"; - } - target._set_direction(newValue); - break; - case "width": - case "height": - target.startNewDirection = true; - break; - case "onstart": - target._setEventListener("start", newValue); - break; - case "onfinish": - target._setEventListener("finish", newValue); - break; - case "onbounce": - target._setEventListener("bounce", newValue); - break; - } - } - } - ]]> - </body> - </method> - - <constructor> - <![CDATA[ - // Set up state. - this._scrollAmount = 6; - this._scrollDelay = 85; - this._direction = "left"; - this._behavior = "scroll"; - this._loop = -1; - this.dirsign = 1; - this.startAt = 0; - this.stopAt = 0; - this.newPosition = 0; - this.runId = 0; - this.originalHeight = 0; - this.startNewDirection = true; - - // hack needed to fix js error, see bug 386470 - var myThis = this; - var lambda = function myScopeFunction() { if (myThis.init) myThis.init(); } - - this._set_direction(this.getAttribute('direction')); - this._set_behavior(this.getAttribute('behavior')); - this._set_scrollDelay(this.getAttribute('scrolldelay')); - this._set_scrollAmount(this.getAttribute('scrollamount')); - this._set_loop(this.getAttribute('loop')); - this._setEventListener("start", this.getAttribute("onstart")); - this._setEventListener("finish", this.getAttribute("onfinish")); - this._setEventListener("bounce", this.getAttribute("onbounce")); - this.startNewDirection = true; - - this._mutationObserver = new MutationObserver(this._mutationActor); - this._mutationObserver.observe(this, { attributes: true, - attributeOldValue: true, - attributeFilter: ['loop', 'scrollamount', 'scrolldelay', '', 'truespeed', 'behavior', - 'direction', 'width', 'height', 'onstart', 'onfinish', 'onbounce'] }); - - // init needs to be run after the page has loaded in order to calculate - // the correct height/width - if (document.readyState == "complete") { - lambda(); - } else { - window.addEventListener("load", lambda, false); - } - ]]> - </constructor> - </implementation> - - </binding> - - <binding id="marquee-horizontal" bindToUntrustedContent="true" - extends="chrome://xbl-marquee/content/xbl-marquee.xml#marquee" - inheritstyle="false"> - - <!-- White-space isn't allowed because a marquee could be - inside 'white-space: pre' --> - <content> - <html:div style="display: -moz-box; overflow: hidden; width: -moz-available;" - ><html:div style="display: -moz-box;" - ><html:div class="innerDiv" style="display: table; border-spacing: 0;" - ><html:div - ><children - /></html:div - ></html:div - ></html:div - ></html:div> - </content> - - </binding> - - <binding id="marquee-vertical" bindToUntrustedContent="true" - extends="chrome://xbl-marquee/content/xbl-marquee.xml#marquee" - inheritstyle="false"> - - <!-- White-space isn't allowed because a marquee could be - inside 'white-space: pre' --> - <content> - <html:div style="overflow: hidden; width: -moz-available;" - ><html:div class="innerDiv" - ><children - /></html:div - ></html:div> - </content> - - </binding> - - <binding id="marquee-horizontal-editable" bindToUntrustedContent="true" - inheritstyle="false"> - - <!-- White-space isn't allowed because a marquee could be - inside 'white-space: pre' --> - <content> - <html:div style="display: inline-block; overflow: auto; width: -moz-available;" - ><children - /></html:div> - </content> - - </binding> - - <binding id="marquee-vertical-editable" bindToUntrustedContent="true" - inheritstyle="false"> - - <!-- White-space isn't allowed because a marquee could be - inside 'white-space: pre' --> - <content> - <html:div style="overflow: auto; height: inherit; width: -moz-available;" - ><children/></html:div> - </content> - - </binding> - -</bindings> diff --git a/layout/svg/nsCSSClipPathInstance.cpp b/layout/svg/nsCSSClipPathInstance.cpp index 01f7de248..e923eaa0e 100644 --- a/layout/svg/nsCSSClipPathInstance.cpp +++ b/layout/svg/nsCSSClipPathInstance.cpp @@ -59,7 +59,7 @@ nsCSSClipPathInstance::HitTestBasicShapeClip(nsIFrame* aFrame, RefPtr<Path> path = instance.CreateClipPath(drawTarget); float pixelRatio = float(nsPresContext::AppUnitsPerCSSPixel()) / aFrame->PresContext()->AppUnitsPerDevPixel(); - return path->ContainsPoint(ToPoint(aPoint) * pixelRatio, Matrix()); + return path ? path->ContainsPoint(ToPoint(aPoint) * pixelRatio, Matrix()) : false; } already_AddRefed<Path> diff --git a/layout/xul/nsXULLabelFrame.cpp b/layout/xul/nsXULLabelFrame.cpp index 22b875461..41e7e4d76 100644 --- a/layout/xul/nsXULLabelFrame.cpp +++ b/layout/xul/nsXULLabelFrame.cpp @@ -16,9 +16,7 @@ nsIFrame* NS_NewXULLabelFrame(nsIPresShell* aPresShell, nsStyleContext* aContext) { nsXULLabelFrame* it = new (aPresShell) nsXULLabelFrame(aContext); - - it->AddStateBits(NS_BLOCK_FLOAT_MGR | NS_BLOCK_MARGIN_ROOT); - + it->AddStateBits(NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS); return it; } |