зеркало из https://github.com/mozilla/gecko-dev.git
merge mozilla-central to mozilla-inbound. r=merge a=merge
This commit is contained in:
Коммит
1867bfd2c5
|
@ -21,7 +21,6 @@ XPCOMUtils.defineLazyModuleGetters(this, {
|
|||
CharsetMenu: "resource://gre/modules/CharsetMenu.jsm",
|
||||
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.jsm",
|
||||
SyncedTabs: "resource://services-sync/SyncedTabs.jsm",
|
||||
ContextualIdentityService: "resource://gre/modules/ContextualIdentityService.jsm",
|
||||
});
|
||||
|
||||
XPCOMUtils.defineLazyGetter(this, "CharsetBundle", function() {
|
||||
|
@ -914,89 +913,6 @@ const CustomizableWidgets = [
|
|||
let win = aEvent.view;
|
||||
win.MailIntegration.sendLinkForBrowser(win.gBrowser.selectedBrowser)
|
||||
}
|
||||
}, {
|
||||
id: "containers-panelmenu",
|
||||
type: "view",
|
||||
viewId: "PanelUI-containers",
|
||||
hasObserver: false,
|
||||
onCreated(aNode) {
|
||||
let doc = aNode.ownerDocument;
|
||||
let win = doc.defaultView;
|
||||
let items = doc.getElementById("PanelUI-containersItems");
|
||||
|
||||
let onItemCommand = function(aEvent) {
|
||||
let item = aEvent.target;
|
||||
if (item.hasAttribute("usercontextid")) {
|
||||
let userContextId = parseInt(item.getAttribute("usercontextid"));
|
||||
win.openUILinkIn(win.BROWSER_NEW_TAB_URL, "tab", {userContextId});
|
||||
}
|
||||
};
|
||||
items.addEventListener("command", onItemCommand);
|
||||
|
||||
if (PrivateBrowsingUtils.isWindowPrivate(win)) {
|
||||
aNode.setAttribute("disabled", "true");
|
||||
}
|
||||
|
||||
this.updateVisibility(aNode);
|
||||
|
||||
if (!this.hasObserver) {
|
||||
Services.prefs.addObserver("privacy.userContext.enabled", this, true);
|
||||
this.hasObserver = true;
|
||||
}
|
||||
},
|
||||
onViewShowing(aEvent) {
|
||||
let doc = aEvent.target.ownerDocument;
|
||||
|
||||
let items = doc.getElementById("PanelUI-containersItems");
|
||||
|
||||
while (items.firstChild) {
|
||||
items.firstChild.remove();
|
||||
}
|
||||
|
||||
let fragment = doc.createDocumentFragment();
|
||||
let bundle = doc.getElementById("bundle_browser");
|
||||
|
||||
ContextualIdentityService.getPublicIdentities().forEach(identity => {
|
||||
let label = ContextualIdentityService.getUserContextLabel(identity.userContextId);
|
||||
|
||||
let item = doc.createElementNS(kNSXUL, "toolbarbutton");
|
||||
item.setAttribute("label", label);
|
||||
item.setAttribute("usercontextid", identity.userContextId);
|
||||
item.setAttribute("class", "subviewbutton");
|
||||
item.setAttribute("data-identity-color", identity.color);
|
||||
item.setAttribute("data-identity-icon", identity.icon);
|
||||
|
||||
fragment.appendChild(item);
|
||||
});
|
||||
|
||||
fragment.appendChild(doc.createElementNS(kNSXUL, "menuseparator"));
|
||||
|
||||
let item = doc.createElementNS(kNSXUL, "toolbarbutton");
|
||||
item.setAttribute("label", bundle.getString("userContext.aboutPage.label"));
|
||||
item.setAttribute("command", "Browser:OpenAboutContainers");
|
||||
item.setAttribute("class", "subviewbutton");
|
||||
fragment.appendChild(item);
|
||||
|
||||
items.appendChild(fragment);
|
||||
},
|
||||
|
||||
updateVisibility(aNode) {
|
||||
aNode.hidden = !Services.prefs.getBoolPref("privacy.userContext.enabled");
|
||||
},
|
||||
|
||||
observe(aSubject, aTopic, aData) {
|
||||
let {instances} = CustomizableUI.getWidget("containers-panelmenu");
|
||||
for (let {node} of instances) {
|
||||
if (node) {
|
||||
this.updateVisibility(node);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
QueryInterface: XPCOMUtils.generateQI([
|
||||
Ci.nsISupportsWeakReference,
|
||||
Ci.nsIObserver
|
||||
]),
|
||||
}];
|
||||
|
||||
let preferencesButton = {
|
||||
|
|
|
@ -76,9 +76,6 @@ paste-button.tooltiptext2 = Paste (%S)
|
|||
feed-button.label = Subscribe
|
||||
feed-button.tooltiptext2 = Subscribe to this page
|
||||
|
||||
containers-panelmenu.label = Open Container Tab
|
||||
containers-panelmenu.tooltiptext = Open Container Tab
|
||||
|
||||
# LOCALIZATION NOTE (characterencoding-button2.label): The \u00ad text at the beginning
|
||||
# of the string is used to disable auto hyphenation on the button text when it is displayed
|
||||
# in the menu panel.
|
||||
|
|
|
@ -92,7 +92,6 @@ XPCOMUtils.defineLazyGetter(this, "PALETTE_ITEMS", function() {
|
|||
"developer-button",
|
||||
"feed-button",
|
||||
"email-link-button",
|
||||
"containers-panelmenu",
|
||||
...LEGACY_PANEL_PLACEMENTS,
|
||||
"characterencoding-button",
|
||||
];
|
||||
|
|
|
@ -1,6 +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/. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill="context-fill" fill-opacity="context-fill-opacity" d="M12 4H4v4h8zm-2 2.75a.25.25 0 0 1-.25.25h-3.5A.25.25 0 0 1 6 6.75v-.5A.25.25 0 0 1 6.25 6h3.5a.25.25 0 0 1 .25.25zM12 9H4v4h8zm-2 2.75a.25.25 0 0 1-.25.25h-3.5a.25.25 0 0 1-.25-.25v-.5a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25zm3.854-9.9L13 1H3l-.854.853A.5.5 0 0 0 2 2.207V14a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V2.207a.5.5 0 0 0-.146-.354zM13 14H3V3h10z"/>
|
||||
</svg>
|
До Ширина: | Высота: | Размер: 726 B |
|
@ -128,7 +128,6 @@
|
|||
skin/classic/browser/chevron-animation.svg (../shared/icons/chevron-animation.svg)
|
||||
skin/classic/browser/check.svg (../shared/icons/check.svg)
|
||||
skin/classic/browser/check-animation.svg (../shared/icons/check-animation.svg)
|
||||
skin/classic/browser/containers.svg (../shared/icons/containers.svg)
|
||||
skin/classic/browser/customize.svg (../shared/icons/customize.svg)
|
||||
skin/classic/browser/developer.svg (../shared/icons/developer.svg)
|
||||
skin/classic/browser/device-mobile.svg (../shared/icons/device-mobile.svg)
|
||||
|
|
|
@ -217,10 +217,6 @@ toolbar[brighttext] {
|
|||
list-style-image: url("chrome://browser/skin/synced-tabs.svg");
|
||||
}
|
||||
|
||||
#containers-panelmenu {
|
||||
list-style-image: url("chrome://browser/skin/containers.svg");
|
||||
}
|
||||
|
||||
#feed-button {
|
||||
list-style-image: url("chrome://browser/skin/feed.svg");
|
||||
}
|
||||
|
|
|
@ -1821,7 +1821,7 @@ MediaFormatReader::NotifyError(TrackType aTrack, const MediaResult& aError)
|
|||
!aError.GPUCrashTimeStamp().IsNull()) {
|
||||
|
||||
GPUProcessCrashTelemetryLogger::RecordGPUCrashData(mMediaDecoderOwnerID,
|
||||
&decoder,
|
||||
decoder.mDecoder.get(),
|
||||
aError.GPUCrashTimeStamp(),
|
||||
TimeStamp::Now());
|
||||
}
|
||||
|
@ -2024,7 +2024,7 @@ MediaFormatReader::DecodeDemuxedSamples(TrackType aTrack,
|
|||
// frame, report the recovery time telemetry.
|
||||
if (aTrack == TrackType::kVideoTrack) {
|
||||
GPUProcessCrashTelemetryLogger::ReportTelemetry(
|
||||
mMediaDecoderOwnerID, &decoder);
|
||||
mMediaDecoderOwnerID, decoder.mDecoder.get());
|
||||
}
|
||||
},
|
||||
[self, this, aTrack, &decoder](const MediaResult& aError) {
|
||||
|
|
|
@ -773,12 +773,10 @@ PropertySupportsVariant(nsCSSPropertyID aPropertyID, uint32_t aVariant)
|
|||
case eCSSProperty_background_position_x:
|
||||
case eCSSProperty_background_position_y:
|
||||
case eCSSProperty_background_size:
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
case eCSSProperty_mask_position:
|
||||
case eCSSProperty_mask_position_x:
|
||||
case eCSSProperty_mask_position_y:
|
||||
case eCSSProperty_mask_size:
|
||||
#endif
|
||||
case eCSSProperty_grid_auto_columns:
|
||||
case eCSSProperty_grid_auto_rows:
|
||||
case eCSSProperty_grid_template_columns:
|
||||
|
|
|
@ -441,11 +441,7 @@ Declaration::GetImageLayerValue(
|
|||
}
|
||||
// This layer is an mask layer
|
||||
} else {
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
MOZ_ASSERT(aTable == nsStyleImageLayers::kMaskLayerTable);
|
||||
#else
|
||||
MOZ_ASSERT_UNREACHABLE("Should never get here when mask-as-shorthand is disable");
|
||||
#endif
|
||||
if (repeat || positionX || positionY || clip || origin || size ||
|
||||
composite || mode) {
|
||||
// Uneven length lists, so can't be serialized as shorthand.
|
||||
|
@ -466,11 +462,7 @@ Declaration::GetImageLayerValue(
|
|||
}
|
||||
// This layer is an mask layer
|
||||
} else {
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
MOZ_ASSERT(aTable == nsStyleImageLayers::kMaskLayerTable);
|
||||
#else
|
||||
MOZ_ASSERT_UNREACHABLE("Should never get here when mask-as-shorthand is disable");
|
||||
#endif
|
||||
if (!repeat || !positionX || !positionY || !clip || !origin || !size ||
|
||||
!composite || !mode) {
|
||||
// Uneven length lists, so can't be serialized as shorthand.
|
||||
|
@ -800,7 +792,6 @@ Declaration::GetPropertyValueInternal(
|
|||
nsStyleImageLayers::kBackgroundLayerTable);
|
||||
break;
|
||||
}
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
case eCSSProperty_mask: {
|
||||
GetImageLayerValue(data, aValue, nsStyleImageLayers::kMaskLayerTable);
|
||||
break;
|
||||
|
@ -810,7 +801,6 @@ Declaration::GetPropertyValueInternal(
|
|||
nsStyleImageLayers::kMaskLayerTable);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
case eCSSProperty_font: {
|
||||
// systemFont might not be present; other values are guaranteed to be
|
||||
// available based on the shorthand check at the beginning of the
|
||||
|
|
|
@ -23,6 +23,12 @@ args = ["-DOS_LINUX=1"]
|
|||
"arch=x86" = ["-m32"]
|
||||
"arch=x86_64" = ["-m64"]
|
||||
|
||||
[build."os=android"]
|
||||
args = ["-DOS_ANDROID=1"]
|
||||
"arch=aarch64" = ["--target=aarch64-linux-android"]
|
||||
"arch=arm" = ["--target=armv7-linux-androideabi"]
|
||||
"arch=x86" = ["--target=i686-linux-android"]
|
||||
|
||||
[build."os=windows"."env=msvc"]
|
||||
args = [
|
||||
"-DOS_WIN=1", "-DWIN32=1",
|
||||
|
|
|
@ -4545,13 +4545,14 @@ StyleAnimationValue::ExtractComputedValue(nsCSSPropertyID aProperty,
|
|||
ExtractImageLayerPositionYList(layers, aComputedValue);
|
||||
break;
|
||||
}
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
|
||||
case eCSSProperty_mask_position_x: {
|
||||
const nsStyleImageLayers& layers =
|
||||
static_cast<const nsStyleSVGReset*>(styleStruct)->mMask;
|
||||
ExtractImageLayerPositionXList(layers, aComputedValue);
|
||||
break;
|
||||
}
|
||||
|
||||
case eCSSProperty_mask_position_y: {
|
||||
const nsStyleImageLayers& layers =
|
||||
static_cast<const nsStyleSVGReset*>(styleStruct)->mMask;
|
||||
|
@ -4559,21 +4560,20 @@ StyleAnimationValue::ExtractComputedValue(nsCSSPropertyID aProperty,
|
|||
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
case eCSSProperty_background_size: {
|
||||
const nsStyleImageLayers& layers =
|
||||
static_cast<const nsStyleBackground*>(styleStruct)->mImage;
|
||||
ExtractImageLayerSizePairList(layers, aComputedValue);
|
||||
break;
|
||||
}
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
|
||||
case eCSSProperty_mask_size: {
|
||||
const nsStyleImageLayers& layers =
|
||||
static_cast<const nsStyleSVGReset*>(styleStruct)->mMask;
|
||||
ExtractImageLayerSizePairList(layers, aComputedValue);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
case eCSSProperty_clip_path: {
|
||||
const nsStyleSVGReset* svgReset =
|
||||
|
|
|
@ -61,7 +61,6 @@ TryToStartImageLoadOnValue(const nsCSSValue& aValue, nsIDocument* aDocument,
|
|||
MOZ_ASSERT(aDocument);
|
||||
|
||||
if (aValue.GetUnit() == eCSSUnit_URL) {
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
// The 'mask-image' property accepts local reference URIs.
|
||||
// For example,
|
||||
// mask-image: url(#mask_id); // refer to a SVG mask element, whose id is
|
||||
|
@ -94,7 +93,7 @@ TryToStartImageLoadOnValue(const nsCSSValue& aValue, nsIDocument* aDocument,
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
aValue.StartImageLoad(aDocument);
|
||||
if (aForTokenStream && aContext) {
|
||||
CSSVariableImageTable::Add(aContext, aProperty,
|
||||
|
|
|
@ -11802,7 +11802,6 @@ CSSParserImpl::ParsePropertyByFunction(nsCSSPropertyID aPropID)
|
|||
return ParsePaintOrder();
|
||||
case eCSSProperty_scroll_snap_type:
|
||||
return ParseScrollSnapType();
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
case eCSSProperty_mask:
|
||||
return ParseImageLayers(nsStyleImageLayers::kMaskLayerTable);
|
||||
case eCSSProperty_mask_repeat:
|
||||
|
@ -11815,7 +11814,6 @@ CSSParserImpl::ParsePropertyByFunction(nsCSSPropertyID aPropID)
|
|||
aPropID == eCSSProperty_mask_position_x);
|
||||
case eCSSProperty_mask_size:
|
||||
return ParseImageLayerSize(eCSSProperty_mask_size);
|
||||
#endif
|
||||
case eCSSProperty__webkit_text_stroke:
|
||||
return ParseWebkitTextStroke();
|
||||
case eCSSProperty_all:
|
||||
|
|
|
@ -549,8 +549,6 @@ CSS_PROP_ALIAS(-webkit-user-select,
|
|||
_moz_user_select,
|
||||
WebkitUserSelect,
|
||||
WEBKIT_PREFIX_PREF)
|
||||
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
CSS_PROP_ALIAS(-webkit-mask,
|
||||
_webkit_mask,
|
||||
mask,
|
||||
|
@ -601,5 +599,4 @@ CSS_PROP_ALIAS(-webkit-mask-size,
|
|||
mask_size,
|
||||
WebkitMaskSize,
|
||||
WEBKIT_PREFIX_PREF)
|
||||
#endif
|
||||
#undef WEBKIT_PREFIX_PREF
|
||||
|
|
|
@ -2707,19 +2707,6 @@ CSS_PROP_SVG(
|
|||
nullptr,
|
||||
CSS_PROP_NO_OFFSET,
|
||||
eStyleAnimType_Discrete)
|
||||
#ifndef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
CSS_PROP_SVGRESET(
|
||||
mask,
|
||||
mask,
|
||||
Mask,
|
||||
CSS_PROPERTY_PARSE_VALUE |
|
||||
CSS_PROPERTY_CREATES_STACKING_CONTEXT,
|
||||
"",
|
||||
VARIANT_HUO,
|
||||
nullptr,
|
||||
CSS_PROP_NO_OFFSET,
|
||||
eStyleAnimType_Discrete)
|
||||
#else
|
||||
CSS_PROP_SHORTHAND(
|
||||
mask,
|
||||
mask,
|
||||
|
@ -2838,7 +2825,6 @@ CSS_PROP_SVGRESET(
|
|||
kImageLayerSizeKTable,
|
||||
CSS_PROP_NO_OFFSET,
|
||||
eStyleAnimType_Custom)
|
||||
#endif // MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
CSS_PROP_SVGRESET(
|
||||
mask-type,
|
||||
mask_type,
|
||||
|
|
|
@ -3003,7 +3003,7 @@ static const nsCSSPropertyID gScrollSnapTypeSubpropTable[] = {
|
|||
eCSSProperty_scroll_snap_type_y,
|
||||
eCSSProperty_UNKNOWN
|
||||
};
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
|
||||
static const nsCSSPropertyID gMaskSubpropTable[] = {
|
||||
eCSSProperty_mask_image,
|
||||
eCSSProperty_mask_repeat,
|
||||
|
@ -3016,12 +3016,13 @@ static const nsCSSPropertyID gMaskSubpropTable[] = {
|
|||
eCSSProperty_mask_mode,
|
||||
eCSSProperty_UNKNOWN
|
||||
};
|
||||
|
||||
static const nsCSSPropertyID gMaskPositionSubpropTable[] = {
|
||||
eCSSProperty_mask_position_x,
|
||||
eCSSProperty_mask_position_y,
|
||||
eCSSProperty_UNKNOWN
|
||||
};
|
||||
#endif
|
||||
|
||||
// FIXME: mask-border tables should be added when we implement
|
||||
// mask-border properties.
|
||||
|
||||
|
|
|
@ -6508,7 +6508,6 @@ nsComputedDOMStyle::DoGetMask()
|
|||
return val.forget();
|
||||
}
|
||||
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
already_AddRefed<CSSValue>
|
||||
nsComputedDOMStyle::DoGetMaskClip()
|
||||
{
|
||||
|
@ -6586,7 +6585,6 @@ nsComputedDOMStyle::DoGetMaskSize()
|
|||
const nsStyleImageLayers& layers = StyleSVGReset()->mMask;
|
||||
return DoGetImageLayerSize(layers);
|
||||
}
|
||||
#endif
|
||||
|
||||
already_AddRefed<CSSValue>
|
||||
nsComputedDOMStyle::DoGetMaskType()
|
||||
|
|
|
@ -346,7 +346,6 @@ private:
|
|||
|
||||
/* Mask properties */
|
||||
already_AddRefed<CSSValue> DoGetMask();
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
already_AddRefed<CSSValue> DoGetMaskImage();
|
||||
already_AddRefed<CSSValue> DoGetMaskPosition();
|
||||
already_AddRefed<CSSValue> DoGetMaskPositionX();
|
||||
|
@ -357,7 +356,7 @@ private:
|
|||
already_AddRefed<CSSValue> DoGetMaskSize();
|
||||
already_AddRefed<CSSValue> DoGetMaskMode();
|
||||
already_AddRefed<CSSValue> DoGetMaskComposite();
|
||||
#endif
|
||||
|
||||
/* Padding properties */
|
||||
already_AddRefed<CSSValue> DoGetPaddingTop();
|
||||
already_AddRefed<CSSValue> DoGetPaddingBottom();
|
||||
|
|
|
@ -340,7 +340,6 @@ COMPUTED_STYLE_PROP(marker_end, MarkerEnd)
|
|||
COMPUTED_STYLE_PROP(marker_mid, MarkerMid)
|
||||
COMPUTED_STYLE_PROP(marker_start, MarkerStart)
|
||||
COMPUTED_STYLE_PROP(mask, Mask)
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
COMPUTED_STYLE_PROP(mask_clip, MaskClip)
|
||||
COMPUTED_STYLE_PROP(mask_composite, MaskComposite)
|
||||
COMPUTED_STYLE_PROP(mask_image, MaskImage)
|
||||
|
@ -351,7 +350,6 @@ COMPUTED_STYLE_PROP(mask_position_x, MaskPositionX)
|
|||
COMPUTED_STYLE_PROP(mask_position_y, MaskPositionY)
|
||||
COMPUTED_STYLE_PROP(mask_repeat, MaskRepeat)
|
||||
COMPUTED_STYLE_PROP(mask_size, MaskSize)
|
||||
#endif
|
||||
COMPUTED_STYLE_PROP(mask_type, MaskType)
|
||||
COMPUTED_STYLE_PROP(paint_order, PaintOrder)
|
||||
COMPUTED_STYLE_PROP(shape_rendering, ShapeRendering)
|
||||
|
|
|
@ -10146,7 +10146,6 @@ nsRuleNode::ComputeSVGResetData(void* aStartStruct,
|
|||
parentSVGReset->mMaskType,
|
||||
NS_STYLE_MASK_TYPE_LUMINANCE);
|
||||
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
uint32_t maxItemCount = 1;
|
||||
bool rebuild = false;
|
||||
|
||||
|
@ -10246,21 +10245,6 @@ nsRuleNode::ComputeSVGResetData(void* aStartStruct,
|
|||
if (rebuild) {
|
||||
FillAllBackgroundLists(svgReset->mMask, maxItemCount);
|
||||
}
|
||||
#else
|
||||
// mask: none | <url>
|
||||
const nsCSSValue* maskValue = aRuleData->ValueForMask();
|
||||
if (eCSSUnit_URL == maskValue->GetUnit()) {
|
||||
svgReset->mMask.mLayers[0].mSourceURI = maskValue->GetURLStructValue();
|
||||
} else if (eCSSUnit_None == maskValue->GetUnit() ||
|
||||
eCSSUnit_Initial == maskValue->GetUnit() ||
|
||||
eCSSUnit_Unset == maskValue->GetUnit()) {
|
||||
svgReset->mMask.mLayers[0].mSourceURI = nullptr;
|
||||
} else if (eCSSUnit_Inherit == maskValue->GetUnit()) {
|
||||
conditions.SetUncacheable();
|
||||
svgReset->mMask.mLayers[0].mSourceURI =
|
||||
parentSVGReset->mMask.mLayers[0].mSourceURI;
|
||||
}
|
||||
#endif
|
||||
|
||||
COMPUTE_END_RESET(SVGReset, svgReset)
|
||||
}
|
||||
|
|
|
@ -230,67 +230,6 @@ enum class StyleOrient : uint8_t {
|
|||
Vertical,
|
||||
};
|
||||
|
||||
// Azimuth - See nsStyleAural
|
||||
#define NS_STYLE_AZIMUTH_LEFT_SIDE 0x00
|
||||
#define NS_STYLE_AZIMUTH_FAR_LEFT 0x01
|
||||
#define NS_STYLE_AZIMUTH_LEFT 0x02
|
||||
#define NS_STYLE_AZIMUTH_CENTER_LEFT 0x03
|
||||
#define NS_STYLE_AZIMUTH_CENTER 0x04
|
||||
#define NS_STYLE_AZIMUTH_CENTER_RIGHT 0x05
|
||||
#define NS_STYLE_AZIMUTH_RIGHT 0x06
|
||||
#define NS_STYLE_AZIMUTH_FAR_RIGHT 0x07
|
||||
#define NS_STYLE_AZIMUTH_RIGHT_SIDE 0x08
|
||||
#define NS_STYLE_AZIMUTH_BEHIND 0x80 // bits
|
||||
#define NS_STYLE_AZIMUTH_LEFTWARDS 0x10 // bits
|
||||
#define NS_STYLE_AZIMUTH_RIGHTWARDS 0x20 // bits
|
||||
|
||||
// See nsStyleAural
|
||||
#define NS_STYLE_ELEVATION_BELOW 1
|
||||
#define NS_STYLE_ELEVATION_LEVEL 2
|
||||
#define NS_STYLE_ELEVATION_ABOVE 3
|
||||
#define NS_STYLE_ELEVATION_HIGHER 4
|
||||
#define NS_STYLE_ELEVATION_LOWER 5
|
||||
|
||||
// See nsStyleAural
|
||||
#define NS_STYLE_PITCH_X_LOW 1
|
||||
#define NS_STYLE_PITCH_LOW 2
|
||||
#define NS_STYLE_PITCH_MEDIUM 3
|
||||
#define NS_STYLE_PITCH_HIGH 4
|
||||
#define NS_STYLE_PITCH_X_HIGH 5
|
||||
|
||||
// See nsStyleAural
|
||||
#define NS_STYLE_SPEAK_NONE 0
|
||||
#define NS_STYLE_SPEAK_NORMAL 1
|
||||
#define NS_STYLE_SPEAK_SPELL_OUT 2
|
||||
|
||||
// See nsStyleAural
|
||||
#define NS_STYLE_SPEAK_HEADER_ONCE 0
|
||||
#define NS_STYLE_SPEAK_HEADER_ALWAYS 1
|
||||
|
||||
// See nsStyleAural
|
||||
#define NS_STYLE_SPEAK_NUMERAL_DIGITS 0
|
||||
#define NS_STYLE_SPEAK_NUMERAL_CONTINUOUS 1
|
||||
|
||||
// See nsStyleAural
|
||||
#define NS_STYLE_SPEAK_PUNCTUATION_NONE 0
|
||||
#define NS_STYLE_SPEAK_PUNCTUATION_CODE 1
|
||||
|
||||
// See nsStyleAural
|
||||
#define NS_STYLE_SPEECH_RATE_X_SLOW 0
|
||||
#define NS_STYLE_SPEECH_RATE_SLOW 1
|
||||
#define NS_STYLE_SPEECH_RATE_MEDIUM 2
|
||||
#define NS_STYLE_SPEECH_RATE_FAST 3
|
||||
#define NS_STYLE_SPEECH_RATE_X_FAST 4
|
||||
#define NS_STYLE_SPEECH_RATE_FASTER 10
|
||||
#define NS_STYLE_SPEECH_RATE_SLOWER 11
|
||||
|
||||
// See nsStyleAural
|
||||
#define NS_STYLE_VOLUME_SILENT 0
|
||||
#define NS_STYLE_VOLUME_X_SOFT 1
|
||||
#define NS_STYLE_VOLUME_SOFT 2
|
||||
#define NS_STYLE_VOLUME_MEDIUM 3
|
||||
#define NS_STYLE_VOLUME_LOUD 4
|
||||
#define NS_STYLE_VOLUME_X_LOUD 5
|
||||
|
||||
// See nsStyleColor
|
||||
#define NS_STYLE_COLOR_INHERIT_FROM_BODY 2 /* Can't come from CSS directly */
|
||||
|
|
|
@ -2637,7 +2637,6 @@ const nsCSSPropertyID nsStyleImageLayers::kBackgroundLayerTable[] = {
|
|||
eCSSProperty_UNKNOWN // composite
|
||||
};
|
||||
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
const nsCSSPropertyID nsStyleImageLayers::kMaskLayerTable[] = {
|
||||
eCSSProperty_mask, // shorthand
|
||||
eCSSProperty_UNKNOWN, // color
|
||||
|
@ -2652,7 +2651,6 @@ const nsCSSPropertyID nsStyleImageLayers::kMaskLayerTable[] = {
|
|||
eCSSProperty_mask_mode, // maskMode
|
||||
eCSSProperty_mask_composite // composite
|
||||
};
|
||||
#endif
|
||||
|
||||
nsStyleImageLayers::nsStyleImageLayers(nsStyleImageLayers::LayerType aType)
|
||||
: mAttachmentCount(1)
|
||||
|
|
|
@ -124,8 +124,6 @@ TEST_HARNESS_FILES.testing.mochitest.tests.layout.style.test['css-visited'] += [
|
|||
]
|
||||
|
||||
DEFINES['MOZILLA_INTERNAL_API'] = True
|
||||
if CONFIG['MOZ_ENABLE_MASK_AS_SHORTHAND']:
|
||||
HOST_DEFINES['MOZ_ENABLE_MASK_AS_SHORTHAND'] = True
|
||||
|
||||
if CONFIG['COMPILE_ENVIRONMENT']:
|
||||
GENERATED_FILES += ['css_properties.js']
|
||||
|
|
|
@ -2040,6 +2040,265 @@ var gCSSProperties = {
|
|||
],
|
||||
invalid_values: [ "5", "..25px", ".+5px", ".px", "-.px", "++5px", "-+4px", "+-3px", "--7px", "+-.6px", "-+.5px", "++.7px", "--.4px" ],
|
||||
},
|
||||
"mask": {
|
||||
domProp: "mask",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
/* FIXME: All mask-border-* should be added when we implement them. */
|
||||
subproperties: ["mask-clip", "mask-image", "mask-mode", "mask-origin", "mask-position-x", "mask-position-y", "mask-repeat", "mask-size" , "mask-composite"],
|
||||
initial_values: [ "match-source", "none", "repeat", "add", "0% 0%", "top left", "0% 0% / auto", "top left / auto", "left top / auto", "0% 0% / auto auto",
|
||||
"top left none", "left top none", "none left top", "none top left", "none 0% 0%", "top left / auto none", "left top / auto none",
|
||||
"top left / auto auto none",
|
||||
"match-source none repeat add top left", "top left repeat none add", "none repeat add top left / auto", "top left / auto repeat none add match-source", "none repeat add 0% 0% / auto auto match-source",
|
||||
"border-box", "border-box border-box" ],
|
||||
other_values: [
|
||||
"none alpha repeat add left top",
|
||||
"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
|
||||
"no-repeat url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==') alpha left top add",
|
||||
"repeat-x",
|
||||
"repeat-y",
|
||||
"no-repeat",
|
||||
"none repeat-y alpha add 0% 0%",
|
||||
"subtract",
|
||||
"0% top subtract alpha repeat none",
|
||||
"top",
|
||||
"left",
|
||||
"50% 50%",
|
||||
"center",
|
||||
"top / 100px",
|
||||
"left / contain",
|
||||
"left / cover",
|
||||
"10px / 10%",
|
||||
"10em / calc(20px)",
|
||||
"top left / 100px 100px",
|
||||
"top left / 100px auto",
|
||||
"top left / 100px 10%",
|
||||
"top left / 100px calc(20px)",
|
||||
"bottom right add none alpha repeat",
|
||||
"50% alpha",
|
||||
"alpha 50%",
|
||||
"50%",
|
||||
"url(#mymask)",
|
||||
"radial-gradient(at 10% bottom, #ffffff, black) add no-repeat",
|
||||
"repeating-radial-gradient(at 10% bottom, #ffffff, black) no-repeat",
|
||||
"-moz-element(#test) alpha",
|
||||
/* multiple mask-image */
|
||||
"url(404.png), url(404.png)",
|
||||
"repeat-x, subtract, none",
|
||||
"0% top url(404.png), url(404.png) 50% top",
|
||||
"subtract repeat-y top left url(404.png), repeat-x alpha",
|
||||
"top left / contain, bottom right / cover",
|
||||
/* test cases with clip+origin in the shorthand */
|
||||
"url(404.png) alpha padding-box",
|
||||
"url(404.png) border-box alpha",
|
||||
"content-box url(404.png)",
|
||||
"url(404.png) alpha padding-box padding-box",
|
||||
"url(404.png) alpha padding-box border-box",
|
||||
"content-box border-box url(404.png)",
|
||||
"alpha padding-box url(404.png) border-box",
|
||||
"alpha padding-box url(404.png) padding-box",
|
||||
],
|
||||
invalid_values: [
|
||||
/* mixes with keywords have to be in correct order */
|
||||
"50% left", "top 50%",
|
||||
/* no quirks mode colors */
|
||||
"radial-gradient(at 10% bottom, ffffff, black) add no-repeat",
|
||||
/* no quirks mode lengths */
|
||||
"linear-gradient(red -99, yellow, green, blue 120%)",
|
||||
/* bug 258080: don't accept background-position separated */
|
||||
"left url(404.png) top", "top url(404.png) left",
|
||||
"-moz-element(#a rubbish)",
|
||||
"left top / match-source"
|
||||
]
|
||||
},
|
||||
"mask-clip": {
|
||||
domProp: "maskClip",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "border-box" ],
|
||||
other_values: [ "content-box", "fill-box", "stroke-box", "view-box", "no-clip", "padding-box", "border-box, padding-box", "padding-box, padding-box, padding-box", "border-box, border-box" ],
|
||||
invalid_values: [ "content-box content-box", "margin-box" ]
|
||||
},
|
||||
"mask-composite": {
|
||||
domProp: "maskComposite",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "add" ],
|
||||
other_values: [ "subtract", "intersect", "exclude", "add, add", "subtract, intersect", "subtract, subtract, add"],
|
||||
invalid_values: [ "add subtract", "intersect exclude" ]
|
||||
},
|
||||
"mask-image": {
|
||||
domProp: "maskImage",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "none" ],
|
||||
other_values: [
|
||||
"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
|
||||
"none, none",
|
||||
"none, none, none, none, none",
|
||||
"url(#mymask)",
|
||||
"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
|
||||
"none, url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
|
||||
"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
|
||||
].concat(validGradientAndElementValues),
|
||||
invalid_values: [
|
||||
].concat(invalidGradientAndElementValues),
|
||||
unbalanced_values: [
|
||||
].concat(unbalancedGradientAndElementValues)
|
||||
},
|
||||
"mask-mode": {
|
||||
domProp: "maskMode",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "match-source" ],
|
||||
other_values: [ "alpha", "luminance", "match-source, match-source", "match-source, alpha", "alpha, luminance, match-source"],
|
||||
invalid_values: [ "match-source match-source", "alpha match-source" ]
|
||||
},
|
||||
"mask-origin": {
|
||||
domProp: "maskOrigin",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "border-box" ],
|
||||
other_values: [ "padding-box", "content-box", "fill-box", "stroke-box", "view-box", "border-box, padding-box", "padding-box, padding-box, padding-box", "border-box, border-box" ],
|
||||
invalid_values: [ "padding-box padding-box", "no-clip", "margin-box" ]
|
||||
},
|
||||
"mask-position": {
|
||||
domProp: "maskPosition",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
initial_values: [ "top 0% left 0%", "top 0% left", "top left", "left top", "0% 0%", "0% top", "left 0%" ],
|
||||
other_values: [ "top", "left", "right", "bottom", "center", "center bottom", "bottom center", "center right", "right center", "center top", "top center", "center left", "left center", "right bottom", "bottom right", "50%", "top left, top left", "top left, top right", "top right, top left", "left top, 0% 0%", "10% 20%, 30%, 40%", "top left, bottom right", "right bottom, left top", "0%", "0px", "30px", "0%, 10%, 20%, 30%", "top, top, top, top, top",
|
||||
"calc(20px)",
|
||||
"calc(20px) 10px",
|
||||
"10px calc(20px)",
|
||||
"calc(20px) 25%",
|
||||
"25% calc(20px)",
|
||||
"calc(20px) calc(20px)",
|
||||
"calc(20px + 1em) calc(20px / 2)",
|
||||
"calc(20px + 50%) calc(50% - 10px)",
|
||||
"calc(-20px) calc(-50%)",
|
||||
"calc(-20%) calc(-50%)",
|
||||
"0px 0px",
|
||||
"right 20px top 60px",
|
||||
"right 20px bottom 60px",
|
||||
"left 20px top 60px",
|
||||
"left 20px bottom 60px",
|
||||
"right -50px top -50px",
|
||||
"left -50px bottom -50px",
|
||||
"right 20px top -50px",
|
||||
"right -20px top 50px",
|
||||
"right 3em bottom 10px",
|
||||
"bottom 3em right 10px",
|
||||
"top 3em right 10px",
|
||||
"left 15px",
|
||||
"10px top",
|
||||
"left top 15px",
|
||||
"left 10px top",
|
||||
"left 20%",
|
||||
"right 20%"
|
||||
],
|
||||
subproperties: [ "mask-position-x", "mask-position-y" ],
|
||||
invalid_values: [ "center 10px center 4px", "center 10px center",
|
||||
"top 20%", "bottom 20%", "50% left", "top 50%",
|
||||
"50% bottom 10%", "right 10% 50%", "left right",
|
||||
"top bottom", "left 10% right",
|
||||
"top 20px bottom 20px", "left left",
|
||||
"0px calc(0px + rubbish)"],
|
||||
},
|
||||
"mask-position-x": {
|
||||
domProp: "maskPositionX",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "left", "0%" ],
|
||||
other_values: [ "right", "center", "50%", "center, center", "center, right", "right, center", "center, 50%", "10%, 20%, 40%", "1px", "30px", "50%, 10%, 20%, 30%", "center, center, center, center, center",
|
||||
"calc(20px)",
|
||||
"calc(20px + 1em)",
|
||||
"calc(20px / 2)",
|
||||
"calc(20px + 50%)",
|
||||
"calc(50% - 10px)",
|
||||
"calc(-20px)",
|
||||
"calc(-50%)",
|
||||
"calc(-20%)",
|
||||
"right 20px",
|
||||
"left 20px",
|
||||
"right -50px",
|
||||
"left -50px",
|
||||
"right 20px",
|
||||
"right 3em",
|
||||
],
|
||||
invalid_values: [ "center 10px", "right 10% 50%", "left right", "left left",
|
||||
"bottom 20px", "top 10%", "bottom 3em",
|
||||
"top", "bottom", "top, top", "top, bottom", "bottom, top", "top, 0%", "top, top, top, top, top",
|
||||
"calc(0px + rubbish)", "center 0%"],
|
||||
},
|
||||
"mask-position-y": {
|
||||
domProp: "maskPositionY",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "top", "0%" ],
|
||||
other_values: [ "bottom", "center", "50%", "center, center", "center, bottom", "bottom, center", "center, 0%", "10%, 20%, 40%", "1px", "30px", "50%, 10%, 20%, 30%", "center, center, center, center, center",
|
||||
"calc(20px)",
|
||||
"calc(20px + 1em)",
|
||||
"calc(20px / 2)",
|
||||
"calc(20px + 50%)",
|
||||
"calc(50% - 10px)",
|
||||
"calc(-20px)",
|
||||
"calc(-50%)",
|
||||
"calc(-20%)",
|
||||
"bottom 20px",
|
||||
"top 20px",
|
||||
"bottom -50px",
|
||||
"top -50px",
|
||||
"bottom 20px",
|
||||
"bottom 3em",
|
||||
],
|
||||
invalid_values: [ "center 10px", "bottom 10% 50%", "top bottom", "top top",
|
||||
"right 20px", "left 10%", "right 3em",
|
||||
"left", "right", "left, left", "left, right", "right, left", "left, 0%", "left, left, left, left, left",
|
||||
"calc(0px + rubbish)", "center 0%"],
|
||||
},
|
||||
"mask-repeat": {
|
||||
domProp: "maskRepeat",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "repeat", "repeat repeat" ],
|
||||
other_values: [ "repeat-x", "repeat-y", "no-repeat",
|
||||
"repeat-x, repeat-x",
|
||||
"repeat, no-repeat",
|
||||
"repeat-y, no-repeat, repeat-y",
|
||||
"repeat, repeat, repeat",
|
||||
"repeat no-repeat",
|
||||
"no-repeat repeat",
|
||||
"no-repeat no-repeat",
|
||||
"repeat no-repeat",
|
||||
"no-repeat no-repeat, no-repeat no-repeat",
|
||||
],
|
||||
invalid_values: [ "repeat repeat repeat",
|
||||
"repeat-x repeat-y",
|
||||
"repeat repeat-x",
|
||||
"repeat repeat-y",
|
||||
"repeat-x repeat",
|
||||
"repeat-y repeat" ]
|
||||
},
|
||||
"mask-size": {
|
||||
domProp: "maskSize",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "auto", "auto auto" ],
|
||||
other_values: [ "contain", "cover", "100px auto", "auto 100px", "100% auto", "auto 100%", "25% 50px", "3em 40%",
|
||||
"calc(20px)",
|
||||
"calc(20px) 10px",
|
||||
"10px calc(20px)",
|
||||
"calc(20px) 25%",
|
||||
"25% calc(20px)",
|
||||
"calc(20px) calc(20px)",
|
||||
"calc(20px + 1em) calc(20px / 2)",
|
||||
"calc(20px + 50%) calc(50% - 10px)",
|
||||
"calc(-20px) calc(-50%)",
|
||||
"calc(-20%) calc(-50%)"
|
||||
],
|
||||
invalid_values: [ "contain contain", "cover cover", "cover auto", "auto cover", "contain cover", "cover contain", "-5px 3px", "3px -5px", "auto -5px", "-5px auto", "5 3", "10px calc(10px + rubbish)" ]
|
||||
},
|
||||
"mask-type": {
|
||||
domProp: "maskType",
|
||||
inherited: false,
|
||||
|
@ -7245,281 +7504,6 @@ if (IsCSSPropertyPrefEnabled("layout.css.scroll-snap.enabled")) {
|
|||
};
|
||||
}
|
||||
|
||||
function SupportsMaskShorthand() {
|
||||
return "maskImage" in document.documentElement.style;
|
||||
}
|
||||
|
||||
if (SupportsMaskShorthand()) {
|
||||
gCSSProperties["mask"] = {
|
||||
domProp: "mask",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
/* FIXME: All mask-border-* should be added when we implement them. */
|
||||
subproperties: ["mask-clip", "mask-image", "mask-mode", "mask-origin", "mask-position-x", "mask-position-y", "mask-repeat", "mask-size" , "mask-composite"],
|
||||
initial_values: [ "match-source", "none", "repeat", "add", "0% 0%", "top left", "0% 0% / auto", "top left / auto", "left top / auto", "0% 0% / auto auto",
|
||||
"top left none", "left top none", "none left top", "none top left", "none 0% 0%", "top left / auto none", "left top / auto none",
|
||||
"top left / auto auto none",
|
||||
"match-source none repeat add top left", "top left repeat none add", "none repeat add top left / auto", "top left / auto repeat none add match-source", "none repeat add 0% 0% / auto auto match-source",
|
||||
"border-box", "border-box border-box" ],
|
||||
other_values: [
|
||||
"none alpha repeat add left top",
|
||||
"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
|
||||
"no-repeat url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==') alpha left top add",
|
||||
"repeat-x",
|
||||
"repeat-y",
|
||||
"no-repeat",
|
||||
"none repeat-y alpha add 0% 0%",
|
||||
"subtract",
|
||||
"0% top subtract alpha repeat none",
|
||||
"top",
|
||||
"left",
|
||||
"50% 50%",
|
||||
"center",
|
||||
"top / 100px",
|
||||
"left / contain",
|
||||
"left / cover",
|
||||
"10px / 10%",
|
||||
"10em / calc(20px)",
|
||||
"top left / 100px 100px",
|
||||
"top left / 100px auto",
|
||||
"top left / 100px 10%",
|
||||
"top left / 100px calc(20px)",
|
||||
"bottom right add none alpha repeat",
|
||||
"50% alpha",
|
||||
"alpha 50%",
|
||||
"50%",
|
||||
"url(#mymask)",
|
||||
"radial-gradient(at 10% bottom, #ffffff, black) add no-repeat",
|
||||
"repeating-radial-gradient(at 10% bottom, #ffffff, black) no-repeat",
|
||||
"-moz-element(#test) alpha",
|
||||
/* multiple mask-image */
|
||||
"url(404.png), url(404.png)",
|
||||
"repeat-x, subtract, none",
|
||||
"0% top url(404.png), url(404.png) 50% top",
|
||||
"subtract repeat-y top left url(404.png), repeat-x alpha",
|
||||
"top left / contain, bottom right / cover",
|
||||
/* test cases with clip+origin in the shorthand */
|
||||
"url(404.png) alpha padding-box",
|
||||
"url(404.png) border-box alpha",
|
||||
"content-box url(404.png)",
|
||||
"url(404.png) alpha padding-box padding-box",
|
||||
"url(404.png) alpha padding-box border-box",
|
||||
"content-box border-box url(404.png)",
|
||||
"alpha padding-box url(404.png) border-box",
|
||||
"alpha padding-box url(404.png) padding-box",
|
||||
],
|
||||
invalid_values: [
|
||||
/* mixes with keywords have to be in correct order */
|
||||
"50% left", "top 50%",
|
||||
/* no quirks mode colors */
|
||||
"radial-gradient(at 10% bottom, ffffff, black) add no-repeat",
|
||||
/* no quirks mode lengths */
|
||||
"linear-gradient(red -99, yellow, green, blue 120%)",
|
||||
/* bug 258080: don't accept background-position separated */
|
||||
"left url(404.png) top", "top url(404.png) left",
|
||||
"-moz-element(#a rubbish)",
|
||||
"left top / match-source"
|
||||
]
|
||||
};
|
||||
gCSSProperties["mask-clip"] = {
|
||||
domProp: "maskClip",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "border-box" ],
|
||||
other_values: [ "content-box", "fill-box", "stroke-box", "view-box", "no-clip", "padding-box", "border-box, padding-box", "padding-box, padding-box, padding-box", "border-box, border-box" ],
|
||||
invalid_values: [ "content-box content-box", "margin-box" ]
|
||||
};
|
||||
gCSSProperties["mask-image"] = {
|
||||
domProp: "maskImage",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "none" ],
|
||||
other_values: [
|
||||
"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
|
||||
"none, none",
|
||||
"none, none, none, none, none",
|
||||
"url(#mymask)",
|
||||
"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
|
||||
"none, url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
|
||||
"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
|
||||
].concat(validGradientAndElementValues),
|
||||
invalid_values: [
|
||||
].concat(invalidGradientAndElementValues),
|
||||
unbalanced_values: [
|
||||
].concat(unbalancedGradientAndElementValues)
|
||||
};
|
||||
gCSSProperties["mask-mode"] = {
|
||||
domProp: "maskMode",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "match-source" ],
|
||||
other_values: [ "alpha", "luminance", "match-source, match-source", "match-source, alpha", "alpha, luminance, match-source"],
|
||||
invalid_values: [ "match-source match-source", "alpha match-source" ]
|
||||
};
|
||||
gCSSProperties["mask-composite"] = {
|
||||
domProp: "maskComposite",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "add" ],
|
||||
other_values: [ "subtract", "intersect", "exclude", "add, add", "subtract, intersect", "subtract, subtract, add"],
|
||||
invalid_values: [ "add subtract", "intersect exclude" ]
|
||||
};
|
||||
gCSSProperties["mask-origin"] = {
|
||||
domProp: "maskOrigin",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "border-box" ],
|
||||
other_values: [ "padding-box", "content-box", "fill-box", "stroke-box", "view-box", "border-box, padding-box", "padding-box, padding-box, padding-box", "border-box, border-box" ],
|
||||
invalid_values: [ "padding-box padding-box", "no-clip", "margin-box" ]
|
||||
};
|
||||
gCSSProperties["mask-position"] = {
|
||||
domProp: "maskPosition",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
initial_values: [ "top 0% left 0%", "top 0% left", "top left", "left top", "0% 0%", "0% top", "left 0%" ],
|
||||
other_values: [ "top", "left", "right", "bottom", "center", "center bottom", "bottom center", "center right", "right center", "center top", "top center", "center left", "left center", "right bottom", "bottom right", "50%", "top left, top left", "top left, top right", "top right, top left", "left top, 0% 0%", "10% 20%, 30%, 40%", "top left, bottom right", "right bottom, left top", "0%", "0px", "30px", "0%, 10%, 20%, 30%", "top, top, top, top, top",
|
||||
"calc(20px)",
|
||||
"calc(20px) 10px",
|
||||
"10px calc(20px)",
|
||||
"calc(20px) 25%",
|
||||
"25% calc(20px)",
|
||||
"calc(20px) calc(20px)",
|
||||
"calc(20px + 1em) calc(20px / 2)",
|
||||
"calc(20px + 50%) calc(50% - 10px)",
|
||||
"calc(-20px) calc(-50%)",
|
||||
"calc(-20%) calc(-50%)",
|
||||
"0px 0px",
|
||||
"right 20px top 60px",
|
||||
"right 20px bottom 60px",
|
||||
"left 20px top 60px",
|
||||
"left 20px bottom 60px",
|
||||
"right -50px top -50px",
|
||||
"left -50px bottom -50px",
|
||||
"right 20px top -50px",
|
||||
"right -20px top 50px",
|
||||
"right 3em bottom 10px",
|
||||
"bottom 3em right 10px",
|
||||
"top 3em right 10px",
|
||||
"left 15px",
|
||||
"10px top",
|
||||
"left top 15px",
|
||||
"left 10px top",
|
||||
"left 20%",
|
||||
"right 20%"
|
||||
],
|
||||
subproperties: [ "mask-position-x", "mask-position-y" ],
|
||||
invalid_values: [ "center 10px center 4px", "center 10px center",
|
||||
"top 20%", "bottom 20%", "50% left", "top 50%",
|
||||
"50% bottom 10%", "right 10% 50%", "left right",
|
||||
"top bottom", "left 10% right",
|
||||
"top 20px bottom 20px", "left left",
|
||||
"0px calc(0px + rubbish)"],
|
||||
};
|
||||
gCSSProperties["mask-position-x"] = {
|
||||
domProp: "maskPositionX",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "left", "0%" ],
|
||||
other_values: [ "right", "center", "50%", "center, center", "center, right", "right, center", "center, 50%", "10%, 20%, 40%", "1px", "30px", "50%, 10%, 20%, 30%", "center, center, center, center, center",
|
||||
"calc(20px)",
|
||||
"calc(20px + 1em)",
|
||||
"calc(20px / 2)",
|
||||
"calc(20px + 50%)",
|
||||
"calc(50% - 10px)",
|
||||
"calc(-20px)",
|
||||
"calc(-50%)",
|
||||
"calc(-20%)",
|
||||
"right 20px",
|
||||
"left 20px",
|
||||
"right -50px",
|
||||
"left -50px",
|
||||
"right 20px",
|
||||
"right 3em",
|
||||
],
|
||||
invalid_values: [ "center 10px", "right 10% 50%", "left right", "left left",
|
||||
"bottom 20px", "top 10%", "bottom 3em",
|
||||
"top", "bottom", "top, top", "top, bottom", "bottom, top", "top, 0%", "top, top, top, top, top",
|
||||
"calc(0px + rubbish)", "center 0%"],
|
||||
};
|
||||
gCSSProperties["mask-position-y"] = {
|
||||
domProp: "maskPositionY",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "top", "0%" ],
|
||||
other_values: [ "bottom", "center", "50%", "center, center", "center, bottom", "bottom, center", "center, 0%", "10%, 20%, 40%", "1px", "30px", "50%, 10%, 20%, 30%", "center, center, center, center, center",
|
||||
"calc(20px)",
|
||||
"calc(20px + 1em)",
|
||||
"calc(20px / 2)",
|
||||
"calc(20px + 50%)",
|
||||
"calc(50% - 10px)",
|
||||
"calc(-20px)",
|
||||
"calc(-50%)",
|
||||
"calc(-20%)",
|
||||
"bottom 20px",
|
||||
"top 20px",
|
||||
"bottom -50px",
|
||||
"top -50px",
|
||||
"bottom 20px",
|
||||
"bottom 3em",
|
||||
],
|
||||
invalid_values: [ "center 10px", "bottom 10% 50%", "top bottom", "top top",
|
||||
"right 20px", "left 10%", "right 3em",
|
||||
"left", "right", "left, left", "left, right", "right, left", "left, 0%", "left, left, left, left, left",
|
||||
"calc(0px + rubbish)", "center 0%"],
|
||||
};
|
||||
gCSSProperties["mask-repeat"] = {
|
||||
domProp: "maskRepeat",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "repeat", "repeat repeat" ],
|
||||
other_values: [ "repeat-x", "repeat-y", "no-repeat",
|
||||
"repeat-x, repeat-x",
|
||||
"repeat, no-repeat",
|
||||
"repeat-y, no-repeat, repeat-y",
|
||||
"repeat, repeat, repeat",
|
||||
"repeat no-repeat",
|
||||
"no-repeat repeat",
|
||||
"no-repeat no-repeat",
|
||||
"repeat no-repeat",
|
||||
"no-repeat no-repeat, no-repeat no-repeat",
|
||||
],
|
||||
invalid_values: [ "repeat repeat repeat",
|
||||
"repeat-x repeat-y",
|
||||
"repeat repeat-x",
|
||||
"repeat repeat-y",
|
||||
"repeat-x repeat",
|
||||
"repeat-y repeat" ]
|
||||
};
|
||||
gCSSProperties["mask-size"] = {
|
||||
domProp: "maskSize",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "auto", "auto auto" ],
|
||||
other_values: [ "contain", "cover", "100px auto", "auto 100px", "100% auto", "auto 100%", "25% 50px", "3em 40%",
|
||||
"calc(20px)",
|
||||
"calc(20px) 10px",
|
||||
"10px calc(20px)",
|
||||
"calc(20px) 25%",
|
||||
"25% calc(20px)",
|
||||
"calc(20px) calc(20px)",
|
||||
"calc(20px + 1em) calc(20px / 2)",
|
||||
"calc(20px + 50%) calc(50% - 10px)",
|
||||
"calc(-20px) calc(-50%)",
|
||||
"calc(-20%) calc(-50%)"
|
||||
],
|
||||
invalid_values: [ "contain contain", "cover cover", "cover auto", "auto cover", "contain cover", "cover contain", "-5px 3px", "3px -5px", "auto -5px", "-5px auto", "5 3", "10px calc(10px + rubbish)" ]
|
||||
};
|
||||
} else {
|
||||
gCSSProperties["mask"] = {
|
||||
domProp: "mask",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_LONGHAND,
|
||||
initial_values: [ "none" ],
|
||||
other_values: [ "url(#mymask)" ],
|
||||
invalid_values: []
|
||||
};
|
||||
}
|
||||
|
||||
if (IsCSSPropertyPrefEnabled("layout.css.prefixes.webkit")) {
|
||||
gCSSProperties["-webkit-animation"] = {
|
||||
domProp: "webkitAnimation",
|
||||
|
@ -7944,81 +7928,78 @@ if (IsCSSPropertyPrefEnabled("layout.css.prefixes.webkit")) {
|
|||
alias_for: "-moz-user-select",
|
||||
subproperties: [ "-moz-user-select" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask"] = {
|
||||
domProp: "webkitMask",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_TRUE_SHORTHAND,
|
||||
alias_for: "mask",
|
||||
subproperties: [ "mask-clip", "mask-image", "mask-mode", "mask-origin", "mask-position", "mask-repeat", "mask-size" , "mask-composite" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-clip"] = {
|
||||
domProp: "webkitMaskClip",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-clip",
|
||||
subproperties: [ "mask-clip" ],
|
||||
};
|
||||
|
||||
if (SupportsMaskShorthand()) {
|
||||
gCSSProperties["-webkit-mask"] = {
|
||||
domProp: "webkitMask",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_TRUE_SHORTHAND,
|
||||
alias_for: "mask",
|
||||
subproperties: [ "mask-clip", "mask-image", "mask-mode", "mask-origin", "mask-position", "mask-repeat", "mask-size" , "mask-composite" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-clip"] = {
|
||||
domProp: "webkitMaskClip",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-clip",
|
||||
subproperties: [ "mask-clip" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-composite"] = {
|
||||
domProp: "webkitMaskComposite",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-composite",
|
||||
subproperties: [ "mask-composite" ],
|
||||
};
|
||||
|
||||
gCSSProperties["-webkit-mask-composite"] = {
|
||||
domProp: "webkitMaskComposite",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-composite",
|
||||
subproperties: [ "mask-composite" ],
|
||||
};
|
||||
|
||||
gCSSProperties["-webkit-mask-image"] = {
|
||||
domProp: "webkitMaskImage",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-image",
|
||||
subproperties: [ "mask-image" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-origin"] = {
|
||||
domProp: "webkitMaskOrigin",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-origin",
|
||||
subproperties: [ "mask-origin" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-position"] = {
|
||||
domProp: "webkitMaskPosition",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-position",
|
||||
subproperties: [ "mask-position" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-position-x"] = {
|
||||
domProp: "webkitMaskPositionX",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-position-x",
|
||||
subproperties: [ "mask-position-x" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-position-y"] = {
|
||||
domProp: "webkitMaskPositionY",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-position-y",
|
||||
subproperties: [ "mask-position-y" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-repeat"] = {
|
||||
domProp: "webkitMaskRepeat",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-repeat",
|
||||
subproperties: [ "mask-repeat" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-size"] = {
|
||||
domProp: "webkitMaskSize",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-size",
|
||||
subproperties: [ "mask-size" ],
|
||||
};
|
||||
}
|
||||
gCSSProperties["-webkit-mask-image"] = {
|
||||
domProp: "webkitMaskImage",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-image",
|
||||
subproperties: [ "mask-image" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-origin"] = {
|
||||
domProp: "webkitMaskOrigin",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-origin",
|
||||
subproperties: [ "mask-origin" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-position"] = {
|
||||
domProp: "webkitMaskPosition",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-position",
|
||||
subproperties: [ "mask-position" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-position-x"] = {
|
||||
domProp: "webkitMaskPositionX",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-position-x",
|
||||
subproperties: [ "mask-position-x" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-position-y"] = {
|
||||
domProp: "webkitMaskPositionY",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-position-y",
|
||||
subproperties: [ "mask-position-y" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-repeat"] = {
|
||||
domProp: "webkitMaskRepeat",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-repeat",
|
||||
subproperties: [ "mask-repeat" ],
|
||||
};
|
||||
gCSSProperties["-webkit-mask-size"] = {
|
||||
domProp: "webkitMaskSize",
|
||||
inherited: false,
|
||||
type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
|
||||
alias_for: "mask-size",
|
||||
subproperties: [ "mask-size" ],
|
||||
};
|
||||
}
|
||||
|
||||
if (IsCSSPropertyPrefEnabled("layout.css.prefixes.gradients")) {
|
||||
|
@ -8040,23 +8021,21 @@ if (IsCSSPropertyPrefEnabled("layout.css.prefixes.gradients")) {
|
|||
"-moz-radial-gradient(10% bottom, 30px, 20px 20px, 10px, from(#ffffff), to(black)) scroll no-repeat",
|
||||
"-moz-linear-gradient(10px 10px, 20px 20px, from(red), to(blue)) repeat",
|
||||
);
|
||||
if (SupportsMaskShorthand()) {
|
||||
gCSSProperties["mask"].other_values.push(
|
||||
"-moz-radial-gradient(10% bottom, #ffffff, black) add no-repeat",
|
||||
"-moz-linear-gradient(10px 10px -45deg, red, blue) repeat",
|
||||
"-moz-linear-gradient(10px 10px -0.125turn, red, blue) repeat",
|
||||
"-moz-repeating-radial-gradient(10% bottom, #ffffff, black) add no-repeat",
|
||||
"-moz-repeating-linear-gradient(10px 10px -45deg, red, blue) repeat",
|
||||
"url(404.png), -moz-linear-gradient(20px 20px -45deg, blue, green), -moz-element(#a) alpha",
|
||||
);
|
||||
gCSSProperties["mask"].invalid_values.push(
|
||||
/* no quirks mode colors */
|
||||
"-moz-radial-gradient(10% bottom, ffffff, black) add no-repeat",
|
||||
/* no quirks mode lengths */
|
||||
"-moz-linear-gradient(10 10px -45deg, red, blue) repeat",
|
||||
"-moz-linear-gradient(10px 10 -45deg, red, blue) repeat",
|
||||
);
|
||||
}
|
||||
gCSSProperties["mask"].other_values.push(
|
||||
"-moz-radial-gradient(10% bottom, #ffffff, black) add no-repeat",
|
||||
"-moz-linear-gradient(10px 10px -45deg, red, blue) repeat",
|
||||
"-moz-linear-gradient(10px 10px -0.125turn, red, blue) repeat",
|
||||
"-moz-repeating-radial-gradient(10% bottom, #ffffff, black) add no-repeat",
|
||||
"-moz-repeating-linear-gradient(10px 10px -45deg, red, blue) repeat",
|
||||
"url(404.png), -moz-linear-gradient(20px 20px -45deg, blue, green), -moz-element(#a) alpha",
|
||||
);
|
||||
gCSSProperties["mask"].invalid_values.push(
|
||||
/* no quirks mode colors */
|
||||
"-moz-radial-gradient(10% bottom, ffffff, black) add no-repeat",
|
||||
/* no quirks mode lengths */
|
||||
"-moz-linear-gradient(10 10px -45deg, red, blue) repeat",
|
||||
"-moz-linear-gradient(10px 10 -45deg, red, blue) repeat",
|
||||
);
|
||||
}
|
||||
|
||||
if (IsCSSPropertyPrefEnabled("layout.css.unset-value.enabled")) {
|
||||
|
|
|
@ -243,10 +243,6 @@ var noframe_container = document.getElementById("content");
|
|||
})();
|
||||
|
||||
(function test_bug_1235015() {
|
||||
if (!("maskImage" in document.documentElement.style)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// "masks" object contains non-initial mask longhand values.
|
||||
var emptyMasks = {
|
||||
// More then one <mask-reference>, or any mask-image value other then
|
||||
|
|
|
@ -194,6 +194,30 @@ var supported_properties = {
|
|||
"margin-top": [ test_length_transition, test_percent_transition,
|
||||
test_length_percent_calc_transition,
|
||||
test_length_unclamped, test_percent_unclamped ],
|
||||
"mask-position": [ test_background_position_transition,
|
||||
// FIXME: We don't currently test clamping,
|
||||
// since mask-position uses calc() as
|
||||
// an intermediate form.
|
||||
/* test_length_percent_pair_unclamped */ ],
|
||||
"mask-position-x": [ test_background_position_coord_transition,
|
||||
test_length_transition,
|
||||
test_percent_transition,
|
||||
// FIXME: We don't currently test clamping,
|
||||
// since background-position-x uses calc() as
|
||||
// an intermediate form.
|
||||
/* test_length_percent_pair_unclamped */ ],
|
||||
"mask-position-y": [ test_background_position_coord_transition,
|
||||
test_length_transition,
|
||||
test_percent_transition,
|
||||
// FIXME: We don't currently test clamping,
|
||||
// since background-position-y uses calc() as
|
||||
// an intermediate form.
|
||||
/* test_length_percent_pair_unclamped */ ],
|
||||
"mask-size": [ test_background_size_transition,
|
||||
// FIXME: We don't currently test clamping,
|
||||
// since mask-size uses calc() as an
|
||||
// intermediate form.
|
||||
/* test_length_percent_pair_clamped */ ],
|
||||
"max-height": [ test_length_transition, test_percent_transition,
|
||||
test_length_clamped, test_percent_clamped ],
|
||||
"max-width": [ test_length_transition, test_percent_transition,
|
||||
|
@ -291,33 +315,6 @@ if (SpecialPowers.getBoolPref("layout.css.shape-outside.enabled")) {
|
|||
[ test_basic_shape_or_url_transition ];
|
||||
}
|
||||
|
||||
if (SupportsMaskShorthand()) {
|
||||
supported_properties["mask-position"] = [ test_background_position_transition,
|
||||
// FIXME: We don't currently test clamping,
|
||||
// since mask-position uses calc() as
|
||||
// an intermediate form.
|
||||
/* test_length_percent_pair_unclamped */ ];
|
||||
supported_properties["mask-position-x"] = [ test_background_position_coord_transition,
|
||||
test_length_transition,
|
||||
test_percent_transition,
|
||||
// FIXME: We don't currently test clamping,
|
||||
// since background-position-x uses calc() as
|
||||
// an intermediate form.
|
||||
/* test_length_percent_pair_unclamped */ ];
|
||||
supported_properties["mask-position-y"] = [ test_background_position_coord_transition,
|
||||
test_length_transition,
|
||||
test_percent_transition,
|
||||
// FIXME: We don't currently test clamping,
|
||||
// since background-position-y uses calc() as
|
||||
// an intermediate form.
|
||||
/* test_length_percent_pair_unclamped */ ];
|
||||
supported_properties["mask-size"] = [ test_background_size_transition,
|
||||
// FIXME: We don't currently test clamping,
|
||||
// since mask-size uses calc() as an
|
||||
// intermediate form.
|
||||
/* test_length_percent_pair_clamped */ ];
|
||||
}
|
||||
|
||||
if (IsCSSPropertyPrefEnabled("layout.css.font-variations.enabled")) {
|
||||
supported_properties["font-variation-settings"] = [ test_font_variations_transition ];
|
||||
}
|
||||
|
|
|
@ -512,15 +512,7 @@ nsSVGUtils::DetermineMaskUsage(nsIFrame* aFrame, bool aHandleOpacity,
|
|||
|
||||
nsTArray<nsSVGMaskFrame*> maskFrames = effectProperties.GetMaskFrames();
|
||||
|
||||
#ifdef MOZ_ENABLE_MASK_AS_SHORTHAND
|
||||
aUsage.shouldGenerateMaskLayer = (maskFrames.Length() > 0);
|
||||
#else
|
||||
// Since we do not support image mask so far, we should treat any
|
||||
// unresolvable mask as no mask. Otherwise, any object with a valid image
|
||||
// mask, e.g. url("xxx.png"), will become invisible just because we can not
|
||||
// handle image mask correctly. (See bug 1294171)
|
||||
aUsage.shouldGenerateMaskLayer = maskFrames.Length() == 1 && maskFrames[0];
|
||||
#endif
|
||||
|
||||
nsSVGClipPathFrame *clipPathFrame = effectProperties.GetClipPathFrame();
|
||||
MOZ_ASSERT(!clipPathFrame ||
|
||||
|
|
|
@ -136,6 +136,13 @@
|
|||
<item>wifi</item>
|
||||
<item>disabled</item>
|
||||
</string-array>
|
||||
<!-- This value is similar to config_longPressVibePattern in android frameworks/base/core/res/res/values/config.xml-->
|
||||
<integer-array name="long_press_vibrate_msec">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>20</item>
|
||||
<item>21</item>
|
||||
</integer-array>
|
||||
<!-- browser.image_blocking -->
|
||||
<string-array name="pref_browser_image_blocking_entries">
|
||||
<item>@string/pref_tap_to_load_images_enabled</item>
|
||||
|
|
|
@ -49,7 +49,6 @@ import android.support.v4.view.MenuItemCompat;
|
|||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.InputDevice;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
|
@ -699,7 +698,7 @@ public class BrowserApp extends GeckoApp
|
|||
|
||||
final TabHistoryFragment fragment = TabHistoryFragment.newInstance(historyPageList, toIndex);
|
||||
final FragmentManager fragmentManager = getSupportFragmentManager();
|
||||
GeckoAppShell.getHapticFeedbackDelegate().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
|
||||
GeckoAppShell.vibrateOnHapticFeedbackEnabled(getResources().getIntArray(R.array.long_press_vibrate_msec));
|
||||
fragment.show(R.id.tab_history_panel, fragmentManager.beginTransaction(), TAB_HISTORY_FRAGMENT_TAG);
|
||||
}
|
||||
});
|
||||
|
@ -1659,6 +1658,7 @@ public class BrowserApp extends GeckoApp
|
|||
mLayerView.getDynamicToolbarAnimator().addMetricsListener(this);
|
||||
mLayerView.getDynamicToolbarAnimator().setToolbarChromeProxy(this);
|
||||
}
|
||||
mDynamicToolbar.setLayerView(mLayerView);
|
||||
setDynamicToolbarEnabled(mDynamicToolbar.isEnabled());
|
||||
|
||||
// Intercept key events for gamepad shortcuts
|
||||
|
|
|
@ -673,7 +673,7 @@ public abstract class GeckoApp extends GeckoActivity
|
|||
GeckoAccessibility.updateAccessibilitySettings(this);
|
||||
|
||||
} else if ("Accessibility:Event".equals(event)) {
|
||||
GeckoAccessibility.sendAccessibilityEvent(mLayerView, message);
|
||||
GeckoAccessibility.sendAccessibilityEvent(message);
|
||||
|
||||
} else if ("Bookmark:Insert".equals(event)) {
|
||||
final BrowserDB db = BrowserDB.from(getProfile());
|
||||
|
|
|
@ -57,8 +57,7 @@ import java.io.File;
|
|||
import java.lang.reflect.Method;
|
||||
import java.util.UUID;
|
||||
|
||||
public class GeckoApplication extends Application
|
||||
implements HapticFeedbackDelegate {
|
||||
public class GeckoApplication extends Application {
|
||||
private static final String LOG_TAG = "GeckoApplication";
|
||||
private static final String MEDIA_DECODING_PROCESS_CRASH = "MEDIA_DECODING_PROCESS_CRASH";
|
||||
|
||||
|
@ -230,7 +229,6 @@ public class GeckoApplication extends Application
|
|||
|
||||
final Context context = getApplicationContext();
|
||||
GeckoAppShell.setApplicationContext(context);
|
||||
GeckoAppShell.setHapticFeedbackDelegate(this);
|
||||
GeckoAppShell.setGeckoInterface(new GeckoAppShell.GeckoInterface() {
|
||||
@Override
|
||||
public boolean openUriExternal(final String targetURI, final String mimeType,
|
||||
|
@ -636,13 +634,4 @@ public class GeckoApplication extends Application
|
|||
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
@Override // HapticFeedbackDelegate
|
||||
public void performHapticFeedback(final int effect) {
|
||||
final Activity currentActivity =
|
||||
GeckoActivityMonitor.getInstance().getCurrentActivity();
|
||||
if (currentActivity != null) {
|
||||
currentActivity.getWindow().getDecorView().performHapticFeedback(effect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,12 +5,15 @@
|
|||
|
||||
package org.mozilla.gecko.activitystream;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Resources;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.mozilla.gecko.R;
|
||||
import org.mozilla.gecko.activitystream.homepanel.ActivityStreamPanel;
|
||||
import org.mozilla.gecko.db.BrowserContract;
|
||||
import org.mozilla.gecko.activitystream.homepanel.model.TopSite;
|
||||
|
||||
|
@ -30,6 +33,7 @@ public class ActivityStreamTelemetry {
|
|||
public final static String COUNT = "count";
|
||||
public final static String PAGE_NUMBER = "page_number";
|
||||
public final static String INTERACTION = "interaction";
|
||||
public final static String AS_USER_PREFERENCES = "as-user-preferences";
|
||||
|
||||
// Values
|
||||
public final static String TYPE_TOPSITES = "topsites";
|
||||
|
@ -55,6 +59,40 @@ public class ActivityStreamTelemetry {
|
|||
public final static String INTERACTION_LONG_CLICK = "long_click";
|
||||
}
|
||||
|
||||
/**
|
||||
* AS_USER_PREFERENCES
|
||||
*
|
||||
* NB: Additional pref values should be (unique) powers of 2
|
||||
* We skip 1 and 2 to be consistent with Desktop, because those prefs are not used in Firefox for Android.
|
||||
**/
|
||||
private final static int POCKET_ENABLED_VALUE = 4;
|
||||
private final static int VISITED_ENABLED_VALUE = 8;
|
||||
private final static int BOOKMARKED_ENABLED_VALUE = 16;
|
||||
|
||||
/**
|
||||
* Calculates the bit-packed value of the user's Activity Stream preferences (e.g. enabled/disabled sections).
|
||||
*
|
||||
* @param sharedPreferences SharedPreferences of this profile
|
||||
* @return bit-packed value of the user's AS preferences, which is the sum of the values of the enabled preferences.
|
||||
*/
|
||||
public static int getASUserPreferencesValue(final SharedPreferences sharedPreferences, final Resources res) {
|
||||
int bitPackedPrefValue = 0;
|
||||
|
||||
if (sharedPreferences.getBoolean(ActivityStreamPanel.PREF_POCKET_ENABLED, res.getBoolean(R.bool.pref_activitystream_pocket_enabled_default))) {
|
||||
bitPackedPrefValue += POCKET_ENABLED_VALUE;
|
||||
}
|
||||
|
||||
if (sharedPreferences.getBoolean(ActivityStreamPanel.PREF_VISITED_ENABLED, res.getBoolean(R.bool.pref_activitystream_visited_enabled_default))) {
|
||||
bitPackedPrefValue += VISITED_ENABLED_VALUE;
|
||||
}
|
||||
|
||||
if (sharedPreferences.getBoolean(ActivityStreamPanel.PREF_BOOKMARKS_ENABLED, res.getBoolean(R.bool.pref_activitystream_recentbookmarks_enabled_default))) {
|
||||
bitPackedPrefValue += BOOKMARKED_ENABLED_VALUE;
|
||||
}
|
||||
|
||||
return bitPackedPrefValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* A helper class used for composing an 'extras' field. It encapsulates a holder of "global"
|
||||
* key/value pairs which will be present in every 'extras' constructed by this class, and a
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
package org.mozilla.gecko.activitystream.homepanel;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
|
@ -18,7 +17,6 @@ import org.mozilla.gecko.GeckoSharedPrefs;
|
|||
import org.mozilla.gecko.R;
|
||||
import org.mozilla.gecko.Telemetry;
|
||||
import org.mozilla.gecko.TelemetryContract;
|
||||
import org.mozilla.gecko.activitystream.ActivityStream;
|
||||
import org.mozilla.gecko.home.HomeFragment;
|
||||
|
||||
/**
|
||||
|
@ -51,7 +49,7 @@ public class ActivityStreamHomeFragment
|
|||
|| TextUtils.equals(s, ActivityStreamPanel.PREF_POCKET_ENABLED);
|
||||
|
||||
if (shouldReload) {
|
||||
activityStreamPanel.reload(getLoaderManager());
|
||||
activityStreamPanel.reload(getLoaderManager(), sharedPreferences, this.getResources());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -89,6 +89,15 @@ public class ActivityStreamPanel extends FrameLayout {
|
|||
ActivityStreamTelemetry.Contract.FX_ACCOUNT_PRESENT,
|
||||
FirefoxAccounts.firefoxAccountsExist(context)
|
||||
);
|
||||
|
||||
updateSharedPreferencesGlobalExtras(sharedPreferences, context.getResources());
|
||||
}
|
||||
|
||||
private void updateSharedPreferencesGlobalExtras(final SharedPreferences sharedPreferences, final Resources res) {
|
||||
ActivityStreamTelemetry.Extras.setGlobal(
|
||||
ActivityStreamTelemetry.Contract.AS_USER_PREFERENCES,
|
||||
ActivityStreamTelemetry.getASUserPreferencesValue(sharedPreferences, res)
|
||||
);
|
||||
}
|
||||
|
||||
void setOnUrlOpenListeners(HomePager.OnUrlOpenListener onUrlOpenListener, HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
|
||||
|
@ -113,9 +122,11 @@ public class ActivityStreamPanel extends FrameLayout {
|
|||
adapter.swapTopSitesCursor(null);
|
||||
}
|
||||
|
||||
public void reload(LoaderManager lm) {
|
||||
public void reload(LoaderManager lm, SharedPreferences sharedPreferences, Resources res) {
|
||||
adapter.clearAndInit();
|
||||
|
||||
updateSharedPreferencesGlobalExtras(sharedPreferences, res);
|
||||
|
||||
// Destroy loaders so they don't restart loading when returning.
|
||||
lm.destroyLoader(LOADER_ID_HIGHLIGHTS);
|
||||
lm.destroyLoader(LOADER_ID_POCKET);
|
||||
|
|
|
@ -17,7 +17,6 @@ import android.content.Intent;
|
|||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.util.SparseArray;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
|
@ -260,8 +259,7 @@ public class GeckoMenu extends ListView
|
|||
@Override
|
||||
public boolean onLongClick(View view) {
|
||||
if (handleMenuItemLongClick(menuItem)) {
|
||||
GeckoAppShell.getHapticFeedbackDelegate().performHapticFeedback(
|
||||
HapticFeedbackConstants.LONG_PRESS);
|
||||
GeckoAppShell.vibrateOnHapticFeedbackEnabled(getResources().getIntArray(R.array.long_press_vibrate_msec));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -278,8 +276,7 @@ public class GeckoMenu extends ListView
|
|||
@Override
|
||||
public boolean onLongClick(View view) {
|
||||
if (handleMenuItemLongClick(menuItem)) {
|
||||
GeckoAppShell.getHapticFeedbackDelegate().performHapticFeedback(
|
||||
HapticFeedbackConstants.LONG_PRESS);
|
||||
GeckoAppShell.vibrateOnHapticFeedbackEnabled(getResources().getIntArray(R.array.long_press_vibrate_msec));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -415,7 +415,6 @@ gvjar.sources += [geckoview_source_dir + 'java/org/mozilla/gecko/' + x
|
|||
'gfx/SurfaceTextureListener.java',
|
||||
'gfx/ViewTransform.java',
|
||||
'gfx/VsyncSource.java',
|
||||
'HapticFeedbackDelegate.java',
|
||||
'InputConnectionListener.java',
|
||||
'InputMethods.java',
|
||||
'media/AsyncCodec.java',
|
||||
|
|
|
@ -18,6 +18,14 @@ A concept of a "global" extra is meant to support recording certain context info
|
|||
``fx_account_present``, values: true, false
|
||||
Indicates if Firefox Account is currently enabled.
|
||||
|
||||
``as_user_preferences``, values: (bit-packed) value of preferences enabled
|
||||
Each preference is assigned a value that is a unique power of 2, and value of as_user_preferences is the sum of all enabled preferences values.
|
||||
|
||||
The SharedPreferences preferences measured (with their value) are:
|
||||
pref_activitystream_pocket_enabled: 4
|
||||
pref_activitystream_visited_enabled: 8
|
||||
pref_activitystream_recentbookmarks_enabled: 16
|
||||
|
||||
Extra information available for various event types
|
||||
===================================================
|
||||
Action position
|
||||
|
@ -160,7 +168,7 @@ Full Examples
|
|||
=============
|
||||
Following examples of events are here to provide a better feel for the overall shape of telemetry data being recorded.
|
||||
|
||||
1) User with an active Firefox Account clicked on a menu item for a third highlight ("visited"):
|
||||
1) User with an active Firefox Account clicked on a menu item for a third highlight ("visited") [prefs enabled: top-stories, bookmarks, visited] :
|
||||
::
|
||||
|
||||
session="activitystream.1"
|
||||
|
@ -168,12 +176,13 @@ Following examples of events are here to provide a better feel for the overall s
|
|||
method="contextmenu"
|
||||
extras="{
|
||||
'fx_account_present': true,
|
||||
'as_user_preferences': 28,
|
||||
'source_type': 'highlights',
|
||||
'source_subtype': 'visited',
|
||||
'action_position': 2
|
||||
}"
|
||||
|
||||
2) User with no active Firefox Account clicked on a second highlight (recent bookmark), with total of 7 highlights being displayed:
|
||||
2) User with no active Firefox Account clicked on a second highlight (recent bookmark), with total of 7 highlights being displayed [prefs enabled: bookmarks] :
|
||||
::
|
||||
|
||||
session="activitystream.1"
|
||||
|
@ -181,13 +190,14 @@ Following examples of events are here to provide a better feel for the overall s
|
|||
method="listitem"
|
||||
extras="{
|
||||
'fx_account_present': false,
|
||||
'as_user_preferences': 16,
|
||||
'source_type': 'highlights',
|
||||
'source_subtype': 'bookmarked'
|
||||
'action_position': 1,
|
||||
'count': 7
|
||||
}"
|
||||
|
||||
3) User with an active Firefox Account clicked on a third pinned top site:
|
||||
3) User with an active Firefox Account clicked on a third pinned top site [prefs enabled: (none)] :
|
||||
::
|
||||
|
||||
session="activitystream.1"
|
||||
|
@ -195,13 +205,14 @@ Following examples of events are here to provide a better feel for the overall s
|
|||
method="listitem"
|
||||
extras="{
|
||||
'fx_account_present': true,
|
||||
'as_user_preferences': 0,
|
||||
'source_type': 'topsites',
|
||||
'source_subtype': 'pinned',
|
||||
'action_position': 2,
|
||||
'page_number': 0
|
||||
}"
|
||||
|
||||
4) User with an active Firefox Account clicked on a "share" context menu item, which was displayed for a regular top site number 6:
|
||||
4) User with an active Firefox Account clicked on a "share" context menu item, which was displayed for a regular top site number 6 [prefs enabled: visited, bookmarks] :
|
||||
::
|
||||
|
||||
session="activitystream.1"
|
||||
|
@ -209,6 +220,7 @@ Following examples of events are here to provide a better feel for the overall s
|
|||
method="contextmenu"
|
||||
extras="{
|
||||
'fx_account_present': true,
|
||||
'as_user_preferences': 24,
|
||||
'source_type': 'topsites',
|
||||
'source_subtype': 'top',
|
||||
'item': 'share',
|
||||
|
|
|
@ -7,6 +7,8 @@ package org.mozilla.gecko;
|
|||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.mozilla.gecko.EventDispatcher;
|
||||
import org.mozilla.gecko.gfx.LayerView;
|
||||
import org.mozilla.gecko.util.GeckoBundle;
|
||||
import org.mozilla.gecko.util.ThreadUtils;
|
||||
|
||||
|
@ -108,8 +110,7 @@ public class GeckoAccessibility {
|
|||
return sEnabled;
|
||||
}
|
||||
|
||||
public static void sendAccessibilityEvent(final GeckoView view,
|
||||
final GeckoBundle message) {
|
||||
public static void sendAccessibilityEvent(final GeckoBundle message) {
|
||||
if (!sEnabled)
|
||||
return;
|
||||
|
||||
|
@ -119,11 +120,10 @@ public class GeckoAccessibility {
|
|||
return;
|
||||
}
|
||||
|
||||
sendAccessibilityEvent(view, message, eventType);
|
||||
sendAccessibilityEvent(message, eventType);
|
||||
}
|
||||
|
||||
public static void sendAccessibilityEvent(final GeckoView view, final GeckoBundle message,
|
||||
final int eventType) {
|
||||
public static void sendAccessibilityEvent(final GeckoBundle message, final int eventType) {
|
||||
if (!sEnabled)
|
||||
return;
|
||||
|
||||
|
@ -148,6 +148,10 @@ public class GeckoAccessibility {
|
|||
} else {
|
||||
// In Jelly Bean we populate an AccessibilityNodeInfo with the minimal amount of data to have
|
||||
// it work with TalkBack.
|
||||
final LayerView view = GeckoAppShell.getLayerView();
|
||||
if (view == null)
|
||||
return;
|
||||
|
||||
if (sVirtualCursorNode == null) {
|
||||
sVirtualCursorNode = AccessibilityNodeInfo.obtain(view, VIRTUAL_CURSOR_POSITION);
|
||||
}
|
||||
|
@ -262,12 +266,7 @@ public class GeckoAccessibility {
|
|||
AccessibilityNodeProvider mAccessibilityNodeProvider;
|
||||
|
||||
@Override
|
||||
public AccessibilityNodeProvider getAccessibilityNodeProvider(final View hostView) {
|
||||
if (!(hostView instanceof GeckoView)) {
|
||||
return super.getAccessibilityNodeProvider(hostView);
|
||||
}
|
||||
final GeckoView host = (GeckoView) hostView;
|
||||
|
||||
public AccessibilityNodeProvider getAccessibilityNodeProvider(final View host) {
|
||||
if (mAccessibilityNodeProvider == null)
|
||||
// The accessibility node structure for web content consists of 3 LayerView child nodes:
|
||||
// 1. VIRTUAL_ENTRY_POINT_BEFORE: Represents the entry point before the LayerView.
|
||||
|
@ -320,7 +319,7 @@ public class GeckoAccessibility {
|
|||
// The accessibility focus is permanently on the middle node, VIRTUAL_CURSOR_POSITION.
|
||||
// When we enter the view forward or backward we just ask Gecko to get focus, keeping the current position.
|
||||
if (virtualViewId == VIRTUAL_CURSOR_POSITION && sHoverEnter != null) {
|
||||
GeckoAccessibility.sendAccessibilityEvent(host, sHoverEnter, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
|
||||
GeckoAccessibility.sendAccessibilityEvent(sHoverEnter, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
|
||||
} else {
|
||||
final GeckoBundle data = new GeckoBundle(1);
|
||||
data.putBoolean("gainFocus", true);
|
||||
|
|
|
@ -28,6 +28,7 @@ import org.mozilla.gecko.annotation.JNITarget;
|
|||
import org.mozilla.gecko.annotation.RobocopTarget;
|
||||
import org.mozilla.gecko.annotation.WrapForJNI;
|
||||
import org.mozilla.gecko.gfx.BitmapUtils;
|
||||
import org.mozilla.gecko.gfx.LayerView;
|
||||
import org.mozilla.gecko.permissions.Permissions;
|
||||
import org.mozilla.gecko.process.GeckoProcessManager;
|
||||
import org.mozilla.gecko.util.HardwareCodecCapabilityUtils;
|
||||
|
@ -221,8 +222,21 @@ public class GeckoAppShell
|
|||
@WrapForJNI(dispatchTo = "gecko")
|
||||
public static native void notifyUriVisited(String uri);
|
||||
|
||||
private static LayerView sLayerView;
|
||||
private static Rect sScreenSize;
|
||||
|
||||
public static void setLayerView(LayerView lv) {
|
||||
if (sLayerView == lv) {
|
||||
return;
|
||||
}
|
||||
sLayerView = lv;
|
||||
}
|
||||
|
||||
@RobocopTarget
|
||||
public static LayerView getLayerView() {
|
||||
return sLayerView;
|
||||
}
|
||||
|
||||
@WrapForJNI(stubName = "NotifyObservers", dispatchTo = "gecko")
|
||||
private static native void nativeNotifyObservers(String topic, String data);
|
||||
|
||||
|
@ -367,8 +381,7 @@ public class GeckoAppShell
|
|||
LocationListener,
|
||||
NotificationListener,
|
||||
ScreenOrientationDelegate,
|
||||
WakeLockDelegate,
|
||||
HapticFeedbackDelegate {
|
||||
WakeLockDelegate {
|
||||
@Override
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
||||
}
|
||||
|
@ -548,22 +561,6 @@ public class GeckoAppShell
|
|||
mWakeLocks.remove(lock);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void performHapticFeedback(final int effect) {
|
||||
final int[] pattern;
|
||||
// Use default platform values.
|
||||
if (effect == HapticFeedbackConstants.KEYBOARD_TAP) {
|
||||
pattern = new int[] { 40 };
|
||||
} else if (effect == HapticFeedbackConstants.LONG_PRESS) {
|
||||
pattern = new int[] { 0, 1, 20, 21 };
|
||||
} else if (effect == HapticFeedbackConstants.VIRTUAL_KEY) {
|
||||
pattern = new int[] { 0, 10, 20, 30 };
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
vibrateOnHapticFeedbackEnabled(pattern);
|
||||
}
|
||||
}
|
||||
|
||||
private static final DefaultListeners DEFAULT_LISTENERS = new DefaultListeners();
|
||||
|
@ -571,7 +568,6 @@ public class GeckoAppShell
|
|||
private static LocationListener sLocationListener = DEFAULT_LISTENERS;
|
||||
private static NotificationListener sNotificationListener = DEFAULT_LISTENERS;
|
||||
private static WakeLockDelegate sWakeLockDelegate = DEFAULT_LISTENERS;
|
||||
private static HapticFeedbackDelegate sHapticFeedbackDelegate = DEFAULT_LISTENERS;
|
||||
|
||||
/**
|
||||
* A delegate for supporting the Screen Orientation API.
|
||||
|
@ -618,14 +614,6 @@ public class GeckoAppShell
|
|||
sWakeLockDelegate = (delegate != null) ? delegate : DEFAULT_LISTENERS;
|
||||
}
|
||||
|
||||
public static HapticFeedbackDelegate getHapticFeedbackDelegate() {
|
||||
return sHapticFeedbackDelegate;
|
||||
}
|
||||
|
||||
public static void setHapticFeedbackDelegate(final HapticFeedbackDelegate delegate) {
|
||||
sHapticFeedbackDelegate = (delegate != null) ? delegate : DEFAULT_LISTENERS;
|
||||
}
|
||||
|
||||
@WrapForJNI(calledFrom = "gecko")
|
||||
private static void enableSensor(int aSensortype) {
|
||||
final SensorManager sm = (SensorManager)
|
||||
|
@ -1014,11 +1002,10 @@ public class GeckoAppShell
|
|||
// Don't perform haptic feedback if a vibration is currently playing,
|
||||
// because the haptic feedback will nuke the vibration.
|
||||
if (!sVibrationMaybePlaying || System.nanoTime() >= sVibrationEndTime) {
|
||||
getHapticFeedbackDelegate().performHapticFeedback(
|
||||
aIsLongPress ? HapticFeedbackConstants.LONG_PRESS
|
||||
: HapticFeedbackConstants.VIRTUAL_KEY);
|
||||
sVibrationMaybePlaying = false;
|
||||
sVibrationEndTime = 0;
|
||||
LayerView layerView = getLayerView();
|
||||
layerView.performHapticFeedback(aIsLongPress ?
|
||||
HapticFeedbackConstants.LONG_PRESS :
|
||||
HapticFeedbackConstants.VIRTUAL_KEY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1036,14 +1023,10 @@ public class GeckoAppShell
|
|||
}
|
||||
|
||||
// Vibrate only if haptic feedback is enabled.
|
||||
private static void vibrateOnHapticFeedbackEnabled(int[] milliseconds) {
|
||||
public static void vibrateOnHapticFeedbackEnabled(int[] milliseconds) {
|
||||
if (Settings.System.getInt(getApplicationContext().getContentResolver(),
|
||||
Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) > 0) {
|
||||
if (milliseconds.length == 1) {
|
||||
vibrate(milliseconds[0]);
|
||||
} else {
|
||||
vibrate(convertIntToLongArray(milliseconds), -1);
|
||||
}
|
||||
vibrate(convertIntToLongArray(milliseconds), -1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1056,10 +1039,10 @@ public class GeckoAppShell
|
|||
|
||||
@WrapForJNI(calledFrom = "gecko")
|
||||
private static void vibrate(long[] pattern, int repeat) {
|
||||
// If pattern.length is odd, the last element in the pattern is a
|
||||
// If pattern.length is even, the last element in the pattern is a
|
||||
// meaningless delay, so don't include it in vibrationDuration.
|
||||
long vibrationDuration = 0;
|
||||
int iterLen = pattern.length & ~1;
|
||||
int iterLen = pattern.length - (pattern.length % 2 == 0 ? 1 : 0);
|
||||
for (int i = 0; i < iterLen; i++) {
|
||||
vibrationDuration += pattern[i];
|
||||
}
|
||||
|
@ -1570,6 +1553,21 @@ public class GeckoAppShell
|
|||
return HardwareUtils.isTablet();
|
||||
}
|
||||
|
||||
private static boolean sImeWasEnabledOnLastResize = false;
|
||||
public static void viewSizeChanged() {
|
||||
GeckoView v = (GeckoView) getLayerView();
|
||||
if (v == null) {
|
||||
return;
|
||||
}
|
||||
boolean imeIsEnabled = v.isIMEEnabled();
|
||||
if (imeIsEnabled && !sImeWasEnabledOnLastResize) {
|
||||
// The IME just came up after not being up, so let's scroll
|
||||
// to the focused input.
|
||||
EventDispatcher.getInstance().dispatch("ScrollTo:FocusedInput", null);
|
||||
}
|
||||
sImeWasEnabledOnLastResize = imeIsEnabled;
|
||||
}
|
||||
|
||||
@WrapForJNI(calledFrom = "gecko")
|
||||
private static double[] getCurrentNetworkInformation() {
|
||||
return GeckoNetworkManager.getInstance().getCurrentInformation();
|
||||
|
|
|
@ -72,7 +72,7 @@ class GeckoInputConnection
|
|||
|
||||
private String mCurrentInputMethod = "";
|
||||
|
||||
private final GeckoView mView;
|
||||
private final View mView;
|
||||
private final GeckoEditableClient mEditableClient;
|
||||
protected int mBatchEditCount;
|
||||
private ExtractedTextRequest mUpdateRequest;
|
||||
|
@ -83,7 +83,7 @@ class GeckoInputConnection
|
|||
// Prevent showSoftInput and hideSoftInput from causing reentrant calls on some devices.
|
||||
private volatile boolean mSoftInputReentrancyGuard;
|
||||
|
||||
public static GeckoEditableListener create(GeckoView targetView,
|
||||
public static GeckoEditableListener create(View targetView,
|
||||
GeckoEditableClient editable) {
|
||||
if (DEBUG)
|
||||
return DebugGeckoInputConnection.create(targetView, editable);
|
||||
|
@ -91,7 +91,7 @@ class GeckoInputConnection
|
|||
return new GeckoInputConnection(targetView, editable);
|
||||
}
|
||||
|
||||
protected GeckoInputConnection(GeckoView targetView,
|
||||
protected GeckoInputConnection(View targetView,
|
||||
GeckoEditableClient editable) {
|
||||
super(targetView, true);
|
||||
mView = targetView;
|
||||
|
@ -204,7 +204,7 @@ class GeckoInputConnection
|
|||
return extract;
|
||||
}
|
||||
|
||||
private GeckoView getView() {
|
||||
private View getView() {
|
||||
return mView;
|
||||
}
|
||||
|
||||
|
@ -236,10 +236,7 @@ class GeckoInputConnection
|
|||
v.clearFocus();
|
||||
v.requestFocus();
|
||||
}
|
||||
final GeckoView view = getView();
|
||||
if (view != null) {
|
||||
view.getDynamicToolbarAnimator().showToolbar(/*immediately*/ true);
|
||||
}
|
||||
GeckoAppShell.getLayerView().getDynamicToolbarAnimator().showToolbar(/*immediately*/true);
|
||||
mSoftInputReentrancyGuard = true;
|
||||
imm.showSoftInput(v, 0);
|
||||
mSoftInputReentrancyGuard = false;
|
||||
|
@ -362,18 +359,18 @@ class GeckoInputConnection
|
|||
mCursorAnchorInfoBuilder.reset();
|
||||
|
||||
// Calculate Gecko logical coords to screen coords
|
||||
final GeckoView view = getView();
|
||||
if (view == null) {
|
||||
final View v = getView();
|
||||
if (v == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
int[] viewCoords = new int[2];
|
||||
view.getLocationOnScreen(viewCoords);
|
||||
v.getLocationOnScreen(viewCoords);
|
||||
|
||||
DynamicToolbarAnimator animator = view.getDynamicToolbarAnimator();
|
||||
float toolbarHeight = (float) animator.getCurrentToolbarHeight();
|
||||
DynamicToolbarAnimator animator = GeckoAppShell.getLayerView().getDynamicToolbarAnimator();
|
||||
float toolbarHeight = (float)animator.getCurrentToolbarHeight();
|
||||
|
||||
Matrix matrix = view.getMatrixForLayerRectToViewRect();
|
||||
Matrix matrix = GeckoAppShell.getLayerView().getMatrixForLayerRectToViewRect();
|
||||
if (matrix == null) {
|
||||
if (DEBUG) {
|
||||
Log.d(LOGTAG, "Cannot get Matrix to convert from Gecko coords to layer view coords");
|
||||
|
@ -1037,13 +1034,13 @@ final class DebugGeckoInputConnection
|
|||
private InputConnection mProxy;
|
||||
private final StringBuilder mCallLevel;
|
||||
|
||||
private DebugGeckoInputConnection(GeckoView targetView,
|
||||
private DebugGeckoInputConnection(View targetView,
|
||||
GeckoEditableClient editable) {
|
||||
super(targetView, editable);
|
||||
mCallLevel = new StringBuilder();
|
||||
}
|
||||
|
||||
public static GeckoEditableListener create(GeckoView targetView,
|
||||
public static GeckoEditableListener create(View targetView,
|
||||
GeckoEditableClient editable) {
|
||||
final Class<?>[] PROXY_INTERFACES = { InputConnection.class,
|
||||
InputConnectionListener.class,
|
||||
|
|
|
@ -488,6 +488,9 @@ public class GeckoView extends LayerView {
|
|||
private void init(final Context context, final GeckoViewSettings settings) {
|
||||
preload(context);
|
||||
|
||||
// Perform common initialization for Fennec/GeckoView.
|
||||
GeckoAppShell.setLayerView(this);
|
||||
|
||||
initializeView();
|
||||
mListener.registerListeners();
|
||||
|
||||
|
@ -748,8 +751,7 @@ public class GeckoView extends LayerView {
|
|||
mInputConnectionListener.onKeyMultiple(keyCode, repeatCount, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIMEEnabled() {
|
||||
/* package */ boolean isIMEEnabled() {
|
||||
return mInputConnectionListener != null &&
|
||||
mInputConnectionListener.isIMEEnabled();
|
||||
}
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
|
||||
* 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/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import android.view.HapticFeedbackConstants;
|
||||
|
||||
/**
|
||||
* A <code>HapticFeedbackDelegate</code> is responsible for performing haptic feedback.
|
||||
*/
|
||||
public interface HapticFeedbackDelegate {
|
||||
/**
|
||||
* Perform a haptic feedback effect. Called from the Gecko thread.
|
||||
*
|
||||
* @param effect Effect to perform from <code>android.view.HapticFeedbackConstants</code>.
|
||||
*/
|
||||
void performHapticFeedback(int effect);
|
||||
}
|
|
@ -33,7 +33,6 @@ class GeckoLayerClient implements LayerView.Listener
|
|||
private IntSize mWindowSize;
|
||||
|
||||
private boolean mForceRedraw;
|
||||
private boolean mImeWasEnabledOnLastResize;
|
||||
|
||||
/* The current viewport metrics.
|
||||
* This is volatile so that we can read and write to it from different threads.
|
||||
|
@ -154,13 +153,7 @@ class GeckoLayerClient implements LayerView.Listener
|
|||
// the following call also sends gecko a message, which will be processed after the resize
|
||||
// message above has updated the viewport. this message ensures that if we have just put
|
||||
// focus in a text field, we scroll the content so that the text field is in view.
|
||||
final boolean imeIsEnabled = mView.isIMEEnabled();
|
||||
if (imeIsEnabled && !mImeWasEnabledOnLastResize) {
|
||||
// The IME just came up after not being up, so let's scroll
|
||||
// to the focused input.
|
||||
EventDispatcher.getInstance().dispatch("ScrollTo:FocusedInput", null);
|
||||
}
|
||||
mImeWasEnabledOnLastResize = imeIsEnabled;
|
||||
GeckoAppShell.viewSizeChanged();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -824,9 +824,5 @@ public class LayerView extends FrameLayout {
|
|||
if (isCompositorReady()) {
|
||||
mCompositor.setDefaultClearColor(mDefaultClearColor);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isIMEEnabled() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -356,7 +356,7 @@ public class FennecNativeActions implements Actions {
|
|||
|
||||
PaintExpecter() {
|
||||
final PaintExpecter expecter = this;
|
||||
mLayerView = (LayerView) mSolo.getView(R.id.layer_view);
|
||||
mLayerView = GeckoAppShell.getLayerView();
|
||||
mDrawListener = new DrawListener() {
|
||||
@Override
|
||||
public void drawFinished() {
|
||||
|
|
|
@ -356,8 +356,7 @@ abstract class BaseTest extends BaseRobocopTest {
|
|||
|
||||
// If we don't see the item, scroll down once in case it's off-screen.
|
||||
// Hacky way to scroll down. solo.scroll* does not work in dialogs.
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mSolo,
|
||||
mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
meh.dragSync(mScreenMidWidth, mScreenMidHeight+100, mScreenMidWidth, mScreenMidHeight-100);
|
||||
|
||||
foundText = mSolo.waitForText(txt);
|
||||
|
|
|
@ -5,11 +5,8 @@
|
|||
package org.mozilla.gecko.tests;
|
||||
|
||||
import org.mozilla.gecko.GeckoAppShell;
|
||||
import org.mozilla.gecko.PrefsHelper;
|
||||
import org.mozilla.gecko.R;
|
||||
import org.mozilla.gecko.gfx.LayerView;
|
||||
|
||||
import com.robotium.solo.Solo;
|
||||
import org.mozilla.gecko.PrefsHelper;
|
||||
|
||||
import android.app.Instrumentation;
|
||||
import android.os.SystemClock;
|
||||
|
@ -29,12 +26,11 @@ class MotionEventHelper {
|
|||
private float mTouchStartTolerance;
|
||||
private final int mDpi;
|
||||
|
||||
public MotionEventHelper(Instrumentation inst, Solo solo,
|
||||
int surfaceOffsetX, int surfaceOffsetY) {
|
||||
public MotionEventHelper(Instrumentation inst, int surfaceOffsetX, int surfaceOffsetY) {
|
||||
mInstrumentation = inst;
|
||||
mSurfaceOffsetX = surfaceOffsetX;
|
||||
mSurfaceOffsetY = surfaceOffsetY;
|
||||
layerView = (LayerView) solo.getView(R.id.layer_view);
|
||||
layerView = GeckoAppShell.getLayerView();
|
||||
mApzEnabled = false;
|
||||
mTouchStartTolerance = 0.0f;
|
||||
mDpi = GeckoAppShell.getDpi();
|
||||
|
|
|
@ -19,8 +19,7 @@ public class testAxisLocking extends PixelTest {
|
|||
public void testAxisLocking() {
|
||||
String url = getAbsoluteUrl(mStringHelper.ROBOCOP_BOXES_URL);
|
||||
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mSolo,
|
||||
mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
|
||||
blockForGeckoReady();
|
||||
|
||||
|
|
|
@ -17,8 +17,7 @@ public class testFlingCorrectness extends PixelTest {
|
|||
public void testFlingCorrectness() {
|
||||
String url = getAbsoluteUrl(mStringHelper.ROBOCOP_BOXES_URL);
|
||||
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mSolo,
|
||||
mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
|
||||
blockForGeckoReady();
|
||||
|
||||
|
|
|
@ -17,8 +17,7 @@ public class testPanCorrectness extends PixelTest {
|
|||
public void testPanCorrectness() {
|
||||
String url = getAbsoluteUrl(mStringHelper.ROBOCOP_BOXES_URL);
|
||||
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mSolo,
|
||||
mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
|
||||
blockForGeckoReady();
|
||||
|
||||
|
|
|
@ -29,8 +29,7 @@ public class testVkbOverlap extends PixelTest {
|
|||
|
||||
// scroll to the bottom of the page and let it settle
|
||||
Actions.RepeatedEventExpecter paintExpecter = mActions.expectPaint();
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mSolo,
|
||||
mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
MotionEventHelper meh = new MotionEventHelper(getInstrumentation(), mDriver.getGeckoLeft(), mDriver.getGeckoTop());
|
||||
meh.dragSync(10, 150, 10, 50);
|
||||
|
||||
// the input field has a green background, so let's count the number of green pixels
|
||||
|
|
|
@ -5051,16 +5051,6 @@ fi
|
|||
|
||||
AC_SUBST(PREPROCESS_OPTION)
|
||||
|
||||
dnl ========================================================
|
||||
dnl mask as shorthand property
|
||||
dnl ========================================================
|
||||
|
||||
# The control structure code will be removed as soon as the feature is stable
|
||||
# Refer to bug 1281101 for more details.
|
||||
MOZ_ENABLE_MASK_AS_SHORTHAND=1
|
||||
AC_DEFINE(MOZ_ENABLE_MASK_AS_SHORTHAND)
|
||||
AC_SUBST(MOZ_ENABLE_MASK_AS_SHORTHAND)
|
||||
|
||||
# Avoid using obsolete NSPR features
|
||||
AC_DEFINE(NO_NSPR_10_SUPPORT)
|
||||
|
||||
|
|
|
@ -630,6 +630,10 @@ fn as_element<'le>(node: LayoutJS<Node>) -> Option<ServoLayoutElement<'le>> {
|
|||
impl<'le> ::selectors::Element for ServoLayoutElement<'le> {
|
||||
type Impl = SelectorImpl;
|
||||
|
||||
fn opaque(&self) -> ::selectors::OpaqueElement {
|
||||
::selectors::OpaqueElement::new(self.as_node().opaque().0 as *const ())
|
||||
}
|
||||
|
||||
fn parent_element(&self) -> Option<ServoLayoutElement<'le>> {
|
||||
unsafe {
|
||||
self.element.upcast().parent_node_ref().and_then(as_element)
|
||||
|
@ -1168,6 +1172,11 @@ impl<'le> ThreadSafeLayoutElement for ServoThreadSafeLayoutElement<'le> {
|
|||
impl<'le> ::selectors::Element for ServoThreadSafeLayoutElement<'le> {
|
||||
type Impl = SelectorImpl;
|
||||
|
||||
fn opaque(&self) -> ::selectors::OpaqueElement {
|
||||
::selectors::OpaqueElement::new(self.as_node().opaque().0 as *const ())
|
||||
}
|
||||
|
||||
|
||||
fn parent_element(&self) -> Option<Self> {
|
||||
warn!("ServoThreadSafeLayoutElement::parent_element called");
|
||||
None
|
||||
|
|
|
@ -2500,6 +2500,10 @@ impl VirtualMethods for Element {
|
|||
impl<'a> ::selectors::Element for Root<Element> {
|
||||
type Impl = SelectorImpl;
|
||||
|
||||
fn opaque(&self) -> ::selectors::OpaqueElement {
|
||||
::selectors::OpaqueElement::new(self.reflector().get_jsobject().get())
|
||||
}
|
||||
|
||||
fn parent_element(&self) -> Option<Root<Element>> {
|
||||
self.upcast::<Node>().GetParentElement()
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
use attr::CaseSensitivity;
|
||||
use bloom::BloomFilter;
|
||||
use nth_index_cache::NthIndexCache;
|
||||
|
||||
/// What kind of selector matching mode we should use.
|
||||
///
|
||||
|
@ -69,12 +70,6 @@ impl QuirksMode {
|
|||
}
|
||||
}
|
||||
|
||||
/// A cache to speed up matching of nth-index-like selectors.
|
||||
///
|
||||
/// NB: This is just a dummy type right now, it will be fleshed out in later patches.
|
||||
#[derive(Default)]
|
||||
pub struct NthIndexCache(usize);
|
||||
|
||||
/// Data associated with the matching process for a element. This context is
|
||||
/// used across many selectors for an element, so it's not appropriate for
|
||||
/// transient data that applies to only a single selector.
|
||||
|
@ -84,7 +79,7 @@ pub struct MatchingContext<'a> {
|
|||
/// Input with the bloom filter used to fast-reject selectors.
|
||||
pub bloom_filter: Option<&'a BloomFilter>,
|
||||
/// An optional cache to speed up nth-index-like selectors.
|
||||
nth_index_cache: Option<&'a mut NthIndexCache>,
|
||||
pub nth_index_cache: Option<&'a mut NthIndexCache>,
|
||||
/// Input that controls how matching for links is handled.
|
||||
pub visited_handling: VisitedHandlingMode,
|
||||
/// Output that records whether we encountered a "relevant link" while
|
||||
|
|
|
@ -24,6 +24,7 @@ pub mod bloom;
|
|||
mod builder;
|
||||
pub mod context;
|
||||
pub mod matching;
|
||||
mod nth_index_cache;
|
||||
pub mod parser;
|
||||
#[cfg(test)] mod size_of_tests;
|
||||
#[cfg(any(test, feature = "gecko_like_types"))] pub mod gecko_like_types;
|
||||
|
@ -31,5 +32,6 @@ pub mod sink;
|
|||
mod tree;
|
||||
pub mod visitor;
|
||||
|
||||
pub use nth_index_cache::NthIndexCache;
|
||||
pub use parser::{SelectorImpl, Parser, SelectorList};
|
||||
pub use tree::Element;
|
||||
pub use tree::{Element, OpaqueElement};
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
use attr::{ParsedAttrSelectorOperation, AttrSelectorOperation, NamespaceConstraint};
|
||||
use bloom::{BLOOM_HASH_MASK, BloomFilter};
|
||||
use nth_index_cache::NthIndexCacheInner;
|
||||
use parser::{AncestorHashes, Combinator, Component, LocalName};
|
||||
use parser::{Selector, SelectorImpl, SelectorIter, SelectorList};
|
||||
use std::borrow::Borrow;
|
||||
|
@ -787,7 +788,20 @@ fn matches_generic_nth_child<E, F>(element: &E,
|
|||
HAS_SLOW_SELECTOR_LATER_SIBLINGS
|
||||
});
|
||||
|
||||
let index = nth_child_index(element, is_of_type, is_from_end);
|
||||
// Grab a reference to the appropriate cache.
|
||||
let mut cache = context.shared.nth_index_cache.as_mut().map(|c| {
|
||||
c.get(is_of_type, is_from_end)
|
||||
});
|
||||
|
||||
// Lookup or compute the index.
|
||||
let index = if let Some(i) = cache.as_mut().and_then(|c| c.lookup(element.opaque())) {
|
||||
i
|
||||
} else {
|
||||
let i = nth_child_index(element, is_of_type, is_from_end, cache.as_mut().map(|s| &mut **s));
|
||||
cache.as_mut().map(|c| c.insert(element.opaque(), i));
|
||||
i
|
||||
};
|
||||
debug_assert_eq!(index, nth_child_index(element, is_of_type, is_from_end, None), "invalid cache");
|
||||
|
||||
// Is there a non-negative integer n such that An+B=index?
|
||||
match index.checked_sub(b) {
|
||||
|
@ -799,41 +813,60 @@ fn matches_generic_nth_child<E, F>(element: &E,
|
|||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn same_type<E: Element>(a: &E, b: &E) -> bool {
|
||||
a.get_local_name() == b.get_local_name() &&
|
||||
a.get_namespace() == b.get_namespace()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn nth_child_index<E>(
|
||||
element: &E,
|
||||
is_of_type: bool,
|
||||
is_from_end: bool,
|
||||
mut cache: Option<&mut NthIndexCacheInner>,
|
||||
) -> i32
|
||||
where
|
||||
E: Element,
|
||||
{
|
||||
let mut index: i32 = 1;
|
||||
let mut next_sibling = if is_from_end {
|
||||
element.next_sibling_element()
|
||||
} else {
|
||||
element.prev_sibling_element()
|
||||
};
|
||||
|
||||
loop {
|
||||
let sibling = match next_sibling {
|
||||
None => break,
|
||||
Some(next_sibling) => next_sibling
|
||||
};
|
||||
|
||||
if is_of_type {
|
||||
if element.get_local_name() == sibling.get_local_name() &&
|
||||
element.get_namespace() == sibling.get_namespace() {
|
||||
index += 1;
|
||||
// The traversal mostly processes siblings left to right. So when we walk
|
||||
// siblings to the right when computing NthLast/NthLastOfType we're unlikely
|
||||
// to get cache hits along the way. As such, we take the hit of walking the
|
||||
// siblings to the left checking the cache in the is_from_end case (this
|
||||
// matches what Gecko does). The indices-from-the-left is handled during the
|
||||
// regular look further below.
|
||||
if let Some(ref mut c) = cache {
|
||||
if is_from_end && !c.is_empty() {
|
||||
let mut index: i32 = 1;
|
||||
let mut curr = element.clone();
|
||||
while let Some(e) = curr.prev_sibling_element() {
|
||||
curr = e;
|
||||
if !is_of_type || same_type(element, &curr) {
|
||||
if let Some(i) = c.lookup(curr.opaque()) {
|
||||
return i - index;
|
||||
}
|
||||
index += 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
index += 1;
|
||||
}
|
||||
next_sibling = if is_from_end {
|
||||
sibling.next_sibling_element()
|
||||
} else {
|
||||
sibling.prev_sibling_element()
|
||||
};
|
||||
}
|
||||
|
||||
let mut index: i32 = 1;
|
||||
let mut curr = element.clone();
|
||||
let next = |e: E| if is_from_end { e.next_sibling_element() } else { e.prev_sibling_element() };
|
||||
while let Some(e) = next(curr) {
|
||||
curr = e;
|
||||
if !is_of_type || same_type(element, &curr) {
|
||||
// If we're computing indices from the left, check each element in the
|
||||
// cache. We handle the indices-from-the-right case at the top of this
|
||||
// function.
|
||||
if !is_from_end {
|
||||
if let Some(i) = cache.as_mut().and_then(|c| c.lookup(curr.opaque())) {
|
||||
return i + index
|
||||
}
|
||||
}
|
||||
index += 1;
|
||||
}
|
||||
}
|
||||
|
||||
index
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
/* 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/. */
|
||||
|
||||
use fnv::FnvHashMap;
|
||||
use tree::OpaqueElement;
|
||||
|
||||
/// A cache to speed up matching of nth-index-like selectors.
|
||||
///
|
||||
/// See [1] for some discussion around the design tradeoffs.
|
||||
///
|
||||
/// [1] https://bugzilla.mozilla.org/show_bug.cgi?id=1401855#c3
|
||||
#[derive(Default)]
|
||||
pub struct NthIndexCache {
|
||||
nth: NthIndexCacheInner,
|
||||
nth_last: NthIndexCacheInner,
|
||||
nth_of_type: NthIndexCacheInner,
|
||||
nth_last_of_type: NthIndexCacheInner,
|
||||
}
|
||||
|
||||
impl NthIndexCache {
|
||||
/// Gets the appropriate cache for the given parameters.
|
||||
pub fn get(
|
||||
&mut self,
|
||||
is_of_type: bool,
|
||||
is_from_end: bool
|
||||
) -> &mut NthIndexCacheInner {
|
||||
match (is_of_type, is_from_end) {
|
||||
(false, false) => &mut self.nth,
|
||||
(false, true) => &mut self.nth_last,
|
||||
(true, false) => &mut self.nth_of_type,
|
||||
(true, true) => &mut self.nth_last_of_type,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The concrete per-pseudo-class cache.
|
||||
#[derive(Default)]
|
||||
pub struct NthIndexCacheInner(FnvHashMap<OpaqueElement, i32>);
|
||||
|
||||
impl NthIndexCacheInner {
|
||||
/// Does a lookup for a given element in the cache.
|
||||
pub fn lookup(&mut self, el: OpaqueElement) -> Option<i32> {
|
||||
self.0.get(&el).map(|x| *x)
|
||||
}
|
||||
|
||||
/// Inserts an entry into the cache.
|
||||
pub fn insert(&mut self, element: OpaqueElement, index: i32) {
|
||||
self.0.insert(element, index);
|
||||
}
|
||||
|
||||
/// Returns whether the cache is empty.
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.0.is_empty()
|
||||
}
|
||||
}
|
|
@ -8,11 +8,27 @@
|
|||
use attr::{AttrSelectorOperation, NamespaceConstraint, CaseSensitivity};
|
||||
use matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext, RelevantLinkStatus};
|
||||
use parser::SelectorImpl;
|
||||
use servo_arc::NonZeroPtrMut;
|
||||
use std::fmt::Debug;
|
||||
|
||||
pub trait Element: Sized + Debug {
|
||||
/// Opaque representation of an Element, for identity comparisons. We use
|
||||
/// NonZeroPtrMut to get the NonZero optimization.
|
||||
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||
pub struct OpaqueElement(pub NonZeroPtrMut<()>);
|
||||
|
||||
impl OpaqueElement {
|
||||
/// Creates a new OpaqueElement from an arbitrarily-typed pointer.
|
||||
pub fn new<T>(ptr: *const T) -> Self {
|
||||
OpaqueElement(NonZeroPtrMut::new(ptr as *const () as *mut ()))
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Element: Sized + Clone + Debug {
|
||||
type Impl: SelectorImpl;
|
||||
|
||||
/// Converts self into an opaque representation.
|
||||
fn opaque(&self) -> OpaqueElement;
|
||||
|
||||
fn parent_element(&self) -> Option<Self>;
|
||||
|
||||
/// The parent of a given pseudo-element, after matching a pseudo-element
|
||||
|
|
|
@ -23,7 +23,7 @@ use properties::ComputedValues;
|
|||
use rule_cache::RuleCache;
|
||||
use rule_tree::StrongRuleNode;
|
||||
use selector_parser::{EAGER_PSEUDO_COUNT, SnapshotMap};
|
||||
use selectors::context::NthIndexCache;
|
||||
use selectors::NthIndexCache;
|
||||
use selectors::matching::ElementSelectorFlags;
|
||||
use servo_arc::Arc;
|
||||
#[cfg(feature = "servo")] use servo_atoms::Atom;
|
||||
|
|
|
@ -76,7 +76,7 @@ use properties::animated_properties::TransitionProperty;
|
|||
use properties::style_structs::Font;
|
||||
use rule_tree::CascadeLevel as ServoCascadeLevel;
|
||||
use selector_parser::{AttrValue, ElementExt, PseudoClassStringArg};
|
||||
use selectors::Element;
|
||||
use selectors::{Element, OpaqueElement};
|
||||
use selectors::attr::{AttrSelectorOperation, AttrSelectorOperator, CaseSensitivity, NamespaceConstraint};
|
||||
use selectors::matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext};
|
||||
use selectors::matching::{RelevantLinkStatus, VisitedHandlingMode};
|
||||
|
@ -1682,6 +1682,10 @@ impl<'le> PresentationalHintsSynthesizer for GeckoElement<'le> {
|
|||
impl<'le> ::selectors::Element for GeckoElement<'le> {
|
||||
type Impl = SelectorImpl;
|
||||
|
||||
fn opaque(&self) -> OpaqueElement {
|
||||
OpaqueElement::new(self.0)
|
||||
}
|
||||
|
||||
fn parent_element(&self) -> Option<Self> {
|
||||
// FIXME(emilio): This will need to jump across if the parent node is a
|
||||
// shadow root to get the shadow host.
|
||||
|
|
|
@ -9,7 +9,7 @@ use {Atom, CaseSensitivityExt, LocalName, Namespace};
|
|||
use dom::TElement;
|
||||
use element_state::ElementState;
|
||||
use selector_parser::{NonTSPseudoClass, PseudoElement, SelectorImpl, Snapshot, SnapshotMap, AttrValue};
|
||||
use selectors::Element;
|
||||
use selectors::{Element, OpaqueElement};
|
||||
use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
|
||||
use selectors::matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext};
|
||||
use selectors::matching::RelevantLinkStatus;
|
||||
|
@ -258,6 +258,10 @@ impl<'a, E> Element for ElementWrapper<'a, E>
|
|||
self.element.is_link()
|
||||
}
|
||||
|
||||
fn opaque(&self) -> OpaqueElement {
|
||||
self.element.opaque()
|
||||
}
|
||||
|
||||
fn parent_element(&self) -> Option<Self> {
|
||||
self.element.parent_element()
|
||||
.map(|e| ElementWrapper::new(e, self.snapshot_map))
|
||||
|
|
|
@ -10,7 +10,7 @@ use Atom;
|
|||
use bloom::StyleBloom;
|
||||
use context::{SelectorFlagsMap, SharedStyleContext};
|
||||
use dom::TElement;
|
||||
use selectors::context::NthIndexCache;
|
||||
use selectors::NthIndexCache;
|
||||
use sharing::{StyleSharingCandidate, StyleSharingTarget};
|
||||
|
||||
/// Determines whether a target and a candidate have compatible parents for sharing.
|
||||
|
|
|
@ -75,7 +75,7 @@ use matching::MatchMethods;
|
|||
use owning_ref::OwningHandle;
|
||||
use properties::ComputedValues;
|
||||
use rule_tree::StrongRuleNode;
|
||||
use selectors::context::NthIndexCache;
|
||||
use selectors::NthIndexCache;
|
||||
use selectors::matching::{ElementSelectorFlags, VisitedHandlingMode};
|
||||
use servo_arc::{Arc, NonZeroPtrMut};
|
||||
use smallbitvec::SmallBitVec;
|
||||
|
|
|
@ -28,9 +28,10 @@ use properties::IS_LINK;
|
|||
use rule_tree::{CascadeLevel, RuleTree, StrongRuleNode, StyleSource};
|
||||
use selector_map::{PrecomputedHashMap, SelectorMap, SelectorMapEntry};
|
||||
use selector_parser::{SelectorImpl, PerPseudoElementMap, PseudoElement};
|
||||
use selectors::NthIndexCache;
|
||||
use selectors::attr::NamespaceConstraint;
|
||||
use selectors::bloom::{BloomFilter, NonCountingBloomFilter};
|
||||
use selectors::matching::{ElementSelectorFlags, matches_selector, MatchingContext, MatchingMode, NthIndexCache};
|
||||
use selectors::matching::{ElementSelectorFlags, matches_selector, MatchingContext, MatchingMode};
|
||||
use selectors::matching::VisitedHandlingMode;
|
||||
use selectors::parser::{AncestorHashes, Combinator, Component, Selector};
|
||||
use selectors::parser::{SelectorIter, SelectorMethods};
|
||||
|
|
|
@ -22,4 +22,3 @@
|
|||
|
||||
[Event interface: existence and properties of interface object]
|
||||
expected: FAIL
|
||||
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,5 +0,0 @@
|
|||
[access-control-basic-cors-safelisted-request-headers.htm]
|
||||
type: testharness
|
||||
[Request with CORS-safelisted headers]
|
||||
expected: FAIL
|
||||
|
|
@ -2,4 +2,3 @@
|
|||
type: testharness
|
||||
[XHR method GET with MIME type image/png]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
[send-after-setting-document-domain.htm]
|
||||
expected:
|
||||
if debug and stylo and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): CRASH
|
|
@ -1,3 +1,2 @@
|
|||
[send-response-event-order.htm]
|
||||
type: testharness
|
||||
disabled: if (os == "win"): https://bugzilla.mozilla.org/show_bug.cgi?id=1370056
|
||||
|
|
|
@ -249,102 +249,3 @@
|
|||
[Accelerometer interface: new GravitySensor(); must inherit property "z" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: existence and properties of interface object]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface object length]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface object name]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: existence and properties of interface prototype object]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute activated]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute timestamp]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: operation start()]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: operation stop()]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute onreading]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute onactivate]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute onerror]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new Accelerometer(); must inherit property "activated" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new Accelerometer(); must inherit property "timestamp" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new Accelerometer(); must inherit property "start()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new Accelerometer(); must inherit property "stop()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new Accelerometer(); must inherit property "onreading" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new Accelerometer(); must inherit property "onactivate" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new Accelerometer(); must inherit property "onerror" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new LinearAccelerationSensor(); must inherit property "activated" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new LinearAccelerationSensor(); must inherit property "timestamp" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new LinearAccelerationSensor(); must inherit property "start()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new LinearAccelerationSensor(); must inherit property "stop()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new LinearAccelerationSensor(); must inherit property "onreading" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new LinearAccelerationSensor(); must inherit property "onactivate" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new LinearAccelerationSensor(); must inherit property "onerror" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new GravitySensor(); must inherit property "activated" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new GravitySensor(); must inherit property "timestamp" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new GravitySensor(); must inherit property "start()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new GravitySensor(); must inherit property "stop()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new GravitySensor(); must inherit property "onreading" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new GravitySensor(); must inherit property "onactivate" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new GravitySensor(); must inherit property "onerror" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -87,60 +87,3 @@
|
|||
[AmbientLightSensor interface: new AmbientLightSensor(); must inherit property "illuminance" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: existence and properties of interface object]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface object length]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface object name]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: existence and properties of interface prototype object]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: existence and properties of interface prototype object's "constructor" property]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute activated]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute timestamp]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: operation start()]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: operation stop()]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute onreading]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute onactivate]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: attribute onerror]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new AmbientLightSensor(); must inherit property "activated" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new AmbientLightSensor(); must inherit property "timestamp" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new AmbientLightSensor(); must inherit property "start()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new AmbientLightSensor(); must inherit property "stop()" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new AmbientLightSensor(); must inherit property "onreading" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new AmbientLightSensor(); must inherit property "onactivate" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
[Sensor interface: new AmbientLightSensor(); must inherit property "onerror" with the proper type]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[content-security-policy.https.window.html]
|
||||
type: testharness
|
||||
[fetch blocked by CSP should reject]
|
||||
expected: FAIL
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
[credentials-in-url.https.window.html]
|
||||
type: testharness
|
||||
[fetch without credentials in URL should register ok]
|
||||
expected: FAIL
|
||||
|
||||
[fetch with username and password in URL should reject]
|
||||
expected: FAIL
|
||||
|
||||
[fetch with username and empty password in URL should reject]
|
||||
expected: FAIL
|
||||
|
||||
[fetch with empty username and password in URL should reject]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[dangling-markup.https.window.html]
|
||||
type: testharness
|
||||
[fetch to URL containing \\n and < should reject]
|
||||
expected: FAIL
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
[mixed-content-and-allowed-schemes.https.window.html]
|
||||
type: testharness
|
||||
[https: fetch should register ok]
|
||||
expected: FAIL
|
||||
|
||||
[loopback IPv4 http: fetch should register ok]
|
||||
expected: FAIL
|
||||
|
||||
[loopback IPv6 http: fetch should register ok]
|
||||
expected: FAIL
|
||||
|
||||
[non-loopback http: fetch should reject]
|
||||
expected: FAIL
|
||||
|
||||
[non-loopback IPv4 http: fetch should reject]
|
||||
expected: FAIL
|
||||
|
||||
[non-loopback IPv6 http: fetch should reject]
|
||||
expected: FAIL
|
||||
|
||||
[https: and non-loopback http: fetch should reject]
|
||||
expected: FAIL
|
||||
|
||||
[non-loopback http: and https: fetch should reject]
|
||||
expected: FAIL
|
||||
|
||||
[wss: fetch should reject]
|
||||
expected: FAIL
|
||||
|
||||
[file: fetch should reject]
|
||||
expected: FAIL
|
||||
|
||||
[data: fetch should reject]
|
||||
expected: FAIL
|
||||
|
||||
[unknown scheme fetch should reject]
|
||||
expected: FAIL
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
[port-blocking.https.window.html]
|
||||
type: testharness
|
||||
[fetch to default https port should register ok]
|
||||
expected: FAIL
|
||||
|
||||
[fetch to default http port should register ok]
|
||||
expected: FAIL
|
||||
|
||||
[fetch to port 443 should register ok]
|
||||
expected: FAIL
|
||||
|
||||
[fetch to port 80 should register ok, even over https]
|
||||
expected: FAIL
|
||||
|
||||
[fetch to non-default non-bad port (8080) should register ok]
|
||||
expected: FAIL
|
||||
|
||||
[fetch to bad port (SMTP) should reject]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
[object-src-applet-archive-codebase.sub.html]
|
||||
type: testharness
|
||||
expected:
|
||||
if not debug and (os == "mac") and (version == "OS X 10.8") and (processor == "x86_64") and (bits == 64): TIMEOUT
|
||||
if debug and (os == "mac") and (version == "OS X 10.8") and (processor == "x86_64") and (bits == 64): TIMEOUT
|
||||
[Expecting logs: ["PASS"\]]
|
||||
expected: NOTRUN
|
||||
|
||||
[Violation report status OK.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
[object-src-applet-archive.sub.html]
|
||||
type: testharness
|
||||
expected:
|
||||
if not debug and (os == "mac") and (version == "OS X 10.8") and (processor == "x86_64") and (bits == 64): TIMEOUT
|
||||
if debug and (os == "mac") and (version == "OS X 10.8") and (processor == "x86_64") and (bits == 64): TIMEOUT
|
||||
[Expecting logs: ["PASS"\]]
|
||||
expected: NOTRUN
|
||||
|
||||
[Violation report status OK.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
[object-src-applet-code-codebase.sub.html]
|
||||
type: testharness
|
||||
expected:
|
||||
if not debug and (os == "mac") and (version == "OS X 10.8") and (processor == "x86_64") and (bits == 64): TIMEOUT
|
||||
if debug and (os == "mac") and (version == "OS X 10.8") and (processor == "x86_64") and (bits == 64): TIMEOUT
|
||||
[Expecting logs: ["PASS"\]]
|
||||
expected: NOTRUN
|
||||
|
||||
[Violation report status OK.]
|
||||
expected: FAIL
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
[object-src-applet-code.sub.html]
|
||||
type: testharness
|
||||
expected:
|
||||
if not debug and (os == "mac") and (version == "OS X 10.8") and (processor == "x86_64") and (bits == 64): TIMEOUT
|
||||
if debug and (os == "mac") and (version == "OS X 10.8") and (processor == "x86_64") and (bits == 64): TIMEOUT
|
||||
[Expecting logs: ["PASS"\]]
|
||||
expected: NOTRUN
|
||||
|
||||
[Violation report status OK.]
|
||||
expected: FAIL
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
[parse-input-arguments-019.html]
|
||||
type: reftest
|
||||
expected: FAIL
|
|
@ -1,3 +0,0 @@
|
|||
[parse-input-arguments-020.html]
|
||||
type: reftest
|
||||
expected: FAIL
|
|
@ -1,3 +0,0 @@
|
|||
[parse-input-arguments-021.html]
|
||||
type: reftest
|
||||
expected: FAIL
|
|
@ -1,3 +0,0 @@
|
|||
[parse-input-arguments-022.html]
|
||||
type: reftest
|
||||
expected: FAIL
|
|
@ -0,0 +1,3 @@
|
|||
[attribute-value-selector-002.xht]
|
||||
type: reftest
|
||||
expected: FAIL
|
|
@ -1,5 +0,0 @@
|
|||
[grid-alignment-implies-size-change-007.html]
|
||||
type: testharness
|
||||
[.before 1]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[grid-alignment-implies-size-change-009.html]
|
||||
type: testharness
|
||||
[.before 1]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[grid-alignment-implies-size-change-017.html]
|
||||
type: testharness
|
||||
[.before 1]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[grid-alignment-implies-size-change-025.html]
|
||||
type: testharness
|
||||
[.before 1]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[grid-alignment-implies-size-change-027.html]
|
||||
type: testharness
|
||||
[.before 1]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[grid-alignment-implies-size-change-035.html]
|
||||
type: testharness
|
||||
[.before 1]
|
||||
expected: FAIL
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
[grid-minimum-size-grid-items-007.html]
|
||||
type: reftest
|
||||
expected: FAIL
|
|
@ -1,3 +0,0 @@
|
|||
[grid-minimum-size-grid-items-009.html]
|
||||
type: reftest
|
||||
expected: FAIL
|
|
@ -1,17 +1,14 @@
|
|||
[grid-minimum-size-grid-items-021.html]
|
||||
type: testharness
|
||||
[grid-2.gridTemplateRows]
|
||||
[grid-3.height]
|
||||
expected: FAIL
|
||||
|
||||
[grid-4.gridTemplateRows]
|
||||
[grid-3.gridTemplateRows]
|
||||
expected: FAIL
|
||||
|
||||
[grid-8.gridTemplateRows]
|
||||
[grid-9.height]
|
||||
expected: FAIL
|
||||
|
||||
[grid-10.gridTemplateRows]
|
||||
expected: FAIL
|
||||
|
||||
[grid-12.gridTemplateRows]
|
||||
[grid-9.gridTemplateRows]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
[logicalprops-quirklength.html]
|
||||
type: testharness
|
||||
expected: ERROR
|
|
@ -31,4 +31,3 @@
|
|||
|
||||
[circle(calc(25%*3)) - computed style]
|
||||
expected: FAIL
|
||||
|
||||
|
|
|
@ -43,4 +43,3 @@
|
|||
|
||||
[circle(at calc((12.5%*6 + 10in) / 4)) - computed style]
|
||||
expected: FAIL
|
||||
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче