mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-08 08:48:39 +09:00
Merge remote-tracking branch 'origin/master' into custom
This commit is contained in:
commit
7b55eb7b95
27 changed files with 208 additions and 31 deletions
|
|
@ -29,7 +29,7 @@ function* testTopLeft(inspector, view) {
|
|||
elementRulesNb: 4,
|
||||
firstLineRulesNb: 2,
|
||||
firstLetterRulesNb: 1,
|
||||
selectionRulesNb: 0,
|
||||
selectionRulesNb: 1,
|
||||
afterRulesNb: 1,
|
||||
beforeRulesNb: 2
|
||||
}
|
||||
|
|
@ -166,7 +166,7 @@ function* testParagraph(inspector, view) {
|
|||
elementRulesNb: 3,
|
||||
firstLineRulesNb: 1,
|
||||
firstLetterRulesNb: 1,
|
||||
selectionRulesNb: 1,
|
||||
selectionRulesNb: 2,
|
||||
beforeRulesNb: 0,
|
||||
afterRulesNb: 0
|
||||
});
|
||||
|
|
@ -216,7 +216,7 @@ function* assertPseudoElementRulesNumbers(selector, inspector, view, ruleNbs) {
|
|||
firstLetterRules: elementStyle.rules.filter(rule =>
|
||||
rule.pseudoElement === ":first-letter"),
|
||||
selectionRules: elementStyle.rules.filter(rule =>
|
||||
rule.pseudoElement === ":-moz-selection"),
|
||||
rule.pseudoElement === ":selection"),
|
||||
beforeRules: elementStyle.rules.filter(rule =>
|
||||
rule.pseudoElement === ":before"),
|
||||
afterRules: elementStyle.rules.filter(rule =>
|
||||
|
|
|
|||
|
|
@ -2872,6 +2872,7 @@ exports.CSS_PROPERTIES = {
|
|||
"box-shadow",
|
||||
"box-sizing",
|
||||
"caption-side",
|
||||
"caret-color",
|
||||
"clear",
|
||||
"clip",
|
||||
"clip-path",
|
||||
|
|
@ -5277,6 +5278,28 @@ exports.CSS_PROPERTIES = {
|
|||
"unset"
|
||||
]
|
||||
},
|
||||
"caret-color": {
|
||||
"isInherited": true,
|
||||
"subproperties": [
|
||||
"caret-color"
|
||||
],
|
||||
"supports": [
|
||||
2
|
||||
],
|
||||
"values": [
|
||||
"COLOR",
|
||||
"auto",
|
||||
"currentColor",
|
||||
"hsl",
|
||||
"hsla",
|
||||
"inherit",
|
||||
"initial",
|
||||
"rgb",
|
||||
"rgba",
|
||||
"transparent",
|
||||
"unset"
|
||||
]
|
||||
},
|
||||
"clear": {
|
||||
"isInherited": false,
|
||||
"subproperties": [
|
||||
|
|
@ -9375,6 +9398,7 @@ exports.PSEUDO_ELEMENTS = [
|
|||
":backdrop",
|
||||
":first-letter",
|
||||
":first-line",
|
||||
":selection",
|
||||
":-moz-selection",
|
||||
":-moz-focus-inner",
|
||||
":-moz-focus-outer",
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ namespace dom {
|
|||
void
|
||||
ResizeObserverNotificationHelper::WillRefresh(TimeStamp aTime)
|
||||
{
|
||||
MOZ_ASSERT(mOwner, "Why is mOwner already dead when this RefreshObserver is still registered?");
|
||||
MOZ_DIAGNOSTIC_ASSERT(mOwner, "RefreshObserver should have been de-registered on time, but isn't.");
|
||||
if (mOwner) {
|
||||
mOwner->Notify();
|
||||
}
|
||||
|
|
@ -69,10 +69,8 @@ ResizeObserverNotificationHelper::Unregister()
|
|||
}
|
||||
|
||||
nsRefreshDriver* refreshDriver = GetRefreshDriver();
|
||||
if (!refreshDriver) {
|
||||
// We can't access RefreshDriver now. Just abort the Unregister().
|
||||
return;
|
||||
}
|
||||
MOZ_RELEASE_ASSERT(refreshDriver,
|
||||
"We should not leave a dangling reference to the observer around");
|
||||
|
||||
refreshDriver->RemoveRefreshObserver(this, Flush_Display);
|
||||
mRegistered = false;
|
||||
|
|
@ -81,9 +79,8 @@ ResizeObserverNotificationHelper::Unregister()
|
|||
void
|
||||
ResizeObserverNotificationHelper::Disconnect()
|
||||
{
|
||||
Unregister();
|
||||
// Our owner is dying. Clear our pointer to it, in case we outlive it.
|
||||
mOwner = nullptr;
|
||||
MOZ_RELEASE_ASSERT(!mRegistered, "How can we die when registered?");
|
||||
MOZ_RELEASE_ASSERT(!mOwner, "Forgot to clear weak pointer?");
|
||||
}
|
||||
|
||||
ResizeObserverNotificationHelper::~ResizeObserverNotificationHelper()
|
||||
|
|
@ -111,6 +108,10 @@ ResizeObserverController::AddResizeObserver(ResizeObserver* aObserver)
|
|||
mResizeObservers.AppendElement(aObserver);
|
||||
}
|
||||
|
||||
void ResizeObserverController::DetachFromDocument() {
|
||||
mResizeObserverNotificationHelper->Unregister();
|
||||
}
|
||||
|
||||
void
|
||||
ResizeObserverController::Notify()
|
||||
{
|
||||
|
|
@ -240,7 +241,10 @@ ResizeObserverController::GetShell() const
|
|||
|
||||
ResizeObserverController::~ResizeObserverController()
|
||||
{
|
||||
mResizeObserverNotificationHelper->Disconnect();
|
||||
MOZ_RELEASE_ASSERT(
|
||||
!mResizeObserverNotificationHelper->IsRegistered(),
|
||||
"Nothing else should keep a reference to our notification helper when we go away");
|
||||
mResizeObserverNotificationHelper->DetachFromOwner();
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
|
|
|
|||
|
|
@ -41,6 +41,10 @@ public:
|
|||
|
||||
void Disconnect();
|
||||
|
||||
bool IsRegistered() const { return mRegistered; }
|
||||
|
||||
void DetachFromOwner() { mOwner = nullptr; }
|
||||
|
||||
protected:
|
||||
virtual ~ResizeObserverNotificationHelper();
|
||||
|
||||
|
|
@ -68,6 +72,7 @@ public:
|
|||
void Traverse(nsCycleCollectionTraversalCallback& aCb);
|
||||
void Unlink();
|
||||
|
||||
void DetachFromDocument();
|
||||
void AddResizeObserver(ResizeObserver* aObserver);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -3644,6 +3644,12 @@ nsDocument::DeleteShell()
|
|||
// objects for @font-face rules that came from the style set.
|
||||
RebuildUserFontSet();
|
||||
|
||||
if (mResizeObserverController) {
|
||||
// If the shell is going away, we need to remove any links to this document
|
||||
// from the observer.
|
||||
mResizeObserverController->DetachFromDocument();
|
||||
}
|
||||
|
||||
nsIPresShell* oldShell = mPresShell;
|
||||
mPresShell = nullptr;
|
||||
UpdateFrameRequestCallbackSchedulingState(oldShell);
|
||||
|
|
|
|||
|
|
@ -932,8 +932,12 @@ nsImageLoadingContent::LoadImage(nsIURI* aNewURI,
|
|||
MOZ_ASSERT(!req, "Shouldn't have non-null request here");
|
||||
// If we don't have a current URI, we might as well store this URI so people
|
||||
// know what we tried (and failed) to load.
|
||||
if (!mCurrentRequest)
|
||||
if (!mCurrentRequest) {
|
||||
mCurrentURI = aNewURI;
|
||||
if (mImageBlockingStatus == nsIContentPolicy::ACCEPT) {
|
||||
mImageBlockingStatus = nsIContentPolicy::REJECT_REQUEST;
|
||||
}
|
||||
}
|
||||
|
||||
FireEvent(NS_LITERAL_STRING("error"));
|
||||
FireEvent(NS_LITERAL_STRING("loadend"));
|
||||
|
|
|
|||
|
|
@ -708,10 +708,12 @@ FetchDriver::OnDataAvailable(nsIRequest* aRequest,
|
|||
// about races.
|
||||
|
||||
if (mObserver) {
|
||||
// Need to keep mObserver alive.
|
||||
RefPtr<FetchDriverObserver> observer = mObserver;
|
||||
if (NS_IsMainThread()) {
|
||||
mObserver->OnDataAvailable();
|
||||
observer->OnDataAvailable();
|
||||
} else {
|
||||
RefPtr<Runnable> runnable = new DataAvailableRunnable(mObserver);
|
||||
RefPtr<Runnable> runnable = new DataAvailableRunnable(observer);
|
||||
nsresult rv = NS_DispatchToMainThread(runnable);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
|
|
@ -719,12 +721,15 @@ FetchDriver::OnDataAvailable(nsIRequest* aRequest,
|
|||
}
|
||||
}
|
||||
|
||||
uint32_t aRead;
|
||||
// Explicitly initialized to 0 because in some cases nsStringInputStream may
|
||||
// not write to aRead.
|
||||
uint32_t aRead = 0;
|
||||
MOZ_ASSERT(mResponse);
|
||||
MOZ_ASSERT(mPipeOutputStream);
|
||||
|
||||
// From "Main Fetch" step 17: SRI-part2.
|
||||
if (mResponse->Type() != ResponseType::Error &&
|
||||
if (mResponse &&
|
||||
mResponse->Type() != ResponseType::Error &&
|
||||
!mRequest->GetIntegrity().IsEmpty()) {
|
||||
MOZ_ASSERT(mSRIDataVerifier);
|
||||
|
||||
|
|
@ -766,6 +771,17 @@ FetchDriver::OnDataAvailable(nsIRequest* aRequest,
|
|||
nsresult rv = aInputStream->ReadSegments(NS_CopySegmentToStream,
|
||||
mPipeOutputStream,
|
||||
aCount, &aRead);
|
||||
|
||||
// If no data was read, it's possible the output stream is closed but the
|
||||
// ReadSegments call followed its contract of returning NS_OK despite write
|
||||
// errors. Unfortunately, nsIOutputStream has an ill-conceived contract when
|
||||
// taken together with ReadSegments' contract, because the pipe will just
|
||||
// NS_OK if we try and invoke its Write* functions ourselves with a 0 count.
|
||||
// So we must just assume the pipe is broken.
|
||||
if (aRead == 0 && aCount != 0) {
|
||||
return NS_BASE_STREAM_CLOSED;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -194,6 +194,7 @@ nsSMILCSSProperty::IsPropertyAnimatable(nsCSSPropertyID aPropID)
|
|||
// writing-mode
|
||||
|
||||
switch (aPropID) {
|
||||
case eCSSProperty_caret_color:
|
||||
case eCSSProperty_clip:
|
||||
case eCSSProperty_clip_rule:
|
||||
case eCSSProperty_clip_path:
|
||||
|
|
|
|||
|
|
@ -1831,8 +1831,7 @@ nsIFrame::DisplayCaret(nsDisplayListBuilder* aBuilder,
|
|||
nscolor
|
||||
nsIFrame::GetCaretColorAt(int32_t aOffset)
|
||||
{
|
||||
// Use text color.
|
||||
return StyleColor()->mColor;
|
||||
return nsLayoutUtils::GetColor(this, eCSSProperty_caret_color);
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
|||
|
|
@ -3947,11 +3947,18 @@ nsTextPaintStyle::InitSelectionColorsAndShadow()
|
|||
if (selectionElement &&
|
||||
selectionStatus == nsISelectionController::SELECTION_ON) {
|
||||
RefPtr<nsStyleContext> sc = nullptr;
|
||||
// Probe for both selection and -moz-selection
|
||||
sc = mPresContext->StyleSet()->
|
||||
ProbePseudoElementStyle(selectionElement,
|
||||
CSSPseudoElementType::mozSelection,
|
||||
CSSPseudoElementType::selection,
|
||||
mFrame->StyleContext());
|
||||
// Use -moz-selection pseudo class.
|
||||
if (!sc) {
|
||||
sc = mPresContext->StyleSet()->
|
||||
ProbePseudoElementStyle(selectionElement,
|
||||
CSSPseudoElementType::mozSelection,
|
||||
mFrame->StyleContext());
|
||||
}
|
||||
// Use selection pseudo class.
|
||||
if (sc) {
|
||||
mSelectionBGColor =
|
||||
sc->GetVisitedDependentColor(eCSSProperty_background_color);
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
":first-letter",
|
||||
":first-line",
|
||||
":placeholder",
|
||||
":selection",
|
||||
":-moz-color-swatch",
|
||||
":-moz-focus-inner",
|
||||
":-moz-focus-outer",
|
||||
|
|
|
|||
|
|
@ -126,3 +126,5 @@ fuzzy(1,1) == image-orientation-background.html?90&flip image-orientation-r
|
|||
|
||||
== image-resize-percent-height.html image-resize-ref.html
|
||||
== image-resize-percent-width.html image-resize-ref.html
|
||||
|
||||
== unknown-protocol.html unknown-protocol-ref.html
|
||||
|
|
|
|||
1
layout/reftests/image/unknown-protocol-ref.html
Normal file
1
layout/reftests/image/unknown-protocol-ref.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
<img src="mailto://foo">
|
||||
1
layout/reftests/image/unknown-protocol.html
Normal file
1
layout/reftests/image/unknown-protocol.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
<img src="foobar://baz">
|
||||
|
|
@ -4468,8 +4468,12 @@ StyleAnimationValue::ExtractComputedValue(nsCSSPropertyID aProperty,
|
|||
StyleDataAtOffset<nscolor>(styleStruct, ssOffset));
|
||||
return true;
|
||||
case eStyleAnimType_ComplexColor: {
|
||||
aComputedValue.SetComplexColorValue(
|
||||
StyleDataAtOffset<StyleComplexColor>(styleStruct, ssOffset));
|
||||
auto& color = StyleDataAtOffset<StyleComplexColor>(styleStruct, ssOffset);
|
||||
if (color.mIsAuto) {
|
||||
aComputedValue.SetAutoValue();
|
||||
} else {
|
||||
aComputedValue.SetComplexColorValue(color);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case eStyleAnimType_PaintServer: {
|
||||
|
|
@ -4782,7 +4786,9 @@ StyleAnimationValue::SetCurrentColorValue()
|
|||
void
|
||||
StyleAnimationValue::SetComplexColorValue(const StyleComplexColor& aColor)
|
||||
{
|
||||
if (aColor.IsCurrentColor()) {
|
||||
if (aColor.mIsAuto) {
|
||||
SetAutoValue();
|
||||
} else if (aColor.IsCurrentColor()) {
|
||||
SetCurrentColorValue();
|
||||
} else if (aColor.IsNumericColor()) {
|
||||
SetColorValue(aColor.mColor);
|
||||
|
|
|
|||
|
|
@ -23,16 +23,29 @@ struct StyleComplexColor
|
|||
{
|
||||
nscolor mColor;
|
||||
uint8_t mForegroundRatio;
|
||||
// Whether the complex color represents a computed-value time auto
|
||||
// value. This is only a flag indicating that this value should not
|
||||
// be interpolatable with other colors, while other fields still
|
||||
// represents the actual used color of this value.
|
||||
bool mIsAuto;
|
||||
|
||||
static StyleComplexColor FromColor(nscolor aColor) { return {aColor, 0}; }
|
||||
static StyleComplexColor CurrentColor() { return {NS_RGBA(0, 0, 0, 0), 255}; }
|
||||
static StyleComplexColor FromColor(nscolor aColor) {
|
||||
return {aColor, 0, false};
|
||||
}
|
||||
static StyleComplexColor CurrentColor() {
|
||||
return {NS_RGBA(0, 0, 0, 0), 255, false};
|
||||
}
|
||||
static StyleComplexColor Auto() {
|
||||
return {NS_RGBA(0, 0, 0, 0), 255, true};
|
||||
}
|
||||
|
||||
bool IsNumericColor() const { return mForegroundRatio == 0; }
|
||||
bool IsCurrentColor() const { return mForegroundRatio == 255; }
|
||||
|
||||
bool operator==(const StyleComplexColor& aOther) const {
|
||||
return mForegroundRatio == aOther.mForegroundRatio &&
|
||||
(IsCurrentColor() || mColor == aOther.mColor);
|
||||
(IsCurrentColor() || mColor == aOther.mColor) &&
|
||||
mIsAuto == aOther.mIsAuto;
|
||||
}
|
||||
bool operator!=(const StyleComplexColor& aOther) const {
|
||||
return !(*this == aOther);
|
||||
|
|
|
|||
|
|
@ -1394,6 +1394,17 @@ CSS_PROP_TABLEBORDER(
|
|||
kCaptionSideKTable,
|
||||
CSS_PROP_NO_OFFSET,
|
||||
eStyleAnimType_Discrete)
|
||||
CSS_PROP_USERINTERFACE(
|
||||
caret-color,
|
||||
caret_color,
|
||||
CaretColor,
|
||||
CSS_PROPERTY_PARSE_VALUE |
|
||||
CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
|
||||
"",
|
||||
VARIANT_AUTO | VARIANT_HC,
|
||||
nullptr,
|
||||
offsetof(nsStyleUserInterface, mCaretColor),
|
||||
eStyleAnimType_ComplexColor)
|
||||
CSS_PROP_DISPLAY(
|
||||
clear,
|
||||
clear,
|
||||
|
|
|
|||
|
|
@ -37,6 +37,9 @@ CSS_PSEUDO_ELEMENT(firstLine, ":first-line",
|
|||
CSS_PSEUDO_ELEMENT_IS_CSS2 |
|
||||
CSS_PSEUDO_ELEMENT_CONTAINS_ELEMENTS)
|
||||
|
||||
CSS_PSEUDO_ELEMENT(selection, ":selection",
|
||||
CSS_PSEUDO_ELEMENT_CONTAINS_ELEMENTS)
|
||||
// Keep the prefixed version for now.
|
||||
CSS_PSEUDO_ELEMENT(mozSelection, ":-moz-selection",
|
||||
CSS_PSEUDO_ELEMENT_CONTAINS_ELEMENTS)
|
||||
|
||||
|
|
|
|||
|
|
@ -4187,6 +4187,14 @@ nsComputedDOMStyle::DoGetUnicodeBidi()
|
|||
return val.forget();
|
||||
}
|
||||
|
||||
already_AddRefed<CSSValue>
|
||||
nsComputedDOMStyle::DoGetCaretColor()
|
||||
{
|
||||
RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
|
||||
SetValueFromComplexColor(val, StyleUserInterface()->mCaretColor);
|
||||
return val.forget();
|
||||
}
|
||||
|
||||
already_AddRefed<CSSValue>
|
||||
nsComputedDOMStyle::DoGetCursor()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -488,6 +488,7 @@ private:
|
|||
already_AddRefed<CSSValue> DoGetShapeOutside();
|
||||
|
||||
/* User interface properties */
|
||||
already_AddRefed<CSSValue> DoGetCaretColor();
|
||||
already_AddRefed<CSSValue> DoGetCursor();
|
||||
already_AddRefed<CSSValue> DoGetForceBrokenImageIcon();
|
||||
already_AddRefed<CSSValue> DoGetIMEMode();
|
||||
|
|
|
|||
|
|
@ -101,6 +101,7 @@ COMPUTED_STYLE_PROP(box_decoration_break, BoxDecorationBreak)
|
|||
COMPUTED_STYLE_PROP(box_shadow, BoxShadow)
|
||||
COMPUTED_STYLE_PROP(box_sizing, BoxSizing)
|
||||
COMPUTED_STYLE_PROP(caption_side, CaptionSide)
|
||||
COMPUTED_STYLE_PROP(caret_color, CaretColor)
|
||||
COMPUTED_STYLE_PROP(clear, Clear)
|
||||
COMPUTED_STYLE_PROP(clip, Clip)
|
||||
COMPUTED_STYLE_PROP(color, Color)
|
||||
|
|
|
|||
|
|
@ -1151,13 +1151,16 @@ SetComplexColor(const nsCSSValue& aValue,
|
|||
aResult = StyleComplexColor::CurrentColor();
|
||||
} else if (unit == eCSSUnit_ComplexColor) {
|
||||
aResult = aValue.GetStyleComplexColorValue();
|
||||
} else if (unit == eCSSUnit_Auto) {
|
||||
aResult = StyleComplexColor::Auto();
|
||||
} else {
|
||||
nscolor resultColor;
|
||||
if (!SetColor(aValue, aParentColor.mColor, aPresContext,
|
||||
nullptr, aResult.mColor, aConditions)) {
|
||||
nullptr, resultColor, aConditions)) {
|
||||
MOZ_ASSERT_UNREACHABLE("Unknown color value");
|
||||
return;
|
||||
}
|
||||
aResult.mForegroundRatio = 0;
|
||||
aResult = StyleComplexColor::FromColor(resultColor);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5138,6 +5141,13 @@ nsRuleNode::ComputeUserInterfaceData(void* aStartStruct,
|
|||
{
|
||||
COMPUTE_START_INHERITED(UserInterface, ui, parentUI)
|
||||
|
||||
auto setComplexColor = [&](const nsCSSValue* aValue,
|
||||
StyleComplexColor nsStyleUserInterface::* aField) {
|
||||
SetComplexColor<eUnsetInherit>(*aValue, parentUI->*aField,
|
||||
StyleComplexColor::Auto(),
|
||||
mPresContext, ui->*aField, conditions);
|
||||
};
|
||||
|
||||
// cursor: enum, url, inherit
|
||||
const nsCSSValue* cursorValue = aRuleData->ValueForCursor();
|
||||
nsCSSUnit cursorUnit = cursorValue->GetUnit();
|
||||
|
|
@ -5209,6 +5219,10 @@ nsRuleNode::ComputeUserInterfaceData(void* aStartStruct,
|
|||
parentUI->mPointerEvents,
|
||||
NS_STYLE_POINTER_EVENTS_AUTO);
|
||||
|
||||
// caret-color: auto, color, inherit
|
||||
setComplexColor(aRuleData->ValueForCaretColor(),
|
||||
&nsStyleUserInterface::mCaretColor);
|
||||
|
||||
COMPUTE_END_INHERITED(UserInterface, ui)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1255,6 +1255,17 @@ nsStyleContext::CalcStyleDifferenceInternal(StyleContextLike* aNewContext,
|
|||
}
|
||||
}
|
||||
|
||||
// NB: Calling Peek on |this|, not |thisVis| (see above).
|
||||
if (!change && PeekStyleUserInterface()) {
|
||||
const nsStyleUserInterface *thisVisUserInterface = thisVis->StyleUserInterface();
|
||||
const nsStyleUserInterface *otherVisUserInterface = otherVis->StyleUserInterface();
|
||||
if (thisVisUserInterface->mCaretColor !=
|
||||
otherVisUserInterface->mCaretColor) {
|
||||
change = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (change) {
|
||||
hint |= nsChangeHint_RepaintFrame;
|
||||
}
|
||||
|
|
@ -1487,6 +1498,9 @@ ExtractColor(nsCSSPropertyID aProperty,
|
|||
case StyleAnimationValue::eUnit_ComplexColor:
|
||||
return Some(aStyleContext->StyleColor()->
|
||||
CalcComplexColor(val.GetStyleComplexColorValue()));
|
||||
case StyleAnimationValue::eUnit_Auto:
|
||||
return Some(aStyleContext->StyleColor()->
|
||||
CalcComplexColor(StyleComplexColor::Auto()));
|
||||
default:
|
||||
return Nothing();
|
||||
}
|
||||
|
|
@ -1508,7 +1522,8 @@ static const ColorIndexSet gVisitedIndices[2] = { { 0, 0 }, { 1, 0 } };
|
|||
nscolor
|
||||
nsStyleContext::GetVisitedDependentColor(nsCSSPropertyID aProperty)
|
||||
{
|
||||
NS_ASSERTION(aProperty == eCSSProperty_color ||
|
||||
NS_ASSERTION(aProperty == eCSSProperty_caret_color ||
|
||||
aProperty == eCSSProperty_color ||
|
||||
aProperty == eCSSProperty_background_color ||
|
||||
aProperty == eCSSProperty_border_top_color ||
|
||||
aProperty == eCSSProperty_border_right_color ||
|
||||
|
|
|
|||
|
|
@ -4023,6 +4023,7 @@ nsStyleUserInterface::nsStyleUserInterface(StyleStructContext aContext)
|
|||
, mUserFocus(StyleUserFocus::None)
|
||||
, mPointerEvents(NS_STYLE_POINTER_EVENTS_AUTO)
|
||||
, mCursor(NS_STYLE_CURSOR_AUTO)
|
||||
, mCaretColor(StyleComplexColor::Auto())
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsStyleUserInterface);
|
||||
}
|
||||
|
|
@ -4034,6 +4035,7 @@ nsStyleUserInterface::nsStyleUserInterface(const nsStyleUserInterface& aSource)
|
|||
, mPointerEvents(aSource.mPointerEvents)
|
||||
, mCursor(aSource.mCursor)
|
||||
, mCursorImages(aSource.mCursorImages)
|
||||
, mCaretColor(aSource.mCaretColor)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsStyleUserInterface);
|
||||
}
|
||||
|
|
@ -4082,6 +4084,10 @@ nsStyleUserInterface::CalcDifference(const nsStyleUserInterface& aNewData) const
|
|||
hint |= nsChangeHint_NeutralChange;
|
||||
}
|
||||
|
||||
if (mCaretColor != aNewData.mCaretColor) {
|
||||
hint |= nsChangeHint_RepaintFrame;
|
||||
}
|
||||
|
||||
return hint;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3416,6 +3416,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUserInterface
|
|||
|
||||
uint8_t mCursor; // [inherited] See nsStyleConsts.h
|
||||
nsTArray<nsCursorImage> mCursorImages; // [inherited] images and coords
|
||||
mozilla::StyleComplexColor mCaretColor; // [inherited]
|
||||
|
||||
inline uint8_t GetEffectivePointerEvents(nsIFrame* aFrame) const;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2836,6 +2836,18 @@ var gCSSProperties = {
|
|||
other_values: [ "bottom", "left", "right", "top-outside", "bottom-outside" ],
|
||||
invalid_values: []
|
||||
},
|
||||
"caret-color": {
|
||||
domProp: "caretColor",
|
||||
inherited: true,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
prerequisites: { "color": "black" },
|
||||
// Though "auto" is an independent computed-value time keyword value,
|
||||
// it is not distinguishable from currentcolor because getComputedStyle
|
||||
// always returns used value for <color>.
|
||||
initial_values: [ "auto", "currentcolor", "black", "rgb(0,0,0)" ],
|
||||
other_values: [ "green", "transparent", "rgba(128,128,128,.5)", "#123" ],
|
||||
invalid_values: [ "#0", "#00", "#00000", "cc00ff" ]
|
||||
},
|
||||
"clear": {
|
||||
domProp: "clear",
|
||||
inherited: false,
|
||||
|
|
|
|||
|
|
@ -1373,6 +1373,21 @@ function test_true_currentcolor_transition(prop, get_color=(x => x), is_shorthan
|
|||
div.style.removeProperty("color");
|
||||
}
|
||||
|
||||
function test_auto_color_transition(prop, get_color=(x => x), is_shorthand=false) {
|
||||
const msg_prefix = `color-valued property ${prop}: `;
|
||||
const test_color = "rgb(51, 102, 153)";
|
||||
div.style.setProperty("transition-property", "none", "");
|
||||
div.style.setProperty(prop, "auto", "");
|
||||
let used_value_of_auto = get_color(cs.getPropertyValue(prop));
|
||||
isnot(used_value_of_auto, test_color,
|
||||
msg_prefix + "ensure used auto value is different than our test color");
|
||||
|
||||
div.style.setProperty("transition-property", prop, "");
|
||||
div.style.setProperty(prop, test_color, "");
|
||||
is(get_color(cs.getPropertyValue(prop)), test_color,
|
||||
msg_prefix + "not interpolatable between auto and rgb color");
|
||||
}
|
||||
|
||||
function get_color_from_shorthand_value(value) {
|
||||
var m = value.match(/rgba?\([^, ]*, [^, ]*, [^, ]*(?:, [^, ]*)?\)/);
|
||||
isnot(m, null, "shorthand property value should contain color");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue