Merge mozilla-central to autoland. a=merge CLOSED TREE

This commit is contained in:
Ciure Andrei 2018-05-19 01:09:10 +03:00
Родитель f79b3e0dab 2f509969e9
Коммит 26287d7c31
1423 изменённых файлов: 17526 добавлений и 5104 удалений

Просмотреть файл

@ -143,22 +143,29 @@ var tabPreviewPanelHelper = {
* Ctrl-Tab panel * Ctrl-Tab panel
*/ */
var ctrlTab = { var ctrlTab = {
maxTabPreviews: 6,
get panel() { get panel() {
delete this.panel; delete this.panel;
return this.panel = document.getElementById("ctrlTab-panel"); return this.panel = document.getElementById("ctrlTab-panel");
}, },
get showAllButton() { get showAllButton() {
delete this.showAllButton; delete this.showAllButton;
return this.showAllButton = document.getElementById("ctrlTab-showAll"); let button = this.makePreview(true);
button.setAttribute("id", "ctrlTab-showAll");
document.getElementById("ctrlTab-showAll-container").appendChild(button);
return this.showAllButton = button;
}, },
get previews() { get previews() {
delete this.previews; delete this.previews;
let previewsContainer = document.getElementById("ctrlTab-previews");
for (let i = 0; i < this.maxTabPreviews; i++) {
previewsContainer.appendChild(this.makePreview(false));
}
// Ensure that showAllButton is in the document before returning the single
// node list that includes both the previews and the button.
this.showAllButton;
return this.previews = this.panel.getElementsByClassName("ctrlTab-preview"); return this.previews = this.panel.getElementsByClassName("ctrlTab-preview");
}, },
get maxTabPreviews() {
delete this.maxTabPreviews;
return this.maxTabPreviews = this.previews.length - 1;
},
get canvasWidth() { get canvasWidth() {
delete this.canvasWidth; delete this.canvasWidth;
return this.canvasWidth = Math.ceil(screen.availWidth * .85 / this.maxTabPreviews); return this.canvasWidth = Math.ceil(screen.availWidth * .85 / this.maxTabPreviews);
@ -228,13 +235,65 @@ var ctrlTab = {
this.readPref(); this.readPref();
}, },
makePreview: function ctrlTab_makePreview(aIsShowAllButton) {
let preview = document.createElement("button");
preview.setAttribute("class", "ctrlTab-preview");
preview.setAttribute("pack", "center");
if (!aIsShowAllButton) {
preview.setAttribute("flex", "1");
}
preview.addEventListener("mouseover", () => this._mouseOverFocus(preview));
preview.addEventListener("command", () => this.pick(preview));
preview.addEventListener("click", event => {
if (event.button == 1) {
this.remove(preview);
} else if (AppConstants.platform == "macosx" && event.button == 2) {
// Control+click is a right click on OS X
this.pick(preview);
}
});
let previewInner = document.createElement("vbox");
previewInner.setAttribute("class", "ctrlTab-preview-inner");
preview.appendChild(previewInner);
if (!aIsShowAllButton) {
let canvasWidth = this.canvasWidth;
let canvasHeight = this.canvasHeight;
let canvas = preview._canvas = document.createElement("hbox");
canvas.setAttribute("class", "ctrlTab-canvas");
canvas.setAttribute("width", canvasWidth);
canvas.style.minWidth = canvasWidth + "px";
canvas.style.maxWidth = canvasWidth + "px";
canvas.style.minHeight = canvasHeight + "px";
canvas.style.maxHeight = canvasHeight + "px";
previewInner.appendChild(canvas);
let faviconContainer = document.createElement("hbox");
faviconContainer.setAttribute("class", "ctrlTab-favicon-container");
previewInner.appendChild(faviconContainer);
let favicon = preview._favicon = document.createElement("image");
favicon.setAttribute("class", "ctrlTab-favicon");
faviconContainer.appendChild(favicon);
}
let label = preview._label = document.createElement("label");
label.setAttribute("class", "ctrlTab-label plain");
label.setAttribute("crop", "end");
previewInner.appendChild(label);
return preview;
},
updatePreviews: function ctrlTab_updatePreviews() { updatePreviews: function ctrlTab_updatePreviews() {
for (let i = 0; i < this.previews.length; i++) for (let i = 0; i < this.previews.length; i++)
this.updatePreview(this.previews[i], this.tabList[i]); this.updatePreview(this.previews[i], this.tabList[i]);
var showAllLabel = gNavigatorBundle.getString("ctrlTab.listAllTabs.label"); var showAllLabel = gNavigatorBundle.getString("ctrlTab.listAllTabs.label");
this.showAllButton.label = this.showAllButton._label.setAttribute("value",
PluralForm.get(this.tabCount, showAllLabel).replace("#1", this.tabCount); PluralForm.get(this.tabCount, showAllLabel).replace("#1", this.tabCount));
this.showAllButton.hidden = !allTabs.canOpen; this.showAllButton.hidden = !allTabs.canOpen;
}, },
@ -244,30 +303,25 @@ var ctrlTab = {
aPreview._tab = aTab; aPreview._tab = aTab;
if (aPreview.firstChild) if (aPreview._canvas.firstChild) {
aPreview.firstChild.remove(); aPreview._canvas.firstChild.remove();
}
if (aTab) { if (aTab) {
let canvasWidth = this.canvasWidth; aPreview._canvas.appendChild(tabPreviews.get(aTab));
let canvasHeight = this.canvasHeight; aPreview._label.setAttribute("value", aTab.label);
aPreview.appendChild(tabPreviews.get(aTab));
aPreview.setAttribute("label", aTab.label);
aPreview.setAttribute("tooltiptext", aTab.label); aPreview.setAttribute("tooltiptext", aTab.label);
aPreview.setAttribute("canvaswidth", canvasWidth); if (aTab.image) {
aPreview.setAttribute("canvasstyle", aPreview._favicon.setAttribute("src", aTab.image);
"max-width:" + canvasWidth + "px;" + } else {
"min-width:" + canvasWidth + "px;" + aPreview._favicon.removeAttribute("src");
"max-height:" + canvasHeight + "px;" + }
"min-height:" + canvasHeight + "px;");
if (aTab.image)
aPreview.setAttribute("image", aTab.image);
else
aPreview.removeAttribute("image");
aPreview.hidden = false; aPreview.hidden = false;
} else { } else {
aPreview.hidden = true; aPreview.hidden = true;
aPreview.removeAttribute("label"); aPreview._label.removeAttribute("value");
aPreview.removeAttribute("tooltiptext"); aPreview.removeAttribute("tooltiptext");
aPreview.removeAttribute("image"); aPreview._favicon.removeAttribute("src");
} }
}, },

Просмотреть файл

@ -1,35 +0,0 @@
<?xml version="1.0"?>
# -*- Mode: HTML -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
<bindings id="tabPreviews"
xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:xbl="http://www.mozilla.org/xbl">
<binding id="ctrlTab-preview" extends="chrome://global/content/bindings/button.xml#button-base">
<content pack="center">
<xul:vbox class="ctrlTab-preview-inner">
<xul:hbox class="ctrlTab-canvas" xbl:inherits="style=canvasstyle,width=canvaswidth">
<children/>
</xul:hbox>
<xul:hbox class="ctrlTab-favicon-container" xbl:inherits="hidden=noicon">
<xul:image class="ctrlTab-favicon" xbl:inherits="src=image"/>
</xul:hbox>
<xul:label class="ctrlTab-label plain" xbl:inherits="value=label" crop="end"/>
</xul:vbox>
</content>
<handlers>
<handler event="mouseover" action="ctrlTab._mouseOverFocus(this);"/>
<handler event="command" action="ctrlTab.pick(this);"/>
<handler event="click" button="1" action="ctrlTab.remove(this);"/>
#ifdef XP_MACOSX
# Control+click is a right click on OS X
<handler event="click" button="2" action="ctrlTab.pick(this);"/>
#endif
</handlers>
</binding>
</bindings>

Просмотреть файл

@ -952,7 +952,7 @@ html|*#fullscreen-exit-button {
/* ::::: Ctrl-Tab Panel ::::: */ /* ::::: Ctrl-Tab Panel ::::: */
.ctrlTab-preview { .ctrlTab-preview {
-moz-binding: url("chrome://browser/content/browser-tabPreviews.xml#ctrlTab-preview"); -moz-binding: url("chrome://global/content/bindings/button.xml#button-base");
} }

Просмотреть файл

@ -421,17 +421,8 @@
#include ../../components/places/content/placesContextMenu.inc.xul #include ../../components/places/content/placesContextMenu.inc.xul
<panel id="ctrlTab-panel" hidden="true" norestorefocus="true" level="top"> <panel id="ctrlTab-panel" hidden="true" norestorefocus="true" level="top">
<hbox> <hbox id="ctrlTab-previews"/>
<button class="ctrlTab-preview" flex="1"/> <hbox id="ctrlTab-showAll-container" pack="center"/>
<button class="ctrlTab-preview" flex="1"/>
<button class="ctrlTab-preview" flex="1"/>
<button class="ctrlTab-preview" flex="1"/>
<button class="ctrlTab-preview" flex="1"/>
<button class="ctrlTab-preview" flex="1"/>
</hbox>
<hbox pack="center">
<button id="ctrlTab-showAll" class="ctrlTab-preview" noicon="true"/>
</hbox>
</panel> </panel>
<panel id="pageActionPanel" <panel id="pageActionPanel"

Просмотреть файл

@ -143,9 +143,6 @@ with Files("browser-safebrowsing.js"):
with Files("browser-sync.js"): with Files("browser-sync.js"):
BUG_COMPONENT = ("Firefox", "Sync") BUG_COMPONENT = ("Firefox", "Sync")
with Files("browser-tabPreviews.xml"):
BUG_COMPONENT = ("Firefox", "Tabbed Browser")
with Files("contentSearch*"): with Files("contentSearch*"):
BUG_COMPONENT = ("Firefox", "Search") BUG_COMPONENT = ("Firefox", "Search")

Просмотреть файл

@ -72,7 +72,6 @@ browser.jar:
content/browser/browser-sidebar.js (content/browser-sidebar.js) content/browser/browser-sidebar.js (content/browser-sidebar.js)
content/browser/browser-siteIdentity.js (content/browser-siteIdentity.js) content/browser/browser-siteIdentity.js (content/browser-siteIdentity.js)
content/browser/browser-sync.js (content/browser-sync.js) content/browser/browser-sync.js (content/browser-sync.js)
* content/browser/browser-tabPreviews.xml (content/browser-tabPreviews.xml)
content/browser/browser-tabsintitlebar.js (content/browser-tabsintitlebar.js) content/browser/browser-tabsintitlebar.js (content/browser-tabsintitlebar.js)
content/browser/browser-thumbnails.js (content/browser-thumbnails.js) content/browser/browser-thumbnails.js (content/browser-thumbnails.js)
content/browser/browser-trackingprotection.js (content/browser-trackingprotection.js) content/browser/browser-trackingprotection.js (content/browser-trackingprotection.js)

Просмотреть файл

@ -21,8 +21,8 @@
text-shadow: 0 0 1px hsl(0,0%,12%), 0 0 2px hsl(0,0%,12%); text-shadow: 0 0 1px hsl(0,0%,12%), 0 0 2px hsl(0,0%,12%);
} }
.ctrlTab-preview > html|img, .ctrlTab-canvas > html|img,
.ctrlTab-preview > html|canvas { .ctrlTab-canvas > html|canvas {
min-width: inherit; min-width: inherit;
max-width: inherit; max-width: inherit;
min-height: inherit; min-height: inherit;
@ -46,7 +46,7 @@
box-shadow: inset 0 0 0 1px rgba(0,0,0,.1); box-shadow: inset 0 0 0 1px rgba(0,0,0,.1);
} }
.ctrlTab-preview:not(#ctrlTab-showAll) > .ctrlTab-preview-inner > .ctrlTab-canvas { .ctrlTab-canvas {
box-shadow: 1px 1px 2px hsl(0,0%,12%); box-shadow: 1px 1px 2px hsl(0,0%,12%);
margin-bottom: 8px; margin-bottom: 8px;
} }

Просмотреть файл

@ -55,7 +55,6 @@ const PORTRAIT_MODE_WIDTH_THRESHOLD = 700;
const SIDE_PORTAIT_MODE_WIDTH_THRESHOLD = 1000; const SIDE_PORTAIT_MODE_WIDTH_THRESHOLD = 1000;
const SHOW_THREE_PANE_ONBOARDING_PREF = "devtools.inspector.show-three-pane-tooltip"; const SHOW_THREE_PANE_ONBOARDING_PREF = "devtools.inspector.show-three-pane-tooltip";
const SHOW_THREE_PANE_TOGGLE_PREF = "devtools.inspector.three-pane-toggle";
const THREE_PANE_ENABLED_PREF = "devtools.inspector.three-pane-enabled"; const THREE_PANE_ENABLED_PREF = "devtools.inspector.three-pane-enabled";
const THREE_PANE_ENABLED_SCALAR = "devtools.inspector.three_pane_enabled"; const THREE_PANE_ENABLED_SCALAR = "devtools.inspector.three_pane_enabled";
@ -120,7 +119,6 @@ function Inspector(toolbox) {
this.previousURL = this.target.url; this.previousURL = this.target.url;
this.is3PaneModeEnabled = Services.prefs.getBoolPref(THREE_PANE_ENABLED_PREF); this.is3PaneModeEnabled = Services.prefs.getBoolPref(THREE_PANE_ENABLED_PREF);
this.show3PaneToggle = Services.prefs.getBoolPref(SHOW_THREE_PANE_TOGGLE_PREF);
this.show3PaneTooltip = Services.prefs.getBoolPref(SHOW_THREE_PANE_ONBOARDING_PREF); this.show3PaneTooltip = Services.prefs.getBoolPref(SHOW_THREE_PANE_ONBOARDING_PREF);
this.nodeMenuTriggerInfo = null; this.nodeMenuTriggerInfo = null;
@ -776,16 +774,15 @@ Inspector.prototype = {
*/ */
async setupSidebar() { async setupSidebar() {
let sidebar = this.panelDoc.getElementById("inspector-sidebar"); let sidebar = this.panelDoc.getElementById("inspector-sidebar");
let options = { showAllTabsMenu: true }; let options = {
showAllTabsMenu: true,
if (this.show3PaneToggle) { sidebarToggleButton: {
options.sidebarToggleButton = {
collapsed: !this.is3PaneModeEnabled, collapsed: !this.is3PaneModeEnabled,
collapsePaneTitle: INSPECTOR_L10N.getStr("inspector.hideThreePaneMode"), collapsePaneTitle: INSPECTOR_L10N.getStr("inspector.hideThreePaneMode"),
expandPaneTitle: INSPECTOR_L10N.getStr("inspector.showThreePaneMode"), expandPaneTitle: INSPECTOR_L10N.getStr("inspector.showThreePaneMode"),
onClick: this.onSidebarToggle, onClick: this.onSidebarToggle,
}; }
} };
this.sidebar = new ToolSidebar(sidebar, this, "inspector", options); this.sidebar = new ToolSidebar(sidebar, this, "inspector", options);
@ -806,15 +803,6 @@ Inspector.prototype = {
await this.addRuleView(defaultTab); await this.addRuleView(defaultTab);
// If the 3 Pane Inspector feature is disabled, use the old order:
// Rules, Computed, Layout, etc.
if (!this.show3PaneToggle) {
this.sidebar.addExistingTab(
"computedview",
INSPECTOR_L10N.getStr("inspector.sidebar.computedViewTitle"),
defaultTab == "computedview");
}
// Inject a lazy loaded react tab by exposing a fake React object // Inject a lazy loaded react tab by exposing a fake React object
// with a lazy defined Tab thanks to `panel` being a function // with a lazy defined Tab thanks to `panel` being a function
let layoutId = "layoutview"; let layoutId = "layoutview";
@ -839,14 +827,10 @@ Inspector.prototype = {
}, },
defaultTab == layoutId); defaultTab == layoutId);
// If the 3 Pane Inspector feature is enabled, use the new order: this.sidebar.addExistingTab(
// Rules, Layout, Computed, etc. "computedview",
if (this.show3PaneToggle) { INSPECTOR_L10N.getStr("inspector.sidebar.computedViewTitle"),
this.sidebar.addExistingTab( defaultTab == "computedview");
"computedview",
INSPECTOR_L10N.getStr("inspector.sidebar.computedViewTitle"),
defaultTab == "computedview");
}
const animationTitle = const animationTitle =
INSPECTOR_L10N.getStr("inspector.sidebar.animationInspectorTitle"); INSPECTOR_L10N.getStr("inspector.sidebar.animationInspectorTitle");
@ -1355,7 +1339,6 @@ Inspector.prototype = {
this.resultsLength = null; this.resultsLength = null;
this.search = null; this.search = null;
this.searchBox = null; this.searchBox = null;
this.show3PaneToggle = null;
this.show3PaneTooltip = null; this.show3PaneTooltip = null;
this.sidebar = null; this.sidebar = null;
this.store = null; this.store = null;

Просмотреть файл

@ -169,6 +169,7 @@ skip-if = (os == "win" && debug) # bug 963492: win.
[browser_rules_flexbox-toggle_02.js] [browser_rules_flexbox-toggle_02.js]
[browser_rules_flexbox-toggle_03.js] [browser_rules_flexbox-toggle_03.js]
[browser_rules_flexbox-toggle_04.js] [browser_rules_flexbox-toggle_04.js]
[browser_rules_font-family-parsing.js]
[browser_rules_grid-highlighter-on-mutation.js] [browser_rules_grid-highlighter-on-mutation.js]
[browser_rules_grid-highlighter-on-navigate.js] [browser_rules_grid-highlighter-on-navigate.js]
[browser_rules_grid-highlighter-on-reload.js] [browser_rules_grid-highlighter-on-reload.js]

Просмотреть файл

@ -0,0 +1,58 @@
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Tests that the parsed font-family property value shown in the rules
// pane is correct.
const TEST_URI = `
<style type="text/css">
#id1 {
font-family: georgia, arial, sans-serif;
}
#id2 {
font-family: georgia,arial,sans-serif;
}
#id3 {
font-family: georgia ,arial ,sans-serif;
}
#id4 {
font-family: georgia , arial , sans-serif;
}
#id4 {
font-family: arial, georgia, sans-serif ;
}
#id5 {
font-family: helvetica !important;
}
</style>
<div id="id1">1</div>
<div id="id2">2</div>
<div id="id3">3</div>
<div id="id4">4</div>
<div id="id5">5</div>
`;
const TESTS = [
{selector: "#id1", expectedTextContent: "georgia, arial, sans-serif"},
{selector: "#id2", expectedTextContent: "georgia,arial,sans-serif"},
{selector: "#id3", expectedTextContent: "georgia ,arial ,sans-serif"},
{selector: "#id4", expectedTextContent: "arial, georgia, sans-serif"},
{selector: "#id5", expectedTextContent: "helvetica !important"},
];
add_task(async function() {
await addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
let {inspector, view} = await openRuleView();
for (let {selector, expectedTextContent} of TESTS) {
await selectNode(selector, inspector);
info("Looking for font-family property value in selector " + selector);
let prop = getRuleViewProperty(view, selector, "font-family").valueSpan;
is(prop.textContent, expectedTextContent,
"The font-family property value is correct");
}
});

Просмотреть файл

@ -26,6 +26,12 @@ const TEST_URI = `
#id6 { #id6 {
font-family: georgia, arial; font-family: georgia, arial;
} }
#id7 {
font-family: foo, serif !important;
}
#id8 {
font-family: important;
}
</style> </style>
<div id="id1">Text</div> <div id="id1">Text</div>
<div id="id2">Text</div> <div id="id2">Text</div>
@ -33,6 +39,8 @@ const TEST_URI = `
<div id="id4">Text</div> <div id="id4">Text</div>
<div id="id5">Text</div> <div id="id5">Text</div>
<div id="id6">A &#586;</div> <div id="id6">A &#586;</div>
<div id="id7">Text</div>
<div id="id8">Text</div>
`; `;
// Tests that font-family properties in the rule-view correctly // Tests that font-family properties in the rule-view correctly
@ -42,7 +50,7 @@ const TEST_URI = `
// selector: the rule-view selector to look for font-family in // selector: the rule-view selector to look for font-family in
// nb: the number of fonts this property should have // nb: the number of fonts this property should have
// used: the indexes of all the fonts that should be highlighted, or null if none should // used: the indexes of all the fonts that should be highlighted, or null if none should
// be highlighter // be highlighted
// } // }
const TESTS = [ const TESTS = [
{selector: "#id1", nb: 3, used: [2]}, // sans-serif {selector: "#id1", nb: 3, used: [2]}, // sans-serif
@ -50,6 +58,8 @@ const TESTS = [
{selector: "#id3", nb: 4, used: [1]}, // monospace {selector: "#id3", nb: 4, used: [1]}, // monospace
{selector: "#id4", nb: 2, used: null}, {selector: "#id4", nb: 2, used: null},
{selector: "#id5", nb: 1, used: [0]}, // monospace {selector: "#id5", nb: 1, used: [0]}, // monospace
{selector: "#id7", nb: 2, used: [1]}, // serif
{selector: "#id8", nb: 1, used: null},
]; ];
if (Services.appinfo.OS !== "Linux") { if (Services.appinfo.OS !== "Linux") {

Просмотреть файл

@ -52,12 +52,9 @@ pref("devtools.inspector.remote", false);
pref("devtools.inspector.show-three-pane-tooltip", true); pref("devtools.inspector.show-three-pane-tooltip", true);
// Enable the 3 pane mode in the inspector // Enable the 3 pane mode in the inspector
pref("devtools.inspector.three-pane-enabled", true); pref("devtools.inspector.three-pane-enabled", true);
// Enable the 3 pane mode toggle in the inspector
pref("devtools.inspector.three-pane-toggle", true);
#else #else
pref("devtools.inspector.show-three-pane-tooltip", false); pref("devtools.inspector.show-three-pane-tooltip", false);
pref("devtools.inspector.three-pane-enabled", false); pref("devtools.inspector.three-pane-enabled", false);
pref("devtools.inspector.three-pane-toggle", false);
#endif #endif
// Collapse pseudo-elements by default in the rule-view // Collapse pseudo-elements by default in the rule-view

Просмотреть файл

@ -287,6 +287,7 @@ OutputParser.prototype = {
let parenDepth = stopAtCloseParen ? 1 : 0; let parenDepth = stopAtCloseParen ? 1 : 0;
let outerMostFunctionTakesColor = false; let outerMostFunctionTakesColor = false;
let fontFamilyNameParts = []; let fontFamilyNameParts = [];
let previousWasBang = false;
let colorOK = function() { let colorOK = function() {
return options.supportsColor || return options.supportsColor ||
@ -388,7 +389,10 @@ OutputParser.prototype = {
this._appendColor(token.text, options); this._appendColor(token.text, options);
} else if (angleOK(token.text)) { } else if (angleOK(token.text)) {
this._appendAngle(token.text, options); this._appendAngle(token.text, options);
} else if (options.expectFont) { } else if (options.expectFont && !previousWasBang) {
// We don't append the identifier if the previous token
// was equal to '!', since in that case we expect the
// identifier to be equal to 'important'.
fontFamilyNameParts.push(token.text); fontFamilyNameParts.push(token.text);
} else { } else {
this._appendTextNode(text.substring(token.startOffset, this._appendTextNode(text.substring(token.startOffset,
@ -457,7 +461,7 @@ OutputParser.prototype = {
if (parenDepth === 0) { if (parenDepth === 0) {
outerMostFunctionTakesColor = false; outerMostFunctionTakesColor = false;
} }
} else if (token.text === "," && } else if ((token.text === "," || token.text === "!") &&
options.expectFont && fontFamilyNameParts.length !== 0) { options.expectFont && fontFamilyNameParts.length !== 0) {
this._appendFontFamily(fontFamilyNameParts.join(""), options); this._appendFontFamily(fontFamilyNameParts.join(""), options);
fontFamilyNameParts = []; fontFamilyNameParts = [];
@ -475,6 +479,7 @@ OutputParser.prototype = {
token.tokenType === "id" || token.tokenType === "hash" || token.tokenType === "id" || token.tokenType === "hash" ||
token.tokenType === "number" || token.tokenType === "dimension" || token.tokenType === "number" || token.tokenType === "dimension" ||
token.tokenType === "percentage" || token.tokenType === "dimension"); token.tokenType === "percentage" || token.tokenType === "dimension");
previousWasBang = (token.tokenType === "symbol" && token.text === "!");
} }
let result = this._toDOM(); let result = this._toDOM();

Просмотреть файл

@ -112,12 +112,10 @@ function loadFrameScriptUtils(browser = gBrowser.selectedBrowser) {
} }
Services.prefs.setBoolPref("devtools.inspector.three-pane-enabled", true); Services.prefs.setBoolPref("devtools.inspector.three-pane-enabled", true);
Services.prefs.setBoolPref("devtools.inspector.three-pane-toggle", true);
Services.prefs.setBoolPref("devtools.inspector.show-three-pane-tooltip", false); Services.prefs.setBoolPref("devtools.inspector.show-three-pane-tooltip", false);
registerCleanupFunction(() => { registerCleanupFunction(() => {
Services.prefs.clearUserPref("devtools.dump.emit"); Services.prefs.clearUserPref("devtools.dump.emit");
Services.prefs.clearUserPref("devtools.inspector.three-pane-enabled"); Services.prefs.clearUserPref("devtools.inspector.three-pane-enabled");
Services.prefs.clearUserPref("devtools.inspector.three-pane-toggle");
Services.prefs.clearUserPref("devtools.inspector.show-three-pane-tooltip"); Services.prefs.clearUserPref("devtools.inspector.show-three-pane-tooltip");
Services.prefs.clearUserPref("devtools.toolbox.host"); Services.prefs.clearUserPref("devtools.toolbox.host");
Services.prefs.clearUserPref("devtools.toolbox.previousHost"); Services.prefs.clearUserPref("devtools.toolbox.previousHost");

Просмотреть файл

@ -449,6 +449,20 @@ nsINode::GetComposedDocInternal() const
OwnerDoc() : nullptr; OwnerDoc() : nullptr;
} }
DocumentOrShadowRoot*
nsINode::GetUncomposedDocOrConnectedShadowRoot()
{
if (IsInUncomposedDoc()) {
return OwnerDoc();
}
if (IsInComposedDoc() && HasFlag(NODE_IS_IN_SHADOW_TREE)) {
return AsContent()->GetContainingShadow();
}
return nullptr;
}
#ifdef DEBUG #ifdef DEBUG
void void
nsINode::CheckNotNativeAnonymous() const nsINode::CheckNotNativeAnonymous() const

Просмотреть файл

@ -76,6 +76,7 @@ struct BoxQuadOptions;
struct ConvertCoordinateOptions; struct ConvertCoordinateOptions;
class DocGroup; class DocGroup;
class DocumentFragment; class DocumentFragment;
class DocumentOrShadowRoot;
class DOMPoint; class DOMPoint;
class DOMQuad; class DOMQuad;
class DOMRectReadOnly; class DOMRectReadOnly;
@ -687,6 +688,12 @@ public:
return IsInUncomposedDoc() || (IsInShadowTree() && GetComposedDocInternal()); return IsInUncomposedDoc() || (IsInShadowTree() && GetComposedDocInternal());
} }
/**
* Returns OwnerDoc() if the node is in uncomposed document and ShadowRoot if
* the node is in Shadow DOM and is in composed document.
*/
mozilla::dom::DocumentOrShadowRoot* GetUncomposedDocOrConnectedShadowRoot();
/** /**
* The values returned by this function are the ones defined for * The values returned by this function are the ones defined for
* nsIDOMNode.nodeType * nsIDOMNode.nodeType

Просмотреть файл

@ -53,6 +53,7 @@
#include "nsHTMLParts.h" #include "nsHTMLParts.h"
#include "nsContentUtils.h" #include "nsContentUtils.h"
#include "mozilla/dom/DirectionalityUtils.h" #include "mozilla/dom/DirectionalityUtils.h"
#include "mozilla/dom/DocumentOrShadowRoot.h"
#include "nsString.h" #include "nsString.h"
#include "nsUnicharUtils.h" #include "nsUnicharUtils.h"
#include "nsGkAtoms.h" #include "nsGkAtoms.h"
@ -1778,13 +1779,13 @@ nsGenericHTMLFormElement::BindToTree(nsIDocument* aDocument,
aDocument->SetAutoFocusElement(this); aDocument->SetAutoFocusElement(this);
} }
// If @form is set, the element *has* to be in a document, otherwise it // If @form is set, the element *has* to be in a composed document, otherwise
// wouldn't be possible to find an element with the corresponding id. // it wouldn't be possible to find an element with the corresponding id.
// If @form isn't set, the element *has* to have a parent, otherwise it // If @form isn't set, the element *has* to have a parent, otherwise it
// wouldn't be possible to find a form ancestor. // wouldn't be possible to find a form ancestor.
// We should not call UpdateFormOwner if none of these conditions are // We should not call UpdateFormOwner if none of these conditions are
// fulfilled. // fulfilled.
if (HasAttr(kNameSpaceID_None, nsGkAtoms::form) ? !!GetUncomposedDoc() if (HasAttr(kNameSpaceID_None, nsGkAtoms::form) ? IsInComposedDoc()
: !!aParent) { : !!aParent) {
UpdateFormOwner(true, nullptr); UpdateFormOwner(true, nullptr);
} }
@ -1923,9 +1924,9 @@ nsGenericHTMLFormElement::AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
if (aName == nsGkAtoms::form) { if (aName == nsGkAtoms::form) {
// We need a new form id observer. // We need a new form id observer.
//XXXsmaug How should this work in Shadow DOM? DocumentOrShadowRoot* docOrShadow =
nsIDocument* doc = GetUncomposedDoc(); GetUncomposedDocOrConnectedShadowRoot();
if (doc) { if (docOrShadow) {
Element* formIdElement = nullptr; Element* formIdElement = nullptr;
if (aValue && !aValue->IsEmptyString()) { if (aValue && !aValue->IsEmptyString()) {
formIdElement = AddFormIdObserver(); formIdElement = AddFormIdObserver();
@ -2126,36 +2127,21 @@ nsGenericHTMLFormElement::FocusState()
Element* Element*
nsGenericHTMLFormElement::AddFormIdObserver() nsGenericHTMLFormElement::AddFormIdObserver()
{ {
NS_ASSERTION(GetUncomposedDoc(), "When adding a form id observer, "
"we should be in a document!");
nsAutoString formId; nsAutoString formId;
nsIDocument* doc = OwnerDoc(); DocumentOrShadowRoot* docOrShadow = GetUncomposedDocOrConnectedShadowRoot();
GetAttr(kNameSpaceID_None, nsGkAtoms::form, formId); GetAttr(kNameSpaceID_None, nsGkAtoms::form, formId);
NS_ASSERTION(!formId.IsEmpty(), NS_ASSERTION(!formId.IsEmpty(),
"@form value should not be the empty string!"); "@form value should not be the empty string!");
RefPtr<nsAtom> atom = NS_Atomize(formId); RefPtr<nsAtom> atom = NS_Atomize(formId);
return doc->AddIDTargetObserver(atom, FormIdUpdated, this, false); return docOrShadow->AddIDTargetObserver(atom, FormIdUpdated, this, false);
} }
void void
nsGenericHTMLFormElement::RemoveFormIdObserver() nsGenericHTMLFormElement::RemoveFormIdObserver()
{ {
/** DocumentOrShadowRoot* docOrShadow = GetUncomposedDocOrConnectedShadowRoot();
* We are using OwnerDoc() because we don't really care about having the if (!docOrShadow) {
* element actually being in the tree. If it is not and @form value changes,
* this method will be called for nothing but removing an observer which does
* not exist doesn't cost so much (no entry in the hash table) so having a
* boolean for GetUncomposedDoc()/GetOwnerDoc() would make everything look
* more complex for nothing.
*/
nsIDocument* doc = OwnerDoc();
// At this point, we may not have a document anymore. In that case, we can't
// remove the observer. The document did that for us.
if (!doc) {
return; return;
} }
@ -2165,7 +2151,7 @@ nsGenericHTMLFormElement::RemoveFormIdObserver()
"@form value should not be the empty string!"); "@form value should not be the empty string!");
RefPtr<nsAtom> atom = NS_Atomize(formId); RefPtr<nsAtom> atom = NS_Atomize(formId);
doc->RemoveIDTargetObserver(atom, FormIdUpdated, this, false); docOrShadow->RemoveIDTargetObserver(atom, FormIdUpdated, this, false);
} }
@ -2246,10 +2232,9 @@ nsGenericHTMLFormElement::UpdateFormOwner(bool aBindToTree,
element = aFormIdElement; element = aFormIdElement;
} }
NS_ASSERTION(GetUncomposedDoc(), "The element should be in a document " NS_ASSERTION(!IsInComposedDoc() ||
"when UpdateFormOwner is called!"); element == GetUncomposedDocOrConnectedShadowRoot()->
NS_ASSERTION(!GetUncomposedDoc() || GetElementById(formId),
element == GetUncomposedDoc()->GetElementById(formId),
"element should be equals to the current element " "element should be equals to the current element "
"associated with the id in @form!"); "associated with the id in @form!");

Просмотреть файл

@ -61,8 +61,11 @@ interface nsIPaymentDetails : nsISupports
readonly attribute nsIArray shippingOptions; readonly attribute nsIArray shippingOptions;
readonly attribute nsIArray modifiers; readonly attribute nsIArray modifiers;
readonly attribute AString error; readonly attribute AString error;
[implicit_jscontext]
readonly attribute jsval shippingAddressErrors;
void update(in nsIPaymentDetails aDetails, in boolean aRequestShipping); void update(in nsIPaymentDetails aDetails, in boolean aRequestShipping);
AString shippingAddressErrorsJSON();
}; };
[scriptable, builtinclass, uuid(d53f9f20-138e-47cc-9fd5-db16a3f6d301)] [scriptable, builtinclass, uuid(d53f9f20-138e-47cc-9fd5-db16a3f6d301)]

Просмотреть файл

@ -304,13 +304,13 @@ bool InitPreferredSampleRate()
if (sPreferredSampleRate != 0) { if (sPreferredSampleRate != 0) {
return true; return true;
} }
#ifdef MOZ_WIDGET_ANDROID
sPreferredSampleRate = AndroidGetAudioOutputSampleRate();
#else
cubeb* context = GetCubebContextUnlocked(); cubeb* context = GetCubebContextUnlocked();
if (!context) { if (!context) {
return false; return false;
} }
#ifdef MOZ_WIDGET_ANDROID
sPreferredSampleRate = AndroidGetAudioOutputSampleRate();
#else
if (cubeb_get_preferred_sample_rate(context, if (cubeb_get_preferred_sample_rate(context,
&sPreferredSampleRate) != CUBEB_OK) { &sPreferredSampleRate) != CUBEB_OK) {

Просмотреть файл

@ -11,6 +11,9 @@
#include "webrtc/modules/video_capture/video_capture.h" #include "webrtc/modules/video_capture/video_capture.h"
#endif #endif
#ifdef MOZ_WIDGET_ANDROID
#include "mozilla/jni/Utils.h"
#endif
namespace mozilla { namespace mozilla {
namespace camera { namespace camera {
@ -23,10 +26,11 @@ mozilla::LazyLogModule gVideoEngineLog("VideoEngine");
int VideoEngine::sId = 0; int VideoEngine::sId = 0;
#if defined(ANDROID) #if defined(ANDROID)
int VideoEngine::SetAndroidObjects(JavaVM* javaVM) { int VideoEngine::SetAndroidObjects() {
LOG((__PRETTY_FUNCTION__)); LOG((__PRETTY_FUNCTION__));
if (webrtc::SetCaptureAndroidVM(javaVM) != 0) { JavaVM* const javaVM = mozilla::jni::GetVM();
if (!javaVM || webrtc::SetCaptureAndroidVM(javaVM) != 0) {
LOG(("Could not set capture Android VM")); LOG(("Could not set capture Android VM"));
return -1; return -1;
} }
@ -146,6 +150,12 @@ VideoEngine::GetOrCreateVideoCaptureDeviceInfo() {
switch (mCaptureDevInfo.type) { switch (mCaptureDevInfo.type) {
case webrtc::CaptureDeviceType::Camera: { case webrtc::CaptureDeviceType::Camera: {
#ifdef MOZ_WIDGET_ANDROID
if (SetAndroidObjects()) {
LOG(("VideoEngine::SetAndroidObjects Failed"));
break;
}
#endif
mDeviceInfo.reset(webrtc::VideoCaptureFactory::CreateDeviceInfo()); mDeviceInfo.reset(webrtc::VideoCaptureFactory::CreateDeviceInfo());
LOG(("webrtc::CaptureDeviceType::Camera: Finished creating new device.")); LOG(("webrtc::CaptureDeviceType::Camera: Finished creating new device."));
break; break;

Просмотреть файл

@ -37,7 +37,7 @@ public:
static already_AddRefed<VideoEngine> Create(UniquePtr<const webrtc::Config>&& aConfig); static already_AddRefed<VideoEngine> Create(UniquePtr<const webrtc::Config>&& aConfig);
#if defined(ANDROID) #if defined(ANDROID)
static int SetAndroidObjects(JavaVM* javaVM); static int SetAndroidObjects();
#endif #endif
void CreateVideoCapture(int32_t& id, const char* deviceUniqueIdUTF8); void CreateVideoCapture(int32_t& id, const char* deviceUniqueIdUTF8);

Просмотреть файл

@ -19,11 +19,6 @@
#include "nsITabSource.h" #include "nsITabSource.h"
#include "prenv.h" #include "prenv.h"
#ifdef MOZ_WIDGET_ANDROID
#include "AndroidBridge.h"
#include "VideoEngine.h"
#endif
static mozilla::LazyLogModule sGetUserMediaLog("GetUserMedia"); static mozilla::LazyLogModule sGetUserMediaLog("GetUserMedia");
#undef LOG #undef LOG
#define LOG(args) MOZ_LOG(sGetUserMediaLog, mozilla::LogLevel::Debug, args) #define LOG(args) MOZ_LOG(sGetUserMediaLog, mozilla::LogLevel::Debug, args)
@ -136,17 +131,6 @@ MediaEngineWebRTC::EnumerateVideoDevices(uint64_t aWindowId,
mozilla::camera::CaptureEngine capEngine = mozilla::camera::InvalidEngine; mozilla::camera::CaptureEngine capEngine = mozilla::camera::InvalidEngine;
#ifdef MOZ_WIDGET_ANDROID
// get the JVM
JavaVM* jvm;
JNIEnv* const env = jni::GetEnvForThread();
MOZ_ALWAYS_TRUE(!env->GetJavaVM(&jvm));
if (!jvm || mozilla::camera::VideoEngine::SetAndroidObjects(jvm)) {
LOG(("VideoEngine::SetAndroidObjects Failed"));
return;
}
#endif
bool scaryKind = false; // flag sources with cross-origin exploit potential bool scaryKind = false; // flag sources with cross-origin exploit potential
switch (aMediaSource) { switch (aMediaSource) {

Просмотреть файл

@ -4,6 +4,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/PaymentRequestBinding.h"
#include "nsArrayUtils.h" #include "nsArrayUtils.h"
#include "nsIMutableArray.h" #include "nsIMutableArray.h"
#include "nsISupportsPrimitives.h" #include "nsISupportsPrimitives.h"
@ -339,13 +340,15 @@ PaymentDetails::PaymentDetails(const nsAString& aId,
nsIArray* aDisplayItems, nsIArray* aDisplayItems,
nsIArray* aShippingOptions, nsIArray* aShippingOptions,
nsIArray* aModifiers, nsIArray* aModifiers,
const nsAString& aError) const nsAString& aError,
const nsAString& aShippingAddressErrors)
: mId(aId) : mId(aId)
, mTotalItem(aTotalItem) , mTotalItem(aTotalItem)
, mDisplayItems(aDisplayItems) , mDisplayItems(aDisplayItems)
, mShippingOptions(aShippingOptions) , mShippingOptions(aShippingOptions)
, mModifiers(aModifiers) , mModifiers(aModifiers)
, mError(aError) , mError(aError)
, mShippingAddressErrors(aShippingAddressErrors)
{ {
} }
@ -417,7 +420,8 @@ PaymentDetails::Create(const IPCPaymentDetails& aIPCDetails,
nsCOMPtr<nsIPaymentDetails> details = nsCOMPtr<nsIPaymentDetails> details =
new PaymentDetails(aIPCDetails.id(), total, displayItems, shippingOptions, new PaymentDetails(aIPCDetails.id(), total, displayItems, shippingOptions,
modifiers, aIPCDetails.error()); modifiers, aIPCDetails.error(),
aIPCDetails.shippingAddressErrors());
details.forget(aDetails); details.forget(aDetails);
return NS_OK; return NS_OK;
@ -474,6 +478,17 @@ PaymentDetails::GetError(nsAString& aError)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
PaymentDetails::GetShippingAddressErrors(JSContext* aCx, JS::MutableHandleValue aErrors)
{
AddressErrors errors;
errors.Init(mShippingAddressErrors);
if (!ToJSValue(aCx, errors, aErrors)) {
return NS_ERROR_FAILURE;
}
return NS_OK;
}
NS_IMETHODIMP NS_IMETHODIMP
PaymentDetails::Update(nsIPaymentDetails* aDetails, const bool aRequestShipping) PaymentDetails::Update(nsIPaymentDetails* aDetails, const bool aRequestShipping)
{ {
@ -523,9 +538,18 @@ PaymentDetails::Update(nsIPaymentDetails* aDetails, const bool aRequestShipping)
if (NS_WARN_IF(NS_FAILED(rv))) { if (NS_WARN_IF(NS_FAILED(rv))) {
return rv; return rv;
} }
aDetails->ShippingAddressErrorsJSON(mShippingAddressErrors);
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
PaymentDetails::ShippingAddressErrorsJSON(nsAString& aErrors)
{
aErrors = mShippingAddressErrors;
return NS_OK;
}
/* PaymentOptions */ /* PaymentOptions */
NS_IMPL_ISUPPORTS(PaymentOptions, NS_IMPL_ISUPPORTS(PaymentOptions,

Просмотреть файл

@ -137,7 +137,8 @@ private:
nsIArray* aDisplayItems, nsIArray* aDisplayItems,
nsIArray* aShippingOptions, nsIArray* aShippingOptions,
nsIArray* aModifiers, nsIArray* aModifiers,
const nsAString& aError); const nsAString& aError,
const nsAString& aShippingAddressError);
~PaymentDetails() = default; ~PaymentDetails() = default;
@ -147,6 +148,7 @@ private:
nsCOMPtr<nsIArray> mShippingOptions; nsCOMPtr<nsIArray> mShippingOptions;
nsCOMPtr<nsIArray> mModifiers; nsCOMPtr<nsIArray> mModifiers;
nsString mError; nsString mError;
nsString mShippingAddressErrors;
}; };
class PaymentOptions final : public nsIPaymentOptions class PaymentOptions final : public nsIPaymentOptions
@ -185,7 +187,7 @@ public:
nsIArray* aPaymentMethods, nsIArray* aPaymentMethods,
nsIPaymentDetails* aPaymentDetails, nsIPaymentDetails* aPaymentDetails,
nsIPaymentOptions* aPaymentOptions, nsIPaymentOptions* aPaymentOptions,
const nsAString& aShippingOption); const nsAString& aShippingOption);
private: private:
~PaymentRequest() = default; ~PaymentRequest() = default;

Просмотреть файл

@ -178,6 +178,7 @@ ConvertDetailsInit(JSContext* aCx,
shippingOptions, shippingOptions,
modifiers, modifiers,
EmptyString(), // error message EmptyString(), // error message
EmptyString(), // shippingAddressErrors
aDetails.mDisplayItems.WasPassed(), aDetails.mDisplayItems.WasPassed(),
aDetails.mShippingOptions.WasPassed(), aDetails.mShippingOptions.WasPassed(),
aDetails.mModifiers.WasPassed()); aDetails.mModifiers.WasPassed());
@ -211,12 +212,18 @@ ConvertDetailsUpdate(JSContext* aCx,
error = aDetails.mError.Value(); error = aDetails.mError.Value();
} }
nsString shippingAddressErrors(EmptyString());
if (!aDetails.mShippingAddressErrors.ToJSON(shippingAddressErrors)) {
return NS_ERROR_FAILURE;
}
aIPCDetails = IPCPaymentDetails(EmptyString(), // id aIPCDetails = IPCPaymentDetails(EmptyString(), // id
total, total,
displayItems, displayItems,
shippingOptions, shippingOptions,
modifiers, modifiers,
error, error,
shippingAddressErrors,
aDetails.mDisplayItems.WasPassed(), aDetails.mDisplayItems.WasPassed(),
aDetails.mShippingOptions.WasPassed(), aDetails.mShippingOptions.WasPassed(),
aDetails.mModifiers.WasPassed()); aDetails.mModifiers.WasPassed());

Просмотреть файл

@ -55,6 +55,7 @@ struct IPCPaymentDetails
IPCPaymentShippingOption[] shippingOptions; IPCPaymentShippingOption[] shippingOptions;
IPCPaymentDetailsModifier[] modifiers; IPCPaymentDetailsModifier[] modifiers;
nsString error; nsString error;
nsString shippingAddressErrors;
bool displayItemsPassed; bool displayItemsPassed;
bool shippingOptionsPassed; bool shippingOptionsPassed;
bool modifiersPassed; bool modifiersPassed;

Просмотреть файл

@ -0,0 +1,158 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
const paymentSrv = Cc["@mozilla.org/dom/payments/payment-request-service;1"].getService(Ci.nsIPaymentRequestService);
function emitTestFail(message) {
sendAsyncMessage("test-fail", message);
}
function emitTestPass(message) {
sendAsyncMessage("test-pass", message);
}
const shippingAddress = Cc["@mozilla.org/dom/payments/payment-address;1"].
createInstance(Ci.nsIPaymentAddress);
const addressLine = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
const address = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
address.data = "Easton Ave";
addressLine.appendElement(address);
shippingAddress.init("USA", // country
addressLine, // address line
"CA", // region
"San Bruno", // city
"Test locality", // dependent locality
"94066", // postal code
"123456", // sorting code
"en", // language code
"Testing Org", // organization
"Bill A. Pacheco", // recipient
"+1-434-441-3879"); // phone
function acceptShow(requestId) {
const responseData = Cc["@mozilla.org/dom/payments/general-response-data;1"].
createInstance(Ci.nsIGeneralResponseData);
responseData.initData({ paymentToken: "6880281f-0df3-4b8e-916f-66575e2457c1",});
let showResponse = Cc["@mozilla.org/dom/payments/payment-show-action-response;1"].
createInstance(Ci.nsIPaymentShowActionResponse);
showResponse.init(requestId,
Ci.nsIPaymentActionResponse.PAYMENT_ACCEPTED,
"testing-payment-method", // payment method
responseData, // payment method data
"Bill A. Pacheco", // payer name
"", // payer email
""); // payer phone
paymentSrv.respondPayment(showResponse.QueryInterface(Ci.nsIPaymentActionResponse));
}
function rejectShow(requestId) {
const responseData = Cc["@mozilla.org/dom/payments/general-response-data;1"].
createInstance(Ci.nsIGeneralResponseData);
responseData.initData({});
const showResponse = Cc["@mozilla.org/dom/payments/payment-show-action-response;1"].
createInstance(Ci.nsIPaymentShowActionResponse);
showResponse.init(requestId,
Ci.nsIPaymentActionResponse.PAYMENT_REJECTED,
"", // payment method
responseData, // payment method data
"", // payer name
"", // payer email
""); // payer phone
paymentSrv.respondPayment(showResponse.QueryInterface(Ci.nsIPaymentActionResponse));
}
function updateShow(requestId) {
paymentSrv.changeShippingAddress(requestId, shippingAddress);
}
function showRequest(requestId) {
updateShow(requestId);
}
function abortRequest(requestId) {
let abortResponse = Cc["@mozilla.org/dom/payments/payment-abort-action-response;1"].
createInstance(Ci.nsIPaymentAbortActionResponse);
abortResponse.init(requestId, Ci.nsIPaymentActionResponse.ABORT_SUCCEEDED);
paymentSrv.respondPayment(abortResponse);
}
function completeRequest(requestId) {
let payRequest = paymentSrv.getPaymentRequestById(requestId);
let completeResponse = Cc["@mozilla.org/dom/payments/payment-complete-action-response;1"].
createInstance(Ci.nsIPaymentCompleteActionResponse);
completeResponse.init(requestId, Ci.nsIPaymentActionResponse.COMPLETE_SUCCEEDED);
paymentSrv.respondPayment(completeResponse.QueryInterface(Ci.nsIPaymentActionResponse));
}
function checkAddressErrors(errors) {
if (!errors) {
emitTestFail("Expect non-null shippingAddressErrors, but got null.");
}
if (errors.addressLine != "addressLine error") {
emitTestFail("Expect shippingAddressErrors.addressLine as 'addressLine error', but got" +
errors.addressLine);
}
if (errors.city != "city error") {
emitTestFail("Expect shippingAddressErrors.city as 'city error', but got" +
errors.city);
}
if (errors.dependentLocality != "dependentLocality error") {
emitTestFail("Expect shippingAddressErrors.dependentLocality as 'dependentLocality error', but got" +
errors.dependentLocality);
}
if (errors.languageCode != "languageCode error") {
emitTestFail("Expect shippingAddressErrors.languageCode as 'languageCode error', but got" +
errors.languageCode);
}
if (errors.organization != "organization error") {
emitTestFail("Expect shippingAddressErrors.organization as 'organization error', but got" +
errors.organization);
}
if (errors.phone != "phone error") {
emitTestFail("Expect shippingAddressErrors.phone as 'phone error', but got" +
errors.phone);
}
if (errors.postalCode != "postalCode error") {
emitTestFail("Expect shippingAddressErrors.postalCode as 'postalCode error', but got" +
errors.postalCode);
}
if (errors.recipient != "recipient error") {
emitTestFail("Expect shippingAddressErrors.recipient as 'recipient error', but got" +
errors.recipient);
}
if (errors.region != "region error") {
emitTestFail("Expect shippingAddressErrors.region as 'region error', but got" +
errors.region);
}
if (errors.sortingCode != "sortingCode error") {
emitTestFail("Expect shippingAddressErrors.sortingCode as 'sortingCode error', but got" +
errors.sortingCode);
}
}
function updateRequest(requestId) {
let request = paymentSrv.getPaymentRequestById(requestId);
const addressErrors = request.paymentDetails.shippingAddressErrors;
const payerErrors = request.paymentDetails.payerErrors;
checkAddressErrors(addressErrors);
rejectShow(requestId);
}
const DummyUIService = {
showPayment: showRequest,
abortPayment: abortRequest,
completePayment: completeRequest,
updatePayment: updateRequest,
QueryInterface: ChromeUtils.generateQI([Ci.nsIPaymentUIService]),
};
paymentSrv.setTestingUIService(DummyUIService.QueryInterface(Ci.nsIPaymentUIService));
addMessageListener("teardown", function() {
paymentSrv.cleanup();
paymentSrv.setTestingUIService(null);
sendAsyncMessage('teardown-complete');
});

Просмотреть файл

@ -11,9 +11,10 @@ support-files =
DefaultData.js DefaultData.js
GeneralChromeScript.js GeneralChromeScript.js
PMIValidationChromeScript.js PMIValidationChromeScript.js
RequestShippingChromeScript.js
ShippingOptionsChromeScript.js ShippingOptionsChromeScript.js
ShowPaymentChromeScript.js ShowPaymentChromeScript.js
RequestShippingChromeScript.js UpdateErrorsChromeScript.js
[test_abortPayment.html] [test_abortPayment.html]
run-if = nightly_build # Bug 1390018: Depends on the Nightly-only UI service run-if = nightly_build # Bug 1390018: Depends on the Nightly-only UI service
@ -29,3 +30,4 @@ run-if = nightly_build # Bug 1390737: Depends on the Nightly-only UI service
[test_requestShipping.html] [test_requestShipping.html]
[test_shippingOptions.html] [test_shippingOptions.html]
[test_showPayment.html] [test_showPayment.html]
[test_update_errors.html]

Просмотреть файл

@ -0,0 +1,122 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1435157
-->
<head>
<meta charset="utf-8">
<title>Test for Bug 1435157</title>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="DefaultData.js"></script>
<script type="application/javascript">
"use strict";
SimpleTest.waitForExplicitFinish();
var gUrl = SimpleTest.getTestFileURL('UpdateErrorsChromeScript.js');
var gScript = SpecialPowers.loadChromeScript(gUrl);
function testFailHandler(message) {
ok(false, message);
}
function testPassHandler(message) {
ok(true, message);
}
gScript.addMessageListener("test-fail", testFailHandler);
gScript.addMessageListener("test-pass", testPassHandler);
const addressErrors = {
addressLine: "addressLine error",
city: "city error",
country: "country error",
dependentLocality: "dependentLocality error",
languageCode: "languageCode error",
organization: "organization error",
phone: "phone error",
postalCode: "postalCode error",
recipient: "recipient error",
region: "region error",
regionCode: "regionCode error",
sortingCode: "sortingCode error",
};
const payErrors = {
email: "email error",
name: "name error",
phone: "phone error",
};
let updateDetails = {
total:{
label: "Total",
amount: {
currency: "USD",
value: "1.00",
},
},
erros: "shipping address error",
shippingAddressErrors: addressErrors,
payerErrors: payErrors,
}
// testing functions
function testUpdateErrors() {
return new Promise((resolve, reject) => {
const payRequest = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions);
payRequest.addEventListener("shippingaddresschange", event => {
event.updateWith(updateDetails);
});
payRequest.addEventListener("shippingoptionchange", event => {
event.updateWith(updatedDetails);
});
const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true);
payRequest.show().then(response => {
ok(false, "Expected AbortError, but got pass");
resolve();
}, error => {
is(error.name, "AbortError", "Expect AbortError, but got " + error.name);
resolve();
}).catch( e => {
ok(false, "Unexpected error: " + e.name);
resolve();
}).finally(handler.destruct);
});
}
// teardown function
function teardown() {
gScript.addMessageListener("teardown-complete", function teardownCompleteHandler() {
gScript.removeMessageListener("teardown-complete", teardownCompleteHandler);
gScript.removeMessageListener("test-fail", testFailHandler);
gScript.removeMessageListener("test-pass", testPassHandler);
gScript.destroy();
SimpleTest.finish();
});
gScript.sendAsyncMessage("teardown");
}
// test main body
function runTests() {
testUpdateErrors()
.then(teardown)
.catch( e => {
ok(false, "Unexpected error: " + e.name);
SimpleTest.finish();
});
}
window.addEventListener('load', function() {
SpecialPowers.pushPrefEnv({
'set': [
['dom.payments.request.enabled', true],
]
}, runTests);
});
</script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1435157">Mozilla Bug 1435157</a>
</body>
</html>

Просмотреть файл

@ -12,6 +12,35 @@
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
namespace {
void
GetURLSpecFromChannel(nsITimedChannel* aChannel, nsAString& aSpec)
{
aSpec.AssignLiteral("document");
nsCOMPtr<nsIChannel> channel = do_QueryInterface(aChannel);
if (!channel) {
return;
}
nsCOMPtr<nsIURI> uri;
nsresult rv = channel->GetURI(getter_AddRefs(uri));
if (NS_WARN_IF(NS_FAILED(rv)) || !uri) {
return;
}
nsAutoCString spec;
rv = uri->GetSpec(spec);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
aSpec = NS_ConvertUTF8toUTF16(spec);
}
} // anonymous
NS_IMPL_CYCLE_COLLECTION_CLASS(PerformanceMainThread) NS_IMPL_CYCLE_COLLECTION_CLASS(PerformanceMainThread)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PerformanceMainThread, NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PerformanceMainThread,
@ -293,7 +322,10 @@ PerformanceMainThread::EnsureDocEntry()
timing->SetPropertiesFromHttpChannel(httpChannel); timing->SetPropertiesFromHttpChannel(httpChannel);
} }
mDocEntry = new PerformanceNavigationTiming(Move(timing), this); nsAutoString name;
GetURLSpecFromChannel(mChannel, name);
mDocEntry = new PerformanceNavigationTiming(Move(timing), this, name);
} }
} }
@ -307,9 +339,12 @@ PerformanceMainThread::CreateDocumentEntry(nsITimedChannel* aChannel)
return; return;
} }
nsAutoString name;
GetURLSpecFromChannel(aChannel, name);
UniquePtr<PerformanceTimingData> timing( UniquePtr<PerformanceTimingData> timing(
new PerformanceTimingData(aChannel, nullptr, 0)); new PerformanceTimingData(aChannel, nullptr, 0));
mDocEntry = new PerformanceNavigationTiming(Move(timing), this); mDocEntry = new PerformanceNavigationTiming(Move(timing), this, name);
} }
void void

Просмотреть файл

@ -30,12 +30,13 @@ public:
// performance.timing object for which timestamps are absolute and has a // performance.timing object for which timestamps are absolute and has a
// zeroTime initialized to navigationStart // zeroTime initialized to navigationStart
PerformanceNavigationTiming(UniquePtr<PerformanceTimingData>&& aPerformanceTiming, PerformanceNavigationTiming(UniquePtr<PerformanceTimingData>&& aPerformanceTiming,
Performance* aPerformance) Performance* aPerformance,
: PerformanceResourceTiming(Move(aPerformanceTiming), aPerformance, const nsAString& aName)
NS_LITERAL_STRING("document")) { : PerformanceResourceTiming(Move(aPerformanceTiming), aPerformance, aName)
SetEntryType(NS_LITERAL_STRING("navigation")); {
SetInitiatorType(NS_LITERAL_STRING("navigation")); SetEntryType(NS_LITERAL_STRING("navigation"));
} SetInitiatorType(NS_LITERAL_STRING("navigation"));
}
DOMHighResTimeStamp Duration() const override DOMHighResTimeStamp Duration() const override
{ {

Просмотреть файл

@ -54,9 +54,25 @@ dictionary PaymentDetailsInit : PaymentDetailsBase {
required PaymentItem total; required PaymentItem total;
}; };
dictionary AddressErrors {
DOMString addressLine;
DOMString city;
DOMString country;
DOMString dependentLocality;
DOMString languageCode;
DOMString organization;
DOMString phone;
DOMString postalCode;
DOMString recipient;
DOMString region;
DOMString regionCode;
DOMString sortingCode;
};
dictionary PaymentDetailsUpdate : PaymentDetailsBase { dictionary PaymentDetailsUpdate : PaymentDetailsBase {
DOMString error; DOMString error;
PaymentItem total; AddressErrors shippingAddressErrors;
PaymentItem total;
}; };
enum PaymentShippingType { enum PaymentShippingType {

Просмотреть файл

@ -1211,7 +1211,7 @@ public:
extras->jsPathPrefix.Assign(mRtPath); extras->jsPathPrefix.Assign(mRtPath);
extras->jsPathPrefix += nsPrintfCString("zone(0x%p)/", extras->jsPathPrefix += nsPrintfCString("zone(0x%p)/",
(void *)js::GetCompartmentZone(aCompartment)); (void *)js::GetCompartmentZone(aCompartment));
extras->jsPathPrefix += js::IsAtomsCompartment(aCompartment) extras->jsPathPrefix += js::IsAtomsRealm(JS::GetRealmForCompartment(aCompartment))
? NS_LITERAL_CSTRING("realm(web-worker-atoms)/") ? NS_LITERAL_CSTRING("realm(web-worker-atoms)/")
: NS_LITERAL_CSTRING("realm(web-worker)/"); : NS_LITERAL_CSTRING("realm(web-worker)/");

Просмотреть файл

@ -0,0 +1,29 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#include "SkMemoryReporter.h"
#include "skia/include/core/SkGraphics.h"
namespace mozilla {
namespace gfx {
NS_IMETHODIMP
SkMemoryReporter::CollectReports(nsIHandleReportCallback* aHandleReport,
nsISupports* aData,
bool aAnonymize)
{
MOZ_COLLECT_REPORT(
"explicit/skia-font-cache", KIND_HEAP, UNITS_BYTES,
SkGraphics::GetFontCacheUsed(),
"Memory used in the skia font cache.");
return NS_OK;
}
NS_IMPL_ISUPPORTS(SkMemoryReporter, nsIMemoryReporter);
} // namespace gfx
} // namespace mozilla

Просмотреть файл

@ -0,0 +1,31 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef GFX_SKMEMORYREPORTER_H
#define GFX_SKMEMORYREPORTER_H
#include "nsIMemoryReporter.h"
namespace mozilla {
namespace gfx {
class SkMemoryReporter final : public nsIMemoryReporter
{
public:
NS_DECL_ISUPPORTS
NS_IMETHOD CollectReports(nsIHandleReportCallback* aHandleReport,
nsISupports* aData,
bool aAnonymize) override;
private:
~SkMemoryReporter() {}
};
} // namespace gfx
} // namespace mozilla
#endif /* GFX_SKMEMORYREPORTER_H */

Просмотреть файл

@ -106,6 +106,7 @@
# ifdef MOZ_ENABLE_FREETYPE # ifdef MOZ_ENABLE_FREETYPE
# include "skia/include/ports/SkTypeface_cairo.h" # include "skia/include/ports/SkTypeface_cairo.h"
# endif # endif
# include "mozilla/gfx/SkMemoryReporter.h"
# ifdef __GNUC__ # ifdef __GNUC__
# pragma GCC diagnostic pop // -Wshadow # pragma GCC diagnostic pop // -Wshadow
# endif # endif
@ -839,6 +840,9 @@ gfxPlatform::Init()
} }
RegisterStrongMemoryReporter(new GfxMemoryImageReporter()); RegisterStrongMemoryReporter(new GfxMemoryImageReporter());
#ifdef USE_SKIA
RegisterStrongMemoryReporter(new SkMemoryReporter());
#endif
mlg::InitializeMemoryReporters(); mlg::InitializeMemoryReporters();
#ifdef USE_SKIA #ifdef USE_SKIA

Просмотреть файл

@ -65,6 +65,11 @@ EXPORTS.mozilla.gfx += [
'PrintTargetThebes.h', 'PrintTargetThebes.h',
] ]
if CONFIG['MOZ_ENABLE_SKIA']:
EXPORTS.mozilla.gfx += [
'SkMemoryReporter.h'
]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android': if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
EXPORTS += [ EXPORTS += [
'gfxAndroidPlatform.h', 'gfxAndroidPlatform.h',
@ -212,6 +217,11 @@ UNIFIED_SOURCES += [
'VsyncSource.cpp', 'VsyncSource.cpp',
] ]
if CONFIG['MOZ_ENABLE_SKIA']:
UNIFIED_SOURCES += [
'SkMemoryReporter.cpp',
]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
UNIFIED_SOURCES += [ UNIFIED_SOURCES += [
'gfxMacPlatformFontList.mm', 'gfxMacPlatformFontList.mm',

Просмотреть файл

@ -98,7 +98,7 @@ extern JS_PUBLIC_API(void)
SetRealmNameCallback(JSContext* cx, RealmNameCallback callback); SetRealmNameCallback(JSContext* cx, RealmNameCallback callback);
// Get the global object for the given realm. Returns null only if `realm` is // Get the global object for the given realm. Returns null only if `realm` is
// in the atoms compartment. // the atoms realm.
extern JS_PUBLIC_API(JSObject*) extern JS_PUBLIC_API(JSObject*)
GetRealmGlobalOrNull(Handle<Realm*> realm); GetRealmGlobalOrNull(Handle<Realm*> realm);

Просмотреть файл

@ -225,7 +225,7 @@ DataViewObject::constructWrapped(JSContext* cx, HandleObject bufobj, const CallA
if (!GetPrototypeFromBuiltinConstructor(cx, args, &proto)) if (!GetPrototypeFromBuiltinConstructor(cx, args, &proto))
return false; return false;
Rooted<GlobalObject*> global(cx, cx->compartment()->maybeGlobal()); Rooted<GlobalObject*> global(cx, cx->realm()->maybeGlobal());
if (!proto) { if (!proto) {
proto = GlobalObject::getOrCreateDataViewPrototype(cx, global); proto = GlobalObject::getOrCreateDataViewPrototype(cx, global);
if (!proto) if (!proto)

Просмотреть файл

@ -1986,7 +1986,7 @@ CreateObjectConstructor(JSContext* cx, JSProtoKey key)
static JSObject* static JSObject*
CreateObjectPrototype(JSContext* cx, JSProtoKey key) CreateObjectPrototype(JSContext* cx, JSProtoKey key)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
MOZ_ASSERT(cx->global()->isNative()); MOZ_ASSERT(cx->global()->isNative());
/* /*

Просмотреть файл

@ -852,7 +852,7 @@ enum GetCapabilitiesExecutorSlots {
static MOZ_MUST_USE PromiseObject* static MOZ_MUST_USE PromiseObject*
CreatePromiseObjectWithoutResolutionFunctions(JSContext* cx) CreatePromiseObjectWithoutResolutionFunctions(JSContext* cx)
{ {
Rooted<PromiseObject*> promise(cx, CreatePromiseObjectInternal(cx)); PromiseObject* promise = CreatePromiseObjectInternal(cx);
if (!promise) if (!promise)
return nullptr; return nullptr;
@ -2508,7 +2508,7 @@ MOZ_MUST_USE PromiseObject*
js::CreatePromiseObjectForAsync(JSContext* cx, HandleValue generatorVal) js::CreatePromiseObjectForAsync(JSContext* cx, HandleValue generatorVal)
{ {
// Step 1. // Step 1.
Rooted<PromiseObject*> promise(cx, CreatePromiseObjectWithoutResolutionFunctions(cx)); PromiseObject* promise = CreatePromiseObjectWithoutResolutionFunctions(cx);
if (!promise) if (!promise)
return nullptr; return nullptr;

Просмотреть файл

@ -3136,13 +3136,26 @@ CharSplitHelper(JSContext* cx, HandleLinearString str, uint32_t limit, HandleObj
RootedArrayObject splits(cx, NewFullyAllocatedStringArray(cx, group, resultlen)); RootedArrayObject splits(cx, NewFullyAllocatedStringArray(cx, group, resultlen));
if (!splits) if (!splits)
return nullptr; return nullptr;
splits->ensureDenseInitializedLength(cx, 0, resultlen);
for (size_t i = 0; i < resultlen; ++i) { if (str->hasLatin1Chars()) {
JSString* sub = staticStrings.getUnitStringForElement(cx, str, i); splits->setDenseInitializedLength(resultlen);
if (!sub)
return nullptr; JS::AutoCheckCannotGC nogc;
splits->initDenseElement(i, StringValue(sub)); const Latin1Char* latin1Chars = str->latin1Chars(nogc);
for (size_t i = 0; i < resultlen; ++i) {
Latin1Char c = latin1Chars[i];
MOZ_ASSERT(staticStrings.hasUnit(c));
splits->initDenseElement(i, StringValue(staticStrings.getUnit(c)));
}
} else {
splits->ensureDenseInitializedLength(cx, 0, resultlen);
for (size_t i = 0; i < resultlen; ++i) {
JSString* sub = staticStrings.getUnitStringForElement(cx, str, i);
if (!sub)
return nullptr;
splits->initDenseElement(i, StringValue(sub));
}
} }
return splits; return splits;

Просмотреть файл

@ -86,7 +86,7 @@ GCRuntime::tryNewNurseryObject(JSContext* cx, size_t thingSize, size_t nDynamicS
MOZ_ASSERT(cx->isNurseryAllocAllowed()); MOZ_ASSERT(cx->isNurseryAllocAllowed());
MOZ_ASSERT(!cx->isNurseryAllocSuppressed()); MOZ_ASSERT(!cx->isNurseryAllocSuppressed());
MOZ_ASSERT(!IsAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
JSObject* obj = cx->nursery().allocateObject(cx, thingSize, nDynamicSlots, clasp); JSObject* obj = cx->nursery().allocateObject(cx, thingSize, nDynamicSlots, clasp);
if (obj) if (obj)
@ -140,7 +140,7 @@ GCRuntime::tryNewNurseryString(JSContext* cx, size_t thingSize, AllocKind kind)
MOZ_ASSERT(cx->isNurseryAllocAllowed()); MOZ_ASSERT(cx->isNurseryAllocAllowed());
MOZ_ASSERT(!cx->helperThread()); MOZ_ASSERT(!cx->helperThread());
MOZ_ASSERT(!cx->isNurseryAllocSuppressed()); MOZ_ASSERT(!cx->isNurseryAllocSuppressed());
MOZ_ASSERT(!IsAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
Cell* cell = cx->nursery().allocateString(cx->zone(), thingSize, kind); Cell* cell = cx->nursery().allocateString(cx->zone(), thingSize, kind);
if (cell) if (cell)
@ -275,13 +275,13 @@ GCRuntime::checkAllocatorState(JSContext* cx, AllocKind kind)
} }
#if defined(JS_GC_ZEAL) || defined(DEBUG) #if defined(JS_GC_ZEAL) || defined(DEBUG)
MOZ_ASSERT_IF(cx->compartment()->isAtomsCompartment(), MOZ_ASSERT_IF(cx->realm()->isAtomsRealm(),
kind == AllocKind::ATOM || kind == AllocKind::ATOM ||
kind == AllocKind::FAT_INLINE_ATOM || kind == AllocKind::FAT_INLINE_ATOM ||
kind == AllocKind::SYMBOL || kind == AllocKind::SYMBOL ||
kind == AllocKind::JITCODE || kind == AllocKind::JITCODE ||
kind == AllocKind::SCOPE); kind == AllocKind::SCOPE);
MOZ_ASSERT_IF(!cx->compartment()->isAtomsCompartment(), MOZ_ASSERT_IF(!cx->realm()->isAtomsRealm(),
kind != AllocKind::ATOM && kind != AllocKind::ATOM &&
kind != AllocKind::FAT_INLINE_ATOM); kind != AllocKind::FAT_INLINE_ATOM);
MOZ_ASSERT(!JS::CurrentThreadIsHeapBusy()); MOZ_ASSERT(!JS::CurrentThreadIsHeapBusy());

Просмотреть файл

@ -83,7 +83,7 @@ AtomMarkingRuntime::computeBitmapFromChunkMarkBits(JSRuntime* runtime, DenseBitm
if (!bitmap.ensureSpace(allocatedWords)) if (!bitmap.ensureSpace(allocatedWords))
return false; return false;
Zone* atomsZone = runtime->unsafeAtomsCompartment()->zone(); Zone* atomsZone = runtime->unsafeAtomsRealm()->zone();
for (auto thingKind : AllAllocKinds()) { for (auto thingKind : AllAllocKinds()) {
for (ArenaIter aiter(atomsZone, thingKind); !aiter.done(); aiter.next()) { for (ArenaIter aiter(atomsZone, thingKind); !aiter.done(); aiter.next()) {
Arena* arena = aiter.get(); Arena* arena = aiter.get();
@ -117,7 +117,7 @@ AddBitmapToChunkMarkBits(JSRuntime* runtime, Bitmap& bitmap)
static_assert(ArenaBitmapBits == ArenaBitmapWords * JS_BITS_PER_WORD, static_assert(ArenaBitmapBits == ArenaBitmapWords * JS_BITS_PER_WORD,
"ArenaBitmapWords must evenly divide ArenaBitmapBits"); "ArenaBitmapWords must evenly divide ArenaBitmapBits");
Zone* atomsZone = runtime->unsafeAtomsCompartment()->zone(); Zone* atomsZone = runtime->unsafeAtomsRealm()->zone();
for (auto thingKind : AllAllocKinds()) { for (auto thingKind : AllAllocKinds()) {
for (ArenaIter aiter(atomsZone, thingKind); !aiter.done(); aiter.next()) { for (ArenaIter aiter(atomsZone, thingKind); !aiter.done(); aiter.next()) {
Arena* arena = aiter.get(); Arena* arena = aiter.get();

Просмотреть файл

@ -2570,17 +2570,17 @@ GCRuntime::sweepZoneAfterCompacting(Zone* zone)
if (jit::JitZone* jitZone = zone->jitZone()) if (jit::JitZone* jitZone = zone->jitZone())
jitZone->sweep(); jitZone->sweep();
for (CompartmentsInZoneIter c(zone); !c.done(); c.next()) { for (RealmsInZoneIter r(zone); !r.done(); r.next()) {
c->objectGroups.sweep(); r->objectGroups.sweep();
c->sweepRegExps(); r->sweepRegExps();
c->sweepSavedStacks(); r->sweepSavedStacks();
c->sweepVarNames(); r->sweepVarNames();
c->sweepGlobalObject(); r->sweepGlobalObject();
c->sweepSelfHostingScriptSource(); r->sweepSelfHostingScriptSource();
c->sweepDebugEnvironments(); r->sweepDebugEnvironments();
c->sweepJitCompartment(); r->sweepJitCompartment();
c->sweepNativeIterators(); r->sweepNativeIterators();
c->sweepTemplateObjects(); r->sweepTemplateObjects();
} }
} }
@ -3388,7 +3388,7 @@ GCRuntime::triggerZoneGC(Zone* zone, JS::gcreason::Reason reason, size_t used, s
#endif #endif
if (zone->isAtomsZone()) { if (zone->isAtomsZone()) {
/* We can't do a zone GC of the atoms compartment. */ /* We can't do a zone GC of the atoms zone. */
if (rt->mainContextFromOwnThread()->keepAtoms || rt->hasHelperThreadZones()) { if (rt->mainContextFromOwnThread()->keepAtoms || rt->hasHelperThreadZones()) {
/* Skip GC and retrigger later, since atoms zone won't be collected /* Skip GC and retrigger later, since atoms zone won't be collected
* if keepAtoms is true. */ * if keepAtoms is true. */
@ -3845,7 +3845,7 @@ Zone::sweepCompartments(FreeOp* fop, bool keepAtleastOne, bool destroyingRuntime
bool foundOne = false; bool foundOne = false;
while (read < end) { while (read < end) {
JSCompartment* comp = *read++; JSCompartment* comp = *read++;
MOZ_ASSERT(!rt->isAtomsCompartment(comp)); MOZ_ASSERT(!JS::GetRealmForCompartment(comp)->isAtomsRealm());
/* /*
* Don't delete the last compartment if all the ones before it were * Don't delete the last compartment if all the ones before it were
@ -4490,7 +4490,7 @@ GCRuntime::markCompartments()
for (GCCompartmentsIter comp(rt); !comp.done(); comp.next()) { for (GCCompartmentsIter comp(rt); !comp.done(); comp.next()) {
MOZ_ASSERT(!comp->scheduledForDestruction); MOZ_ASSERT(!comp->scheduledForDestruction);
if (!comp->maybeAlive && !rt->isAtomsCompartment(comp)) if (!comp->maybeAlive && !JS::GetRealmForCompartment(comp)->isAtomsRealm())
comp->scheduledForDestruction = true; comp->scheduledForDestruction = true;
} }
} }
@ -5334,9 +5334,9 @@ GCRuntime::endMarkingSweepGroup(FreeOp* fop, SliceBudget& budget)
/* /*
* Change state of current group to MarkGray to restrict marking to this * Change state of current group to MarkGray to restrict marking to this
* group. Note that there may be pointers to the atoms compartment, and * group. Note that there may be pointers to the atoms zone, and
* these will be marked through, as they are not marked with * these will be marked through, as they are not marked with
* MarkCrossCompartmentXXX. * TraceCrossCompartmentEdge.
*/ */
for (SweepGroupZonesIter zone(rt); !zone.done(); zone.next()) for (SweepGroupZonesIter zone(rt); !zone.done(); zone.next())
zone->changeGCState(Zone::Mark, Zone::MarkGray); zone->changeGCState(Zone::Mark, Zone::MarkGray);
@ -5402,8 +5402,8 @@ UpdateAtomsBitmap(GCParallelTask* task)
// For convenience sweep these tables non-incrementally as part of bitmap // For convenience sweep these tables non-incrementally as part of bitmap
// sweeping; they are likely to be much smaller than the main atoms table. // sweeping; they are likely to be much smaller than the main atoms table.
runtime->unsafeSymbolRegistry().sweep(); runtime->unsafeSymbolRegistry().sweep();
for (CompartmentsIter comp(runtime, SkipAtoms); !comp.done(); comp.next()) for (RealmsIter realm(runtime, SkipAtoms); !realm.done(); realm.next())
comp->sweepVarNames(); realm->sweepVarNames();
} }
static void static void
@ -5426,13 +5426,13 @@ static void
SweepMisc(GCParallelTask* task) SweepMisc(GCParallelTask* task)
{ {
JSRuntime* runtime = task->runtime(); JSRuntime* runtime = task->runtime();
for (SweepGroupCompartmentsIter c(runtime); !c.done(); c.next()) { for (SweepGroupRealmsIter r(runtime); !r.done(); r.next()) {
c->sweepGlobalObject(); r->sweepGlobalObject();
c->sweepTemplateObjects(); r->sweepTemplateObjects();
c->sweepSavedStacks(); r->sweepSavedStacks();
c->sweepSelfHostingScriptSource(); r->sweepSelfHostingScriptSource();
c->sweepNativeIterators(); r->sweepNativeIterators();
c->sweepRegExps(); r->sweepRegExps();
} }
} }
@ -7530,28 +7530,27 @@ GCRuntime::scanZonesBeforeGC()
return zoneStats; return zoneStats;
} }
// The GC can only clean up scheduledForDestruction compartments that were // The GC can only clean up scheduledForDestruction realms that were marked live
// marked live by a barrier (e.g. by RemapWrappers from a navigation event). // by a barrier (e.g. by RemapWrappers from a navigation event). It is also
// It is also common to have compartments held live because they are part of a // common to have realms held live because they are part of a cycle in gecko,
// cycle in gecko, e.g. involving the HTMLDocument wrapper. In this case, we // e.g. involving the HTMLDocument wrapper. In this case, we need to run the
// need to run the CycleCollector in order to remove these edges before the // CycleCollector in order to remove these edges before the realm can be freed.
// compartment can be freed.
void void
GCRuntime::maybeDoCycleCollection() GCRuntime::maybeDoCycleCollection()
{ {
const static double ExcessiveGrayCompartments = 0.8; const static double ExcessiveGrayRealms = 0.8;
const static size_t LimitGrayCompartments = 200; const static size_t LimitGrayRealms = 200;
size_t compartmentsTotal = 0; size_t realmsTotal = 0;
size_t compartmentsGray = 0; size_t realmsGray = 0;
for (CompartmentsIter c(rt, SkipAtoms); !c.done(); c.next()) { for (RealmsIter realm(rt, SkipAtoms); !realm.done(); realm.next()) {
++compartmentsTotal; ++realmsTotal;
GlobalObject* global = c->unsafeUnbarrieredMaybeGlobal(); GlobalObject* global = realm->unsafeUnbarrieredMaybeGlobal();
if (global && global->isMarkedGray()) if (global && global->isMarkedGray())
++compartmentsGray; ++realmsGray;
} }
double grayFraction = double(compartmentsGray) / double(compartmentsTotal); double grayFraction = double(realmsGray) / double(realmsTotal);
if (grayFraction > ExcessiveGrayCompartments || compartmentsGray > LimitGrayCompartments) if (grayFraction > ExcessiveGrayRealms || realmsGray > LimitGrayRealms)
callDoCycleCollectionCallback(rt->mainContextFromOwnThread()); callDoCycleCollectionCallback(rt->mainContextFromOwnThread());
} }
@ -7996,7 +7995,8 @@ GCRuntime::mergeCompartments(JSCompartment* source, JSCompartment* target)
{ {
// The source realm must be specifically flagged as mergable. This // The source realm must be specifically flagged as mergable. This
// also implies that the realm is not visible to the debugger. // also implies that the realm is not visible to the debugger.
mozilla::DebugOnly<Realm*> sourceRealm = JS::GetRealmForCompartment(source); Realm* sourceRealm = JS::GetRealmForCompartment(source);
Realm* targetRealm = JS::GetRealmForCompartment(target);
MOZ_ASSERT(sourceRealm->creationOptions().mergeable()); MOZ_ASSERT(sourceRealm->creationOptions().mergeable());
MOZ_ASSERT(sourceRealm->creationOptions().invisibleToDebugger()); MOZ_ASSERT(sourceRealm->creationOptions().invisibleToDebugger());
@ -8010,10 +8010,10 @@ GCRuntime::mergeCompartments(JSCompartment* source, JSCompartment* target)
AutoTraceSession session(rt); AutoTraceSession session(rt);
// Cleanup tables and other state in the source compartment that will be // Cleanup tables and other state in the source realm/zone that will be
// meaningless after merging into the target compartment. // meaningless after merging into the target realm/zone.
source->clearTables(); sourceRealm->clearTables();
source->zone()->clearTables(); source->zone()->clearTables();
source->unsetIsDebuggee(); source->unsetIsDebuggee();
@ -8036,7 +8036,7 @@ GCRuntime::mergeCompartments(JSCompartment* source, JSCompartment* target)
script->setTypesGeneration(target->zone()->types.generation); script->setTypesGeneration(target->zone()->types.generation);
} }
GlobalObject* global = target->maybeGlobal(); GlobalObject* global = targetRealm->maybeGlobal();
MOZ_ASSERT(global); MOZ_ASSERT(global);
for (auto group = source->zone()->cellIter<ObjectGroup>(); !group.done(); group.next()) { for (auto group = source->zone()->cellIter<ObjectGroup>(); !group.done(); group.next()) {

Просмотреть файл

@ -88,12 +88,14 @@ PhaseKindGraphRoots = [
PhaseKind("PURGE", "Purge", 5), PhaseKind("PURGE", "Purge", 5),
PhaseKind("PURGE_SHAPE_TABLES", "Purge ShapeTables", 60), PhaseKind("PURGE_SHAPE_TABLES", "Purge ShapeTables", 60),
JoinParallelTasksPhaseKind JoinParallelTasksPhaseKind
]), ]),
PhaseKind("MARK", "Mark", 6, [ PhaseKind("MARK", "Mark", 6, [
MarkRootsPhaseKind, MarkRootsPhaseKind,
UnmarkGrayPhaseKind, UnmarkGrayPhaseKind,
PhaseKind("MARK_DELAYED", "Mark Delayed", 8) PhaseKind("MARK_DELAYED", "Mark Delayed", 8, [
UnmarkGrayPhaseKind,
]), ]),
]),
PhaseKind("SWEEP", "Sweep", 9, [ PhaseKind("SWEEP", "Sweep", 9, [
PhaseKind("SWEEP_MARK", "Mark During Sweeping", 10, [ PhaseKind("SWEEP_MARK", "Mark During Sweeping", 10, [
UnmarkGrayPhaseKind, UnmarkGrayPhaseKind,

Просмотреть файл

@ -1485,7 +1485,7 @@ js::ObjectGroup::traceChildren(JSTracer* trc)
if (trc->isMarkingTracer()) if (trc->isMarkingTracer())
compartment()->mark(); compartment()->mark();
if (JSObject* global = compartment()->unsafeUnbarrieredMaybeGlobal()) if (JSObject* global = realm()->unsafeUnbarrieredMaybeGlobal())
TraceManuallyBarrieredEdge(trc, &global, "group_global"); TraceManuallyBarrieredEdge(trc, &global, "group_global");
@ -1528,7 +1528,7 @@ js::GCMarker::lazilyMarkChildren(ObjectGroup* group)
group->compartment()->mark(); group->compartment()->mark();
if (GlobalObject* global = group->compartment()->unsafeUnbarrieredMaybeGlobal()) if (GlobalObject* global = group->realm()->unsafeUnbarrieredMaybeGlobal())
traverseEdge(group, static_cast<JSObject*>(global)); traverseEdge(group, static_cast<JSObject*>(global));
if (group->newScript(sweep)) if (group->newScript(sweep))

Просмотреть файл

@ -117,7 +117,8 @@ class SweepGroupZonesIter {
JS::Zone* operator->() const { return get(); } JS::Zone* operator->() const { return get(); }
}; };
typedef CompartmentsIterT<SweepGroupZonesIter> SweepGroupCompartmentsIter; using SweepGroupCompartmentsIter = CompartmentsIterT<SweepGroupZonesIter>;
using SweepGroupRealmsIter = RealmsIterT<SweepGroupZonesIter>;
// Iterate the free cells in an arena. See also ArenaCellIterImpl which iterates // Iterate the free cells in an arena. See also ArenaCellIterImpl which iterates
// the allocated cells. // the allocated cells.

Просмотреть файл

@ -107,6 +107,32 @@ struct CompartmentsInZoneIter
friend class mozilla::Maybe<CompartmentsInZoneIter>; friend class mozilla::Maybe<CompartmentsInZoneIter>;
}; };
// Note: this class currently assumes there's a single realm per compartment.
class RealmsInZoneIter
{
CompartmentsInZoneIter comp;
public:
explicit RealmsInZoneIter(JS::Zone* zone)
: comp(zone)
{}
bool done() const {
return comp.done();
}
void next() {
MOZ_ASSERT(!done());
comp.next();
}
JS::Realm* get() const {
return JS::GetRealmForCompartment(comp.get());
}
operator JS::Realm*() const { return get(); }
JS::Realm* operator->() const { return get(); }
};
// This iterator iterates over all the compartments in a given set of zones. The // This iterator iterates over all the compartments in a given set of zones. The
// set of zones is determined by iterating ZoneIterT. // set of zones is determined by iterating ZoneIterT.
template<class ZonesIterT> template<class ZonesIterT>
@ -158,7 +184,42 @@ class CompartmentsIterT
JSCompartment* operator->() const { return get(); } JSCompartment* operator->() const { return get(); }
}; };
typedef CompartmentsIterT<ZonesIter> CompartmentsIter; using CompartmentsIter = CompartmentsIterT<ZonesIter>;
// This iterator iterates over all the realms in a given set of zones. The
// set of zones is determined by iterating ZoneIterT.
template<class ZonesIterT>
class RealmsIterT
{
gc::AutoEnterIteration iterMarker;
CompartmentsIterT<ZonesIterT> comp;
public:
explicit RealmsIterT(JSRuntime* rt)
: iterMarker(&rt->gc), comp(rt)
{}
RealmsIterT(JSRuntime* rt, ZoneSelector selector)
: iterMarker(&rt->gc), comp(rt, selector)
{}
bool done() const { return comp.done(); }
void next() {
MOZ_ASSERT(!done());
comp.next();
}
JS::Realm* get() const {
MOZ_ASSERT(!done());
return JS::GetRealmForCompartment(comp.get());
}
operator JS::Realm*() const { return get(); }
JS::Realm* operator->() const { return get(); }
};
using RealmsIter = RealmsIterT<ZonesIter>;
} // namespace js } // namespace js

Просмотреть файл

@ -355,10 +355,10 @@ js::gc::GCRuntime::traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrM
// Trace the JSContext. // Trace the JSContext.
rt->mainContextFromOwnThread()->trace(trc); rt->mainContextFromOwnThread()->trace(trc);
// Trace all compartment roots, but not the compartment itself; it is // Trace all realm roots, but not the realm itself; it is traced via the
// traced via the parent pointer if traceRoots actually traces anything. // parent pointer if traceRoots actually traces anything.
for (CompartmentsIter c(rt, SkipAtoms); !c.done(); c.next()) for (RealmsIter r(rt, SkipAtoms); !r.done(); r.next())
c->traceRoots(trc, traceOrMark); r->traceRoots(trc, traceOrMark);
// Trace helper thread roots. // Trace helper thread roots.
HelperThreadState().trace(trc, session); HelperThreadState().trace(trc, session);
@ -415,8 +415,8 @@ js::gc::GCRuntime::finishRoots()
rt->finishSelfHosting(); rt->finishSelfHosting();
for (CompartmentsIter c(rt, SkipAtoms); !c.done(); c.next()) for (RealmsIter r(rt, SkipAtoms); !r.done(); r.next())
c->finishRoots(); r->finishRoots();
#ifdef DEBUG #ifdef DEBUG
// The nsWrapperCache may not be empty before our shutdown GC, so we have // The nsWrapperCache may not be empty before our shutdown GC, so we have

Просмотреть файл

@ -322,8 +322,8 @@ Zone::notifyObservingDebuggers()
JSRuntime* rt = runtimeFromMainThread(); JSRuntime* rt = runtimeFromMainThread();
JSContext* cx = rt->mainContextFromOwnThread(); JSContext* cx = rt->mainContextFromOwnThread();
for (CompartmentsInZoneIter comps(this); !comps.done(); comps.next()) { for (RealmsInZoneIter realms(this); !realms.done(); realms.next()) {
RootedGlobalObject global(cx, comps->unsafeUnbarrieredMaybeGlobal()); RootedGlobalObject global(cx, realms->unsafeUnbarrieredMaybeGlobal());
if (!global) if (!global)
continue; continue;

Просмотреть файл

@ -0,0 +1,40 @@
if (helperThreadCount() === 0)
quit();
gczeal(0);
let lfPreamble = `
var lfOffThreadGlobal = newGlobal();
for (lfLocal in this)
try {} catch(lfVare5) {}
`;
evaluate(lfPreamble);
evaluate(`
var g = newGlobal();
var dbg = new Debugger;
var gw = dbg.addDebuggee(g);
for (lfLocal in this)
if (!(lfLocal in lfOffThreadGlobal))
try {
lfOffThreadGlobal[lfLocal] = this[lfLocal];
} catch(lfVare5) {}
var g = newGlobal();
var gw = dbg.addDebuggee(g);
`);
lfOffThreadGlobal.offThreadCompileScript(`
gcparam("markStackLimit", 1);
grayRoot()[0] = "foo";
`);
lfOffThreadGlobal.runOffThreadScript();
eval(`
var lfOffThreadGlobal = newGlobal();
try { evaluate(\`
gczeal(18, 1);
grayRoot()[0] = "foo";
let inst = new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary(
\\\`(module
(memory (export "memory") 1 1)
)\\\`
)));
\`); } catch(exc) {}
`);

Просмотреть файл

@ -0,0 +1,6 @@
// |jit-test| error: Error
let m = parseModule(`
import A from "A";
`);
m.declarationInstantiation();

Просмотреть файл

@ -1863,21 +1863,6 @@ GetTemplateObjectForNative(JSContext* cx, HandleFunction target, const CallArgs&
} }
} }
if (native == js::intrinsic_StringSplitString && args.length() == 2 && args[0].isString() &&
args[1].isString())
{
ObjectGroup* group = ObjectGroup::callingAllocationSiteGroup(cx, JSProto_Array);
if (!group)
return false;
if (group->maybePreliminaryObjectsDontCheckGeneration()) {
*skipAttach = true;
return true;
}
res.set(NewFullyAllocatedArrayForCallingAllocationSite(cx, 0, TenuredObject));
return !!res;
}
if (native == StringConstructor) { if (native == StringConstructor) {
RootedString emptyString(cx, cx->runtime()->emptyString); RootedString emptyString(cx, cx->runtime()->emptyString);
res.set(StringObject::create(cx, emptyString, /* proto = */ nullptr, TenuredObject)); res.set(StringObject::create(cx, emptyString, /* proto = */ nullptr, TenuredObject));
@ -2219,10 +2204,14 @@ TryAttachCallStub(JSContext* cx, ICCall_Fallback* stub, HandleScript script, jsb
} }
static bool static bool
CopyArray(JSContext* cx, HandleArrayObject arr, MutableHandleValue result) CopyStringSplitArray(JSContext* cx, HandleArrayObject arr, MutableHandleValue result)
{ {
uint32_t length = arr->length(); MOZ_ASSERT(arr->isTenured(), "ConstStringSplit needs a tenured template object");
ArrayObject* nobj = NewFullyAllocatedArrayTryReuseGroup(cx, arr, length, TenuredObject);
uint32_t length = arr->getDenseInitializedLength();
MOZ_ASSERT(length == arr->length(), "template object is a fully initialized array");
ArrayObject* nobj = NewFullyAllocatedArrayTryReuseGroup(cx, arr, length);
if (!nobj) if (!nobj)
return false; return false;
nobj->initDenseElements(arr, 0, length); nobj->initDenseElements(arr, 0, length);
@ -2241,34 +2230,35 @@ TryAttachConstStringSplit(JSContext* cx, ICCall_Fallback* stub, HandleScript scr
Value* args = vp + 2; Value* args = vp + 2;
// String.prototype.split will not yield a constructable.
if (JSOp(*pc) == JSOP_NEW)
return true;
if (!IsOptimizableConstStringSplit(callee, argc, args)) if (!IsOptimizableConstStringSplit(callee, argc, args))
return true; return true;
MOZ_ASSERT(callee.isObject());
MOZ_ASSERT(callee.toObject().is<JSFunction>());
RootedString str(cx, args[0].toString()); RootedString str(cx, args[0].toString());
RootedString sep(cx, args[1].toString()); RootedString sep(cx, args[1].toString());
RootedObject obj(cx, &res.toObject()); RootedArrayObject obj(cx, &res.toObject().as<ArrayObject>());
RootedValue arr(cx); uint32_t initLength = obj->getDenseInitializedLength();
MOZ_ASSERT(initLength == obj->length(), "string-split result is a fully initialized array");
// Copy the array before storing in stub. // Copy the array before storing in stub.
if (!CopyArray(cx, obj.as<ArrayObject>(), &arr)) RootedArrayObject arrObj(cx);
arrObj = NewFullyAllocatedArrayTryReuseGroup(cx, obj, initLength, TenuredObject);
if (!arrObj)
return false; return false;
arrObj->ensureDenseInitializedLength(cx, 0, initLength);
// Atomize all elements of the array. // Atomize all elements of the array.
RootedArrayObject arrObj(cx, &arr.toObject().as<ArrayObject>()); if (initLength > 0) {
uint32_t initLength = arrObj->length(); // Mimic NewFullyAllocatedStringArray() and directly inform TI about
for (uint32_t i = 0; i < initLength; i++) { // the element type.
JSAtom* str = js::AtomizeString(cx, arrObj->getDenseElement(i).toString()); AddTypePropertyId(cx, arrObj, JSID_VOID, TypeSet::StringType());
if (!str)
return false;
arrObj->setDenseElementWithType(cx, i, StringValue(str)); for (uint32_t i = 0; i < initLength; i++) {
JSAtom* str = js::AtomizeString(cx, obj->getDenseElement(i).toString());
if (!str)
return false;
arrObj->initDenseElement(i, StringValue(str));
}
} }
ICTypeMonitor_Fallback* typeMonitorFallback = stub->getFallbackMonitorStub(cx, script); ICTypeMonitor_Fallback* typeMonitorFallback = stub->getFallbackMonitorStub(cx, script);
@ -2401,7 +2391,7 @@ DoCallFallback(JSContext* cx, BaselineFrame* frame, ICCall_Fallback* stub_, uint
stub->discardStubs(cx); stub->discardStubs(cx);
canAttachStub = stub->state().canAttachStub(); canAttachStub = stub->state().canAttachStub();
if (!handled && canAttachStub) { if (!handled && canAttachStub && !constructing) {
// If 'callee' is a potential Call_ConstStringSplit, try to attach an // If 'callee' is a potential Call_ConstStringSplit, try to attach an
// optimized ConstStringSplit stub. Note that vp[0] now holds the return value // optimized ConstStringSplit stub. Note that vp[0] now holds the return value
// instead of the callee, so we pass the callee as well. // instead of the callee, so we pass the callee as well.
@ -3156,8 +3146,9 @@ ICCallScriptedCompiler::generateStubCode(MacroAssembler& masm)
return true; return true;
} }
typedef bool (*CopyArrayFn)(JSContext*, HandleArrayObject, MutableHandleValue); typedef bool (*CopyStringSplitArrayFn)(JSContext*, HandleArrayObject, MutableHandleValue);
static const VMFunction CopyArrayInfo = FunctionInfo<CopyArrayFn>(CopyArray, "CopyArray"); static const VMFunction CopyStringSplitArrayInfo =
FunctionInfo<CopyStringSplitArrayFn>(CopyStringSplitArray, "CopyStringSplitArray");
bool bool
ICCall_ConstStringSplit::Compiler::generateStubCode(MacroAssembler& masm) ICCall_ConstStringSplit::Compiler::generateStubCode(MacroAssembler& masm)
@ -3243,7 +3234,7 @@ ICCall_ConstStringSplit::Compiler::generateStubCode(MacroAssembler& masm)
masm.loadPtr(Address(ICStubReg, offsetOfTemplateObject()), paramReg); masm.loadPtr(Address(ICStubReg, offsetOfTemplateObject()), paramReg);
masm.push(paramReg); masm.push(paramReg);
if (!callVM(CopyArrayInfo, masm)) if (!callVM(CopyStringSplitArrayInfo, masm))
return false; return false;
leaveStubFrame(masm); leaveStubFrame(masm);
regs.add(paramReg); regs.add(paramReg);

Просмотреть файл

@ -1054,7 +1054,7 @@ GetPropIRGenerator::tryAttachCrossCompartmentWrapper(HandleObject obj, ObjOperan
// so we optimize for that case as well. // so we optimize for that case as well.
bool isWindowProxy = IsWindowProxy(unwrapped); bool isWindowProxy = IsWindowProxy(unwrapped);
if (isWindowProxy) { if (isWindowProxy) {
MOZ_ASSERT(ToWindowIfWindowProxy(unwrapped) == unwrapped->compartment()->maybeGlobal()); MOZ_ASSERT(ToWindowIfWindowProxy(unwrapped) == unwrapped->realm()->maybeGlobal());
unwrapped = cx_->global(); unwrapped = cx_->global();
MOZ_ASSERT(unwrapped); MOZ_ASSERT(unwrapped);
} }

Просмотреть файл

@ -272,7 +272,7 @@ CompileCompartment::maybeGlobal()
// This uses unsafeUnbarrieredMaybeGlobal() so as not to trigger the read // This uses unsafeUnbarrieredMaybeGlobal() so as not to trigger the read
// barrier on the global from off thread. This is safe because we // barrier on the global from off thread. This is safe because we
// abort Ion compilation when we GC. // abort Ion compilation when we GC.
return compartment()->unsafeUnbarrieredMaybeGlobal(); return JS::GetRealmForCompartment(compartment())->unsafeUnbarrieredMaybeGlobal();
} }
bool bool

Просмотреть файл

@ -337,7 +337,7 @@ JitRuntime::debugTrapHandler(JSContext* cx)
{ {
if (!debugTrapHandler_) { if (!debugTrapHandler_) {
// JitRuntime code stubs are shared across compartments and have to // JitRuntime code stubs are shared across compartments and have to
// be allocated in the atoms compartment. // be allocated in the atoms zone.
AutoLockForExclusiveAccess lock(cx); AutoLockForExclusiveAccess lock(cx);
AutoAtomsRealm ar(cx, lock); AutoAtomsRealm ar(cx, lock);
debugTrapHandler_ = generateDebugTrapHandler(cx); debugTrapHandler_ = generateDebugTrapHandler(cx);
@ -587,12 +587,12 @@ JitRuntime::Trace(JSTracer* trc, AutoLockForExclusiveAccess& lock)
{ {
MOZ_ASSERT(!JS::CurrentThreadIsHeapMinorCollecting()); MOZ_ASSERT(!JS::CurrentThreadIsHeapMinorCollecting());
// Shared stubs are allocated in the atoms compartment, so do not iterate // Shared stubs are allocated in the atoms zone, so do not iterate
// them after the atoms heap after it has been "finished." // them after the atoms heap after it has been "finished."
if (trc->runtime()->atomsAreFinished()) if (trc->runtime()->atomsAreFinished())
return; return;
Zone* zone = trc->runtime()->atomsCompartment(lock)->zone(); Zone* zone = trc->runtime()->atomsRealm(lock)->zone();
for (auto i = zone->cellIter<JitCode>(); !i.done(); i.next()) { for (auto i = zone->cellIter<JitCode>(); !i.done(); i.next()) {
JitCode* code = i; JitCode* code = i;
TraceRoot(trc, &code, "wrapper"); TraceRoot(trc, &code, "wrapper");

Просмотреть файл

@ -954,7 +954,7 @@ JS_RefreshCrossCompartmentWrappers(JSContext* cx, HandleObject obj)
JS_PUBLIC_API(bool) JS_PUBLIC_API(bool)
JS_InitStandardClasses(JSContext* cx, HandleObject obj) JS_InitStandardClasses(JSContext* cx, HandleObject obj)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -1941,19 +1941,19 @@ JS_GlobalObjectTraceHook(JSTracer* trc, JSObject* global)
MOZ_ASSERT(global->is<GlobalObject>()); MOZ_ASSERT(global->is<GlobalObject>());
// Off thread parsing and compilation tasks create a dummy global which is // Off thread parsing and compilation tasks create a dummy global which is
// then merged back into the host compartment. Since it used to be a // then merged back into the host realm. Since it used to be a global, it
// global, it will still have this trace hook, but it does not have a // will still have this trace hook, but it does not have a meaning relative
// meaning relative to its new compartment. We can safely skip it. // to its new realm. We can safely skip it.
// //
// Similarly, if we GC when creating the global, we may not have set that // Similarly, if we GC when creating the global, we may not have set that
// global's compartment's global pointer yet. In this case, the compartment // global's realm's global pointer yet. In this case, the realm will not yet
// will not yet contain anything that needs to be traced. // contain anything that needs to be traced.
if (!global->isOwnGlobal(trc)) if (!global->isOwnGlobal(trc))
return; return;
// Trace the compartment for any GC things that should only stick around if // Trace the realm for any GC things that should only stick around if we
// we know the global is live. // know the global is live.
global->compartment()->traceGlobal(trc); global->realm()->traceGlobal(trc);
if (JSTraceOp trace = global->realm()->creationOptions().getTrace()) if (JSTraceOp trace = global->realm()->creationOptions().getTrace())
trace(trc, global); trace(trc, global);
@ -1974,7 +1974,7 @@ JS_FireOnNewGlobalObject(JSContext* cx, JS::HandleObject global)
JS_PUBLIC_API(JSObject*) JS_PUBLIC_API(JSObject*)
JS_NewObject(JSContext* cx, const JSClass* jsclasp) JS_NewObject(JSContext* cx, const JSClass* jsclasp)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -1991,7 +1991,7 @@ JS_NewObject(JSContext* cx, const JSClass* jsclasp)
JS_PUBLIC_API(JSObject*) JS_PUBLIC_API(JSObject*)
JS_NewObjectWithGivenProto(JSContext* cx, const JSClass* jsclasp, HandleObject proto) JS_NewObjectWithGivenProto(JSContext* cx, const JSClass* jsclasp, HandleObject proto)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, proto); assertSameCompartment(cx, proto);
@ -2009,7 +2009,7 @@ JS_NewObjectWithGivenProto(JSContext* cx, const JSClass* jsclasp, HandleObject p
JS_PUBLIC_API(JSObject*) JS_PUBLIC_API(JSObject*)
JS_NewPlainObject(JSContext* cx) JS_NewPlainObject(JSContext* cx)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -2909,7 +2909,7 @@ JS_PUBLIC_API(bool)
JS_CallFunctionValue(JSContext* cx, HandleObject obj, HandleValue fval, const HandleValueArray& args, JS_CallFunctionValue(JSContext* cx, HandleObject obj, HandleValue fval, const HandleValueArray& args,
MutableHandleValue rval) MutableHandleValue rval)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, obj, fval, args); assertSameCompartment(cx, obj, fval, args);
@ -2926,7 +2926,7 @@ JS_PUBLIC_API(bool)
JS_CallFunction(JSContext* cx, HandleObject obj, HandleFunction fun, const HandleValueArray& args, JS_CallFunction(JSContext* cx, HandleObject obj, HandleFunction fun, const HandleValueArray& args,
MutableHandleValue rval) MutableHandleValue rval)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, obj, fun, args); assertSameCompartment(cx, obj, fun, args);
@ -2944,7 +2944,7 @@ JS_PUBLIC_API(bool)
JS_CallFunctionName(JSContext* cx, HandleObject obj, const char* name, const HandleValueArray& args, JS_CallFunctionName(JSContext* cx, HandleObject obj, const char* name, const HandleValueArray& args,
MutableHandleValue rval) MutableHandleValue rval)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, obj, args); assertSameCompartment(cx, obj, args);
@ -3378,7 +3378,7 @@ JS_SetReservedSlot(JSObject* obj, uint32_t index, const Value& value)
JS_PUBLIC_API(JSObject*) JS_PUBLIC_API(JSObject*)
JS_NewArrayObject(JSContext* cx, const JS::HandleValueArray& contents) JS_NewArrayObject(JSContext* cx, const JS::HandleValueArray& contents)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -3389,7 +3389,7 @@ JS_NewArrayObject(JSContext* cx, const JS::HandleValueArray& contents)
JS_PUBLIC_API(JSObject*) JS_PUBLIC_API(JSObject*)
JS_NewArrayObject(JSContext* cx, size_t length) JS_NewArrayObject(JSContext* cx, size_t length)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -3512,7 +3512,7 @@ JS_PUBLIC_API(JSFunction*)
JS_NewFunction(JSContext* cx, JSNative native, unsigned nargs, unsigned flags, JS_NewFunction(JSContext* cx, JSNative native, unsigned nargs, unsigned flags,
const char* name) const char* name)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -3532,7 +3532,7 @@ JS_NewFunction(JSContext* cx, JSNative native, unsigned nargs, unsigned flags,
JS_PUBLIC_API(JSFunction*) JS_PUBLIC_API(JSFunction*)
JS::GetSelfHostedFunction(JSContext* cx, const char* selfHostedName, HandleId id, unsigned nargs) JS::GetSelfHostedFunction(JSContext* cx, const char* selfHostedName, HandleId id, unsigned nargs)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, id); assertSameCompartment(cx, id);
@ -3788,7 +3788,7 @@ JS_IsConstructor(JSFunction* fun)
JS_PUBLIC_API(bool) JS_PUBLIC_API(bool)
JS_DefineFunctions(JSContext* cx, HandleObject obj, const JSFunctionSpec* fs) JS_DefineFunctions(JSContext* cx, HandleObject obj, const JSFunctionSpec* fs)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, obj); assertSameCompartment(cx, obj);
@ -3800,7 +3800,7 @@ JS_PUBLIC_API(JSFunction*)
JS_DefineFunction(JSContext* cx, HandleObject obj, const char* name, JSNative call, JS_DefineFunction(JSContext* cx, HandleObject obj, const char* name, JSNative call,
unsigned nargs, unsigned attrs) unsigned nargs, unsigned attrs)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, obj); assertSameCompartment(cx, obj);
@ -3816,7 +3816,7 @@ JS_DefineUCFunction(JSContext* cx, HandleObject obj,
const char16_t* name, size_t namelen, JSNative call, const char16_t* name, size_t namelen, JSNative call,
unsigned nargs, unsigned attrs) unsigned nargs, unsigned attrs)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, obj); assertSameCompartment(cx, obj);
@ -3831,7 +3831,7 @@ extern JS_PUBLIC_API(JSFunction*)
JS_DefineFunctionById(JSContext* cx, HandleObject obj, HandleId id, JSNative call, JS_DefineFunctionById(JSContext* cx, HandleObject obj, HandleId id, JSNative call,
unsigned nargs, unsigned attrs) unsigned nargs, unsigned attrs)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, obj, id); assertSameCompartment(cx, obj, id);
@ -4082,7 +4082,7 @@ Compile(JSContext* cx, const ReadOnlyCompileOptions& options,
{ {
ScopeKind scopeKind = options.nonSyntacticScope ? ScopeKind::NonSyntactic : ScopeKind::Global; ScopeKind scopeKind = options.nonSyntacticScope ? ScopeKind::NonSyntactic : ScopeKind::Global;
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -4223,7 +4223,7 @@ JSScript*
JS::DecodeBinAST(JSContext* cx, const ReadOnlyCompileOptions& options, JS::DecodeBinAST(JSContext* cx, const ReadOnlyCompileOptions& options,
const uint8_t* buf, size_t length) const uint8_t* buf, size_t length)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -4546,7 +4546,7 @@ CompileFunction(JSContext* cx, const ReadOnlyCompileOptions& optionsArg,
HandleObject enclosingEnv, HandleScope enclosingScope, HandleObject enclosingEnv, HandleScope enclosingScope,
MutableHandleFunction fun) MutableHandleFunction fun)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, enclosingEnv); assertSameCompartment(cx, enclosingEnv);
@ -4715,7 +4715,7 @@ JS::ExposeScriptToDebugger(JSContext* cx, HandleScript script)
JS_PUBLIC_API(JSString*) JS_PUBLIC_API(JSString*)
JS_DecompileScript(JSContext* cx, HandleScript script) JS_DecompileScript(JSContext* cx, HandleScript script)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -4733,7 +4733,7 @@ JS_DecompileScript(JSContext* cx, HandleScript script)
JS_PUBLIC_API(JSString*) JS_PUBLIC_API(JSString*)
JS_DecompileFunction(JSContext* cx, HandleFunction fun) JS_DecompileFunction(JSContext* cx, HandleFunction fun)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, fun); assertSameCompartment(cx, fun);
@ -4743,7 +4743,7 @@ JS_DecompileFunction(JSContext* cx, HandleFunction fun)
MOZ_NEVER_INLINE static bool MOZ_NEVER_INLINE static bool
ExecuteScript(JSContext* cx, HandleObject scope, HandleScript script, Value* rval) ExecuteScript(JSContext* cx, HandleObject scope, HandleScript script, Value* rval)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, scope, script); assertSameCompartment(cx, scope, script);
@ -4837,7 +4837,7 @@ Evaluate(JSContext* cx, ScopeKind scopeKind, HandleObject env,
SourceBufferHolder& srcBuf, MutableHandleValue rval) SourceBufferHolder& srcBuf, MutableHandleValue rval)
{ {
CompileOptions options(cx, optionsArg); CompileOptions options(cx, optionsArg);
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, env); assertSameCompartment(cx, env);
@ -4964,7 +4964,7 @@ JS_PUBLIC_API(bool)
JS::CompileModule(JSContext* cx, const ReadOnlyCompileOptions& options, JS::CompileModule(JSContext* cx, const ReadOnlyCompileOptions& options,
SourceBufferHolder& srcBuf, JS::MutableHandleObject module) SourceBufferHolder& srcBuf, JS::MutableHandleObject module)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -5122,7 +5122,7 @@ JS::SetPromiseRejectionTrackerCallback(JSContext* cx, JSPromiseRejectionTrackerC
JS_PUBLIC_API(JSObject*) JS_PUBLIC_API(JSObject*)
JS::NewPromiseObject(JSContext* cx, HandleObject executor, HandleObject proto /* = nullptr */) JS::NewPromiseObject(JSContext* cx, HandleObject executor, HandleObject proto /* = nullptr */)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, executor, proto); assertSameCompartment(cx, executor, proto);
@ -5376,7 +5376,7 @@ JS::NewReadableDefaultStreamObject(JSContext* cx,
double highWaterMark /* = 1 */, double highWaterMark /* = 1 */,
JS::HandleObject proto /* = nullptr */) JS::HandleObject proto /* = nullptr */)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -5398,7 +5398,7 @@ JS::NewReadableByteStreamObject(JSContext* cx,
double highWaterMark /* = 1 */, double highWaterMark /* = 1 */,
JS::HandleObject proto /* = nullptr */) JS::HandleObject proto /* = nullptr */)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -5457,7 +5457,7 @@ JS::NewReadableExternalSourceStreamObject(JSContext* cx, void* underlyingSource,
uint8_t flags /* = 0 */, uint8_t flags /* = 0 */,
HandleObject proto /* = nullptr */) HandleObject proto /* = nullptr */)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
AssertHeapIsIdle(); AssertHeapIsIdle();
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -7586,9 +7586,9 @@ GetScriptedCallerGlobal(JSContext* cx)
if (activation->scriptedCallerIsHidden()) if (activation->scriptedCallerIsHidden())
return nullptr; return nullptr;
GlobalObject* global = activation->compartment()->maybeGlobal(); GlobalObject* global = JS::GetRealmForCompartment(activation->compartment())->maybeGlobal();
// Noone should be running code in the atoms compartment or running code in // No one should be running code in the atoms realm or running code in
// a compartment without any live objects, so there should definitely be a // a compartment without any live objects, so there should definitely be a
// live global. // live global.
MOZ_ASSERT(global); MOZ_ASSERT(global);

Просмотреть файл

@ -241,7 +241,7 @@ DefineHelpProperty(JSContext* cx, HandleObject obj, const char* prop, const char
JS_FRIEND_API(bool) JS_FRIEND_API(bool)
JS_DefineFunctionsWithHelp(JSContext* cx, HandleObject obj, const JSFunctionSpecWithHelp* fs) JS_DefineFunctionsWithHelp(JSContext* cx, HandleObject obj, const JSFunctionSpecWithHelp* fs)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, obj); assertSameCompartment(cx, obj);
@ -343,9 +343,9 @@ js::IsSystemZone(Zone* zone)
} }
JS_FRIEND_API(bool) JS_FRIEND_API(bool)
js::IsAtomsCompartment(JSCompartment* comp) js::IsAtomsRealm(JS::Realm* realm)
{ {
return comp->runtimeFromAnyThread()->isAtomsCompartment(comp); return realm->isAtomsRealm();
} }
JS_FRIEND_API(bool) JS_FRIEND_API(bool)
@ -424,7 +424,7 @@ js::DefineFunctionWithReserved(JSContext* cx, JSObject* objArg, const char* name
unsigned nargs, unsigned attrs) unsigned nargs, unsigned attrs)
{ {
RootedObject obj(cx, objArg); RootedObject obj(cx, objArg);
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, obj); assertSameCompartment(cx, obj);
JSAtom* atom = Atomize(cx, name, strlen(name)); JSAtom* atom = Atomize(cx, name, strlen(name));
@ -438,7 +438,7 @@ JS_FRIEND_API(JSFunction*)
js::NewFunctionWithReserved(JSContext* cx, JSNative native, unsigned nargs, unsigned flags, js::NewFunctionWithReserved(JSContext* cx, JSNative native, unsigned nargs, unsigned flags,
const char* name) const char* name)
{ {
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
@ -459,7 +459,7 @@ js::NewFunctionByIdWithReserved(JSContext* cx, JSNative native, unsigned nargs,
jsid id) jsid id)
{ {
MOZ_ASSERT(JSID_IS_STRING(id)); MOZ_ASSERT(JSID_IS_STRING(id));
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
CHECK_REQUEST(cx); CHECK_REQUEST(cx);
assertSameCompartment(cx, id); assertSameCompartment(cx, id);
@ -572,8 +572,8 @@ js::AreGCGrayBitsValid(JSRuntime* rt)
JS_FRIEND_API(bool) JS_FRIEND_API(bool)
js::ZoneGlobalsAreAllGray(JS::Zone* zone) js::ZoneGlobalsAreAllGray(JS::Zone* zone)
{ {
for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next()) { for (RealmsInZoneIter realm(zone); !realm.done(); realm.next()) {
JSObject* obj = comp->unsafeUnbarrieredMaybeGlobal(); JSObject* obj = realm->unsafeUnbarrieredMaybeGlobal();
if (!obj || !JS::ObjectIsMarkedGray(obj)) if (!obj || !JS::ObjectIsMarkedGray(obj))
return false; return false;
} }

Просмотреть файл

@ -484,7 +484,7 @@ extern JS_FRIEND_API(bool)
IsSystemZone(JS::Zone* zone); IsSystemZone(JS::Zone* zone);
extern JS_FRIEND_API(bool) extern JS_FRIEND_API(bool)
IsAtomsCompartment(JSCompartment* comp); IsAtomsRealm(JS::Realm* realm);
extern JS_FRIEND_API(bool) extern JS_FRIEND_API(bool)
IsAtomsZone(JS::Zone* zone); IsAtomsZone(JS::Zone* zone);

Просмотреть файл

@ -4293,6 +4293,10 @@ static JSObject*
CallModuleResolveHook(JSContext* cx, HandleObject module, HandleString specifier) CallModuleResolveHook(JSContext* cx, HandleObject module, HandleString specifier)
{ {
ShellContext* sc = GetShellContext(cx); ShellContext* sc = GetShellContext(cx);
if (!sc->moduleResolveHook) {
JS_ReportErrorASCII(cx, "Module resolve hook not set");
return nullptr;
}
JS::AutoValueArray<2> args(cx); JS::AutoValueArray<2> args(cx);
args[0].setObject(*module); args[0].setObject(*module);

Просмотреть файл

@ -66,20 +66,17 @@ WrappedAsyncFunction(JSContext* cx, unsigned argc, Value* vp)
{ {
CallArgs args = CallArgsFromVp(argc, vp); CallArgs args = CallArgsFromVp(argc, vp);
RootedFunction wrapped(cx, &args.callee().as<JSFunction>()); RootedValue unwrappedVal(cx);
RootedValue unwrappedVal(cx, wrapped->getExtendedSlot(WRAPPED_ASYNC_UNWRAPPED_SLOT)); unwrappedVal = args.callee().as<JSFunction>().getExtendedSlot(WRAPPED_ASYNC_UNWRAPPED_SLOT);
RootedFunction unwrapped(cx, &unwrappedVal.toObject().as<JSFunction>());
RootedValue thisValue(cx, args.thisv());
// Step 2. // Step 2.
// Also does a part of 2.2 steps 1-2. // Also does a part of 2.2 steps 1-2.
RootedValue generatorVal(cx);
InvokeArgs args2(cx); InvokeArgs args2(cx);
if (!args2.init(cx, argc)) if (!FillArgumentsFromArraylike(cx, args2, args))
return false; return false;
for (size_t i = 0, len = argc; i < len; i++)
args2[i].set(args[i]); RootedValue generatorVal(cx);
if (Call(cx, unwrappedVal, thisValue, args2, &generatorVal)) { if (Call(cx, unwrappedVal, args.thisv(), args2, &generatorVal)) {
// Step 1. // Step 1.
Rooted<PromiseObject*> resultPromise(cx, CreatePromiseObjectForAsync(cx, generatorVal)); Rooted<PromiseObject*> resultPromise(cx, CreatePromiseObjectForAsync(cx, generatorVal));
if (!resultPromise) if (!resultPromise)
@ -101,7 +98,7 @@ WrappedAsyncFunction(JSContext* cx, unsigned argc, Value* vp)
RootedValue exc(cx); RootedValue exc(cx);
if (!GetAndClearException(cx, &exc)) if (!GetAndClearException(cx, &exc))
return false; return false;
RootedObject rejectPromise(cx, PromiseObject::unforgeableReject(cx, exc)); JSObject* rejectPromise = PromiseObject::unforgeableReject(cx, exc);
if (!rejectPromise) if (!rejectPromise)
return false; return false;
@ -131,10 +128,9 @@ js::WrapAsyncFunctionWithProto(JSContext* cx, HandleFunction unwrapped, HandleOb
return nullptr; return nullptr;
// Steps 3 (partially). // Steps 3 (partially).
RootedFunction wrapped(cx, NewFunctionWithProto(cx, WrappedAsyncFunction, length, JSFunction* wrapped = NewFunctionWithProto(cx, WrappedAsyncFunction, length,
JSFunction::NATIVE_FUN, nullptr, JSFunction::NATIVE_FUN, nullptr, funName, proto,
funName, proto, AllocKind::FUNCTION_EXTENDED);
AllocKind::FUNCTION_EXTENDED));
if (!wrapped) if (!wrapped)
return nullptr; return nullptr;

Просмотреть файл

@ -34,17 +34,14 @@ WrappedAsyncGenerator(JSContext* cx, unsigned argc, Value* vp)
RootedFunction wrapped(cx, &args.callee().as<JSFunction>()); RootedFunction wrapped(cx, &args.callee().as<JSFunction>());
RootedValue unwrappedVal(cx, wrapped->getExtendedSlot(WRAPPED_ASYNC_UNWRAPPED_SLOT)); RootedValue unwrappedVal(cx, wrapped->getExtendedSlot(WRAPPED_ASYNC_UNWRAPPED_SLOT));
RootedFunction unwrapped(cx, &unwrappedVal.toObject().as<JSFunction>());
RootedValue thisValue(cx, args.thisv());
// Step 1. // Step 1.
RootedValue generatorVal(cx);
InvokeArgs args2(cx); InvokeArgs args2(cx);
if (!args2.init(cx, argc)) if (!FillArgumentsFromArraylike(cx, args2, args))
return false; return false;
for (size_t i = 0, len = argc; i < len; i++)
args2[i].set(args[i]); RootedValue generatorVal(cx);
if (!Call(cx, unwrappedVal, thisValue, args2, &generatorVal)) if (!Call(cx, unwrappedVal, args.thisv(), args2, &generatorVal))
return false; return false;
// Step 2. // Step 2.
@ -75,10 +72,9 @@ js::WrapAsyncGeneratorWithProto(JSContext* cx, HandleFunction unwrapped, HandleO
if (!JSFunction::getLength(cx, unwrapped, &length)) if (!JSFunction::getLength(cx, unwrapped, &length))
return nullptr; return nullptr;
RootedFunction wrapped(cx, NewFunctionWithProto(cx, WrappedAsyncGenerator, length, JSFunction* wrapped = NewFunctionWithProto(cx, WrappedAsyncGenerator, length,
JSFunction::NATIVE_FUN, nullptr, JSFunction::NATIVE_FUN, nullptr, funName, proto,
funName, proto, AllocKind::FUNCTION_EXTENDED);
AllocKind::FUNCTION_EXTENDED));
if (!wrapped) if (!wrapped)
return nullptr; return nullptr;

Просмотреть файл

@ -349,10 +349,10 @@ class MOZ_RAII js::EnterDebuggeeNoExecute
} }
#endif #endif
// Given a JSContext entered into a debuggee compartment, find the lock // Given a JSContext entered into a debuggee realm, find the lock
// that locks it. Returns nullptr if not found. // that locks it. Returns nullptr if not found.
static EnterDebuggeeNoExecute* findInStack(JSContext* cx) { static EnterDebuggeeNoExecute* findInStack(JSContext* cx) {
JSCompartment* debuggee = cx->compartment(); Realm* debuggee = cx->realm();
for (EnterDebuggeeNoExecute* it = cx->noExecuteDebuggerTop; it; it = it->prev_) { for (EnterDebuggeeNoExecute* it = cx->noExecuteDebuggerTop; it; it = it->prev_) {
Debugger& dbg = it->debugger(); Debugger& dbg = it->debugger();
if (!it->unlocked_ && dbg.isEnabled() && dbg.observesGlobal(debuggee->maybeGlobal())) if (!it->unlocked_ && dbg.isEnabled() && dbg.observesGlobal(debuggee->maybeGlobal()))
@ -2255,10 +2255,10 @@ Debugger::slowPathOnLogAllocationSite(JSContext* cx, HandleObject obj, HandleSav
} }
bool bool
Debugger::isDebuggeeUnbarriered(const JSCompartment* compartment) const Debugger::isDebuggeeUnbarriered(const Realm* realm) const
{ {
MOZ_ASSERT(compartment); MOZ_ASSERT(realm);
return compartment->isDebuggee() && debuggees.has(compartment->unsafeUnbarrieredMaybeGlobal()); return realm->isDebuggee() && debuggees.has(realm->unsafeUnbarrieredMaybeGlobal());
} }
bool bool
@ -3064,9 +3064,9 @@ Debugger::markIteratively(GCMarker* marker)
* convoluted since the easiest way to find them is via their debuggees. * convoluted since the easiest way to find them is via their debuggees.
*/ */
JSRuntime* rt = marker->runtime(); JSRuntime* rt = marker->runtime();
for (CompartmentsIter c(rt, SkipAtoms); !c.done(); c.next()) { for (RealmsIter r(rt, SkipAtoms); !r.done(); r.next()) {
if (c->isDebuggee()) { if (r->isDebuggee()) {
GlobalObject* global = c->unsafeUnbarrieredMaybeGlobal(); GlobalObject* global = r->unsafeUnbarrieredMaybeGlobal();
if (!IsMarkedUnbarriered(rt, &global)) if (!IsMarkedUnbarriered(rt, &global))
continue; continue;
@ -3741,14 +3741,11 @@ Debugger::addAllGlobalsAsDebuggees(JSContext* cx, unsigned argc, Value* vp)
{ {
THIS_DEBUGGER(cx, argc, vp, "addAllGlobalsAsDebuggees", args, dbg); THIS_DEBUGGER(cx, argc, vp, "addAllGlobalsAsDebuggees", args, dbg);
for (ZonesIter zone(cx->runtime(), SkipAtoms); !zone.done(); zone.next()) { for (ZonesIter zone(cx->runtime(), SkipAtoms); !zone.done(); zone.next()) {
for (CompartmentsInZoneIter c(zone); !c.done(); c.next()) { for (RealmsInZoneIter r(zone); !r.done(); r.next()) {
if (c == dbg->object->compartment() || if (r == dbg->object->realm() || r->creationOptions().invisibleToDebugger())
JS::GetRealmForCompartment(c)->creationOptions().invisibleToDebugger())
{
continue; continue;
} r->scheduledForDestruction = false;
c->scheduledForDestruction = false; GlobalObject* global = r->maybeGlobal();
GlobalObject* global = c->maybeGlobal();
if (global) { if (global) {
Rooted<GlobalObject*> rg(cx, global); Rooted<GlobalObject*> rg(cx, global);
if (!dbg->addDebuggeeGlobal(cx, rg)) if (!dbg->addDebuggeeGlobal(cx, rg))
@ -3993,7 +3990,8 @@ Debugger::addDebuggeeGlobal(JSContext* cx, Handle<GlobalObject*> global)
* object. Add those compartments to visited. * object. Add those compartments to visited.
*/ */
if (c->isDebuggee()) { if (c->isDebuggee()) {
GlobalObject::DebuggerVector* v = c->maybeGlobal()->getDebuggers(); Realm* realm = JS::GetRealmForCompartment(c);
GlobalObject::DebuggerVector* v = realm->maybeGlobal()->getDebuggers();
for (auto p = v->begin(); p != v->end(); p++) { for (auto p = v->begin(); p != v->end(); p++) {
JSCompartment* next = (*p)->object->compartment(); JSCompartment* next = (*p)->object->compartment();
if (Find(visited, next) == visited.end() && !visited.append(next)) if (Find(visited, next) == visited.end() && !visited.append(next))
@ -4856,7 +4854,7 @@ class MOZ_STACK_CLASS Debugger::ObjectQuery
* node. * node.
*/ */
JSCompartment* comp = referent.compartment(); JSCompartment* comp = referent.compartment();
if (comp && !dbg->isDebuggeeUnbarriered(comp)) { if (comp && !dbg->isDebuggeeUnbarriered(JS::GetRealmForCompartment(comp))) {
traversal.abandonReferent(); traversal.abandonReferent();
return true; return true;
} }
@ -4957,17 +4955,16 @@ Debugger::findAllGlobals(JSContext* cx, unsigned argc, Value* vp)
{ {
// Accumulate the list of globals before wrapping them, because // Accumulate the list of globals before wrapping them, because
// wrapping can GC and collect compartments from under us, while // wrapping can GC and collect realms from under us, while iterating.
// iterating.
JS::AutoCheckCannotGC nogc; JS::AutoCheckCannotGC nogc;
for (CompartmentsIter c(cx->runtime(), SkipAtoms); !c.done(); c.next()) { for (RealmsIter r(cx->runtime(), SkipAtoms); !r.done(); r.next()) {
if (JS::GetRealmForCompartment(c)->creationOptions().invisibleToDebugger()) if (r->creationOptions().invisibleToDebugger())
continue; continue;
c->scheduledForDestruction = false; r->scheduledForDestruction = false;
GlobalObject* global = c->maybeGlobal(); GlobalObject* global = r->maybeGlobal();
if (cx->runtime()->isSelfHostingGlobal(global)) if (cx->runtime()->isSelfHostingGlobal(global))
continue; continue;

Просмотреть файл

@ -353,9 +353,9 @@ class Debugger : private mozilla::LinkedListElement<Debugger>
Observing = 1 Observing = 1
}; };
// Return true if the given compartment is a debuggee of this debugger, // Return true if the given realm is a debuggee of this debugger,
// false otherwise. // false otherwise.
bool isDebuggeeUnbarriered(const JSCompartment* compartment) const; bool isDebuggeeUnbarriered(const Realm* realm) const;
// Return true if this Debugger observed a debuggee that participated in the // Return true if this Debugger observed a debuggee that participated in the
// GC identified by the given GC number. Return false otherwise. // GC identified by the given GC number. Return false otherwise.

Просмотреть файл

@ -3316,7 +3316,7 @@ js::CheckLexicalNameConflict(JSContext* cx, Handle<LexicalEnvironmentObject*> le
const char* redeclKind = nullptr; const char* redeclKind = nullptr;
RootedId id(cx, NameToId(name)); RootedId id(cx, NameToId(name));
RootedShape shape(cx); RootedShape shape(cx);
if (varObj->is<GlobalObject>() && varObj->compartment()->isInVarNames(name)) { if (varObj->is<GlobalObject>() && varObj->realm()->isInVarNames(name)) {
// ES 15.1.11 step 5.a // ES 15.1.11 step 5.a
redeclKind = "var"; redeclKind = "var";
} else if ((shape = lexicalEnv->lookup(cx, name))) { } else if ((shape = lexicalEnv->lookup(cx, name))) {

Просмотреть файл

@ -485,7 +485,7 @@ GlobalObject::createInternal(JSContext* cx, const Class* clasp)
return nullptr; return nullptr;
global->setReservedSlot(EMPTY_GLOBAL_SCOPE, PrivateGCThingValue(emptyGlobalScope)); global->setReservedSlot(EMPTY_GLOBAL_SCOPE, PrivateGCThingValue(emptyGlobalScope));
cx->compartment()->initGlobal(*global); cx->realm()->initGlobal(*global);
if (!JSObject::setQualifiedVarObj(cx, global)) if (!JSObject::setQualifiedVarObj(cx, global))
return nullptr; return nullptr;
@ -501,7 +501,7 @@ GlobalObject::new_(JSContext* cx, const Class* clasp, JSPrincipals* principals,
const JS::RealmOptions& options) const JS::RealmOptions& options)
{ {
MOZ_ASSERT(!cx->isExceptionPending()); MOZ_ASSERT(!cx->isExceptionPending());
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT_IF(cx->realm(), !cx->realm()->isAtomsRealm());
JSCompartment* compartment = NewCompartment(cx, principals, options); JSCompartment* compartment = NewCompartment(cx, principals, options);
if (!compartment) if (!compartment)

Просмотреть файл

@ -347,7 +347,7 @@ js::HasOffThreadIonCompile(JSCompartment* comp)
{ {
AutoLockHelperThreadState lock; AutoLockHelperThreadState lock;
if (!HelperThreadState().threads || comp->isAtomsCompartment()) if (!HelperThreadState().threads || JS::GetRealmForCompartment(comp)->isAtomsRealm())
return false; return false;
GlobalHelperThreadState::IonBuilderVector& worklist = HelperThreadState().ionWorklist(lock); GlobalHelperThreadState::IonBuilderVector& worklist = HelperThreadState().ionWorklist(lock);
@ -665,11 +665,10 @@ bool
js::OffThreadParsingMustWaitForGC(JSRuntime* rt) js::OffThreadParsingMustWaitForGC(JSRuntime* rt)
{ {
// Off thread parsing can't occur during incremental collections on the // Off thread parsing can't occur during incremental collections on the
// atoms compartment, to avoid triggering barriers. (Outside the atoms // atoms zone, to avoid triggering barriers. (Outside the atoms zone, the
// compartment, the compilation will use a new zone that is never // compilation will use a new zone that is never collected.) If an
// collected.) If an atoms-zone GC is in progress, hold off on executing the // atoms-zone GC is in progress, hold off on executing the parse task until
// parse task until the atoms-zone GC completes (see // the atoms-zone GC completes (see EnqueuePendingParseTasksAfterGC).
// EnqueuePendingParseTasksAfterGC).
return rt->activeGCInAtomsZone(); return rt->activeGCInAtomsZone();
} }
@ -785,7 +784,7 @@ bool
StartOffThreadParseTask(JSContext* cx, ParseTask* task, const ReadOnlyCompileOptions& options) StartOffThreadParseTask(JSContext* cx, ParseTask* task, const ReadOnlyCompileOptions& options)
{ {
// Suppress GC so that calls below do not trigger a new incremental GC // Suppress GC so that calls below do not trigger a new incremental GC
// which could require barriers on the atoms compartment. // which could require barriers on the atoms zone.
gc::AutoSuppressGC nogc(cx); gc::AutoSuppressGC nogc(cx);
gc::AutoSuppressNurseryCellAlloc noNurseryAlloc(cx); gc::AutoSuppressNurseryCellAlloc noNurseryAlloc(cx);
AutoSuppressAllocationMetadataBuilder suppressMetadata(cx); AutoSuppressAllocationMetadataBuilder suppressMetadata(cx);

Просмотреть файл

@ -439,7 +439,7 @@ DefVarOperation(JSContext* cx, HandleObject varobj, HandlePropertyName dn, unsig
} }
if (varobj->is<GlobalObject>()) { if (varobj->is<GlobalObject>()) {
if (!varobj->compartment()->addToVarNames(cx, dn)) if (!varobj->realm()->addToVarNames(cx, dn))
return false; return false;
} }

Просмотреть файл

@ -4468,7 +4468,7 @@ js::DefFunOperation(JSContext* cx, HandleScript script, HandleObject envChain,
if (!DefineDataProperty(cx, parent, name, rval, attrs)) if (!DefineDataProperty(cx, parent, name, rval, attrs))
return false; return false;
return parent->is<GlobalObject>() ? parent->compartment()->addToVarNames(cx, name) : true; return parent->is<GlobalObject>() ? parent->realm()->addToVarNames(cx, name) : true;
} }
/* /*
@ -4494,7 +4494,7 @@ js::DefFunOperation(JSContext* cx, HandleScript script, HandleObject envChain,
// Careful: the presence of a shape, even one appearing to derive from // Careful: the presence of a shape, even one appearing to derive from
// a variable declaration, doesn't mean it's in [[VarNames]]. // a variable declaration, doesn't mean it's in [[VarNames]].
if (!parent->compartment()->addToVarNames(cx, name)) if (!parent->realm()->addToVarNames(cx, name))
return false; return false;
} }
@ -4718,7 +4718,7 @@ js::DeleteNameOperation(JSContext* cx, HandlePropertyName name, HandleObject sco
if (status) { if (status) {
// Deleting a name from the global object removes it from [[VarNames]]. // Deleting a name from the global object removes it from [[VarNames]].
if (pobj == scope && scope->is<GlobalObject>()) if (pobj == scope && scope->is<GlobalObject>())
scope->compartment()->removeFromVarNames(name); scope->realm()->removeFromVarNames(name);
} }
return true; return true;

Просмотреть файл

@ -16,28 +16,28 @@
#include "vm/JSContext-inl.h" #include "vm/JSContext-inl.h"
inline void inline void
JSCompartment::initGlobal(js::GlobalObject& global) JS::Realm::initGlobal(js::GlobalObject& global)
{ {
MOZ_ASSERT(global.compartment() == this); MOZ_ASSERT(global.realm() == this);
MOZ_ASSERT(!global_); MOZ_ASSERT(!global_);
global_.set(&global); global_.set(&global);
} }
js::GlobalObject* js::GlobalObject*
JSCompartment::maybeGlobal() const JS::Realm::maybeGlobal() const
{ {
MOZ_ASSERT_IF(global_, global_->compartment() == this); MOZ_ASSERT_IF(global_, global_->realm() == this);
return global_; return global_;
} }
js::GlobalObject* js::GlobalObject*
JSCompartment::unsafeUnbarrieredMaybeGlobal() const JS::Realm::unsafeUnbarrieredMaybeGlobal() const
{ {
return *global_.unsafeGet(); return *global_.unsafeGet();
} }
inline bool inline bool
JSCompartment::globalIsAboutToBeFinalized() JS::Realm::globalIsAboutToBeFinalized()
{ {
MOZ_ASSERT(zone_->isGCSweeping()); MOZ_ASSERT(zone_->isGCSweeping());
return global_ && js::gc::IsAboutToBeFinalizedUnbarriered(global_.unsafeGet()); return global_ && js::gc::IsAboutToBeFinalizedUnbarriered(global_.unsafeGet());
@ -53,25 +53,25 @@ js::AutoRealm::AutoRealm(JSContext* cx, const T& target)
} }
// Protected constructor that bypasses assertions in enterCompartmentOf. Used // Protected constructor that bypasses assertions in enterCompartmentOf. Used
// only for entering the atoms compartment. // only for entering the atoms realm.
js::AutoRealm::AutoRealm(JSContext* cx, JS::Realm* target, js::AutoRealm::AutoRealm(JSContext* cx, JS::Realm* target,
js::AutoLockForExclusiveAccess& lock) js::AutoLockForExclusiveAccess& lock)
: cx_(cx), : cx_(cx),
origin_(cx->realm()), origin_(cx->realm()),
maybeLock_(&lock) maybeLock_(&lock)
{ {
MOZ_ASSERT(target->isAtomsCompartment()); MOZ_ASSERT(target->isAtomsRealm());
cx_->enterAtomsRealm(target, lock); cx_->enterAtomsRealm(target, lock);
} }
// Protected constructor that bypasses assertions in enterCompartmentOf. Should // Protected constructor that bypasses assertions in enterCompartmentOf. Should
// not be used to enter the atoms compartment. // not be used to enter the atoms realm.
js::AutoRealm::AutoRealm(JSContext* cx, JS::Realm* target) js::AutoRealm::AutoRealm(JSContext* cx, JS::Realm* target)
: cx_(cx), : cx_(cx),
origin_(cx->realm()), origin_(cx->realm()),
maybeLock_(nullptr) maybeLock_(nullptr)
{ {
MOZ_ASSERT(!target->isAtomsCompartment()); MOZ_ASSERT(!target->isAtomsRealm());
cx_->enterNonAtomsRealm(target); cx_->enterNonAtomsRealm(target);
} }
@ -82,7 +82,7 @@ js::AutoRealm::~AutoRealm()
js::AutoAtomsRealm::AutoAtomsRealm(JSContext* cx, js::AutoAtomsRealm::AutoAtomsRealm(JSContext* cx,
js::AutoLockForExclusiveAccess& lock) js::AutoLockForExclusiveAccess& lock)
: AutoRealm(cx, JS::GetRealmForCompartment(cx->atomsCompartment(lock)), lock) : AutoRealm(cx, cx->atomsRealm(lock), lock)
{} {}
js::AutoRealmUnchecked::AutoRealmUnchecked(JSContext* cx, JSCompartment* target) js::AutoRealmUnchecked::AutoRealmUnchecked(JSContext* cx, JSCompartment* target)
@ -98,8 +98,8 @@ JSCompartment::wrap(JSContext* cx, JS::MutableHandleValue vp)
/* /*
* Symbols are GC things, but never need to be wrapped or copied because * Symbols are GC things, but never need to be wrapped or copied because
* they are always allocated in the atoms compartment. They still need to * they are always allocated in the atoms zone. They still need to be
* be marked in the new compartment's zone, however. * marked in the new compartment's zone, however.
*/ */
if (vp.isSymbol()) { if (vp.isSymbol()) {
cx->markAtomValue(vp); cx->markAtomValue(vp);

Просмотреть файл

@ -46,14 +46,12 @@ JSCompartment::JSCompartment(Zone* zone)
runtime_(zone->runtimeFromAnyThread()), runtime_(zone->runtimeFromAnyThread()),
principals_(nullptr), principals_(nullptr),
isSystem_(false), isSystem_(false),
isAtomsCompartment_(false),
isSelfHosting(false), isSelfHosting(false),
marked(true), marked(true),
warnedAboutStringGenericsMethods(0), warnedAboutStringGenericsMethods(0),
#ifdef DEBUG #ifdef DEBUG
firedOnNewGlobalObject(false), firedOnNewGlobalObject(false),
#endif #endif
global_(nullptr),
enterCompartmentDepth(0), enterCompartmentDepth(0),
performanceMonitoring(runtime_), performanceMonitoring(runtime_),
data(nullptr), data(nullptr),
@ -95,7 +93,8 @@ JSCompartment::JSCompartment(Zone* zone)
JS::Realm::Realm(JS::Zone* zone, const JS::RealmOptions& options) JS::Realm::Realm(JS::Zone* zone, const JS::RealmOptions& options)
: JSCompartment(zone), : JSCompartment(zone),
creationOptions_(options.creationOptions()), creationOptions_(options.creationOptions()),
behaviors_(options.behaviors()) behaviors_(options.behaviors()),
global_(nullptr)
{ {
MOZ_ASSERT_IF(creationOptions_.mergeable(), MOZ_ASSERT_IF(creationOptions_.mergeable(),
creationOptions_.invisibleToDebugger()); creationOptions_.invisibleToDebugger());
@ -131,23 +130,34 @@ JSCompartment::~JSCompartment()
bool bool
JSCompartment::init(JSContext* maybecx) JSCompartment::init(JSContext* maybecx)
{ {
/*
* maybecx is null when called to create the atoms compartment from
* JSRuntime::init().
*
* As a hack, we clear our timezone cache every time we create a new
* compartment. This ensures that the cache is always relatively fresh, but
* shouldn't interfere with benchmarks that create tons of date objects
* (unless they also create tons of iframes, which seems unlikely).
*/
JS::ResetTimeZone();
if (!crossCompartmentWrappers.init(0)) { if (!crossCompartmentWrappers.init(0)) {
if (maybecx) if (maybecx)
ReportOutOfMemory(maybecx); ReportOutOfMemory(maybecx);
return false; return false;
} }
return true;
}
bool
Realm::init(JSContext* maybecx)
{
// Initialize JSCompartment. This is temporary until Realm and
// JSCompartment are completely separated.
if (!JSCompartment::init(maybecx))
return false;
/*
* maybecx is null when called to create the atoms realm from
* JSRuntime::init().
*
* As a hack, we clear our timezone cache every time we create a new realm.
* This ensures that the cache is always relatively fresh, but shouldn't
* interfere with benchmarks that create tons of date objects (unless they
* also create tons of iframes, which seems unlikely).
*/
JS::ResetTimeZone();
enumerators = NativeIterator::allocateSentinel(maybecx); enumerators = NativeIterator::allocateSentinel(maybecx);
if (!enumerators) if (!enumerators)
return false; return false;
@ -167,7 +177,7 @@ JSCompartment::init(JSContext* maybecx)
jit::JitRuntime* jit::JitRuntime*
JSRuntime::createJitRuntime(JSContext* cx) JSRuntime::createJitRuntime(JSContext* cx)
{ {
// The shared stubs are created in the atoms compartment, which may be // The shared stubs are created in the atoms zone, which may be
// accessed by other threads with an exclusive context. // accessed by other threads with an exclusive context.
AutoLockForExclusiveAccess atomsLock(cx); AutoLockForExclusiveAccess atomsLock(cx);
@ -603,10 +613,10 @@ JSCompartment::getNonSyntacticLexicalEnvironment(JSObject* enclosing) const
} }
bool bool
JSCompartment::addToVarNames(JSContext* cx, JS::Handle<JSAtom*> name) Realm::addToVarNames(JSContext* cx, JS::Handle<JSAtom*> name)
{ {
MOZ_ASSERT(name); MOZ_ASSERT(name);
MOZ_ASSERT(!isAtomsCompartment()); MOZ_ASSERT(!isAtomsRealm());
if (varNames_.put(name)) if (varNames_.put(name))
return true; return true;
@ -648,11 +658,10 @@ JSCompartment::traceIncomingCrossCompartmentEdgesForZoneGC(JSTracer* trc)
} }
void void
JSCompartment::traceGlobal(JSTracer* trc) Realm::traceGlobal(JSTracer* trc)
{ {
// Trace things reachable from the compartment's global. Note that these // Trace things reachable from the realm's global. Note that these edges
// edges must be swept too in case the compartment is live but the global is // must be swept too in case the realm is live but the global is not.
// not.
savedStacks_.trace(trc); savedStacks_.trace(trc);
@ -662,7 +671,7 @@ JSCompartment::traceGlobal(JSTracer* trc)
} }
void void
JSCompartment::traceRoots(JSTracer* trc, js::gc::GCRuntime::TraceOrMarkRuntime traceOrMark) Realm::traceRoots(JSTracer* trc, js::gc::GCRuntime::TraceOrMarkRuntime traceOrMark)
{ {
if (objectMetadataState.is<PendingMetadata>()) { if (objectMetadataState.is<PendingMetadata>()) {
TraceRoot(trc, TraceRoot(trc,
@ -725,7 +734,7 @@ JSCompartment::traceRoots(JSTracer* trc, js::gc::GCRuntime::TraceOrMarkRuntime t
} }
void void
JSCompartment::finishRoots() Realm::finishRoots()
{ {
if (debugEnvs) if (debugEnvs)
debugEnvs->finish(); debugEnvs->finish();
@ -764,7 +773,7 @@ JSCompartment::sweepSavedStacks()
} }
void void
JSCompartment::sweepGlobalObject() Realm::sweepGlobalObject()
{ {
if (global_ && IsAboutToBeFinalized(&global_)) if (global_ && IsAboutToBeFinalized(&global_))
global_.set(nullptr); global_.set(nullptr);
@ -831,7 +840,7 @@ JSCompartment::sweepCrossCompartmentWrappers()
} }
void void
JSCompartment::sweepVarNames() Realm::sweepVarNames()
{ {
varNames_.sweep(); varNames_.sweep();
} }
@ -909,8 +918,10 @@ JSCompartment::fixupAfterMovingGC()
{ {
MOZ_ASSERT(zone()->isGCCompacting()); MOZ_ASSERT(zone()->isGCCompacting());
Realm* realm = JS::GetRealmForCompartment(this);
purge(); purge();
fixupGlobal(); realm->fixupGlobal();
objectGroups.fixupTablesAfterMovingGC(); objectGroups.fixupTablesAfterMovingGC();
fixupScriptMapsAfterMovingGC(); fixupScriptMapsAfterMovingGC();
@ -920,7 +931,7 @@ JSCompartment::fixupAfterMovingGC()
} }
void void
JSCompartment::fixupGlobal() Realm::fixupGlobal()
{ {
GlobalObject* global = *global_.unsafeGet(); GlobalObject* global = *global_.unsafeGet();
if (global) if (global)
@ -1008,14 +1019,13 @@ JSCompartment::purge()
} }
void void
JSCompartment::clearTables() Realm::clearTables()
{ {
global_.set(nullptr); global_.set(nullptr);
// No scripts should have run in this compartment. This is used when // No scripts should have run in this realm. This is used when merging
// merging a compartment that has been used off thread into another // a realm that has been used off thread into another realm and zone.
// compartment and zone. JS::GetCompartmentForRealm(this)->assertNoCrossCompartmentWrappers();
MOZ_ASSERT(crossCompartmentWrappers.empty());
MOZ_ASSERT(!jitCompartment_); MOZ_ASSERT(!jitCompartment_);
MOZ_ASSERT(!debugEnvs); MOZ_ASSERT(!debugEnvs);
MOZ_ASSERT(enumerators->next() == enumerators); MOZ_ASSERT(enumerators->next() == enumerators);
@ -1184,9 +1194,10 @@ JSCompartment::updateDebuggerObservesFlag(unsigned flag)
flag == DebuggerObservesAsmJS || flag == DebuggerObservesAsmJS ||
flag == DebuggerObservesBinarySource); flag == DebuggerObservesBinarySource);
Realm* realm = JS::GetRealmForCompartment(this);
GlobalObject* global = zone()->runtimeFromMainThread()->gc.isForegroundSweeping() GlobalObject* global = zone()->runtimeFromMainThread()->gc.isForegroundSweeping()
? unsafeUnbarrieredMaybeGlobal() ? realm->unsafeUnbarrieredMaybeGlobal()
: maybeGlobal(); : realm->maybeGlobal();
const GlobalObject::DebuggerVector* v = global->getDebuggers(); const GlobalObject::DebuggerVector* v = global->getDebuggers();
for (auto p = v->begin(); p != v->end(); p++) { for (auto p = v->begin(); p != v->end(); p++) {
Debugger* dbg = *p; Debugger* dbg = *p;
@ -1301,35 +1312,47 @@ JSCompartment::clearBreakpointsIn(FreeOp* fop, js::Debugger* dbg, HandleObject h
} }
void void
JSCompartment::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JSCompartment::addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf,
size_t* tiAllocationSiteTables, size_t* crossCompartmentWrappersArg)
size_t* tiArrayTypeTables,
size_t* tiObjectTypeTables,
size_t* compartmentObject,
size_t* compartmentTables,
size_t* innerViewsArg,
size_t* lazyArrayBuffersArg,
size_t* objectMetadataTablesArg,
size_t* crossCompartmentWrappersArg,
size_t* savedStacksSet,
size_t* varNamesSet,
size_t* nonSyntacticLexicalEnvironmentsArg,
size_t* jitCompartment,
size_t* privateData,
size_t* scriptCountsMapArg)
{ {
*compartmentObject += mallocSizeOf(this); // Note that Realm inherits from JSCompartment (for now) so sizeof(*this) is
// included in that.
*crossCompartmentWrappersArg += crossCompartmentWrappers.sizeOfExcludingThis(mallocSizeOf);
}
void
Realm::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf,
size_t* tiAllocationSiteTables,
size_t* tiArrayTypeTables,
size_t* tiObjectTypeTables,
size_t* realmObject,
size_t* realmTables,
size_t* innerViewsArg,
size_t* lazyArrayBuffersArg,
size_t* objectMetadataTablesArg,
size_t* crossCompartmentWrappersArg,
size_t* savedStacksSet,
size_t* varNamesSet,
size_t* nonSyntacticLexicalEnvironmentsArg,
size_t* jitCompartment,
size_t* privateData,
size_t* scriptCountsMapArg)
{
// This is temporary until Realm and JSCompartment are completely separated.
JSCompartment::addSizeOfExcludingThis(mallocSizeOf, crossCompartmentWrappersArg);
*realmObject += mallocSizeOf(this);
objectGroups.addSizeOfExcludingThis(mallocSizeOf, tiAllocationSiteTables, objectGroups.addSizeOfExcludingThis(mallocSizeOf, tiAllocationSiteTables,
tiArrayTypeTables, tiObjectTypeTables, tiArrayTypeTables, tiObjectTypeTables,
compartmentTables); realmTables);
wasm.addSizeOfExcludingThis(mallocSizeOf, compartmentTables); wasm.addSizeOfExcludingThis(mallocSizeOf, realmTables);
*innerViewsArg += innerViews.sizeOfExcludingThis(mallocSizeOf); *innerViewsArg += innerViews.sizeOfExcludingThis(mallocSizeOf);
if (lazyArrayBuffers) if (lazyArrayBuffers)
*lazyArrayBuffersArg += lazyArrayBuffers->sizeOfIncludingThis(mallocSizeOf); *lazyArrayBuffersArg += lazyArrayBuffers->sizeOfIncludingThis(mallocSizeOf);
if (objectMetadataTable) if (objectMetadataTable)
*objectMetadataTablesArg += objectMetadataTable->sizeOfIncludingThis(mallocSizeOf); *objectMetadataTablesArg += objectMetadataTable->sizeOfIncludingThis(mallocSizeOf);
*crossCompartmentWrappersArg += crossCompartmentWrappers.sizeOfExcludingThis(mallocSizeOf);
*savedStacksSet += savedStacks_.sizeOfExcludingThis(mallocSizeOf); *savedStacksSet += savedStacks_.sizeOfExcludingThis(mallocSizeOf);
*varNamesSet += varNames_.sizeOfExcludingThis(mallocSizeOf); *varNamesSet += varNames_.sizeOfExcludingThis(mallocSizeOf);
if (nonSyntacticLexicalEnvironments_) if (nonSyntacticLexicalEnvironments_)

Просмотреть файл

@ -550,7 +550,7 @@ class WeakMapBase;
struct JSCompartment struct JSCompartment
{ {
private: protected:
JS::Zone* zone_; JS::Zone* zone_;
JSRuntime* runtime_; JSRuntime* runtime_;
@ -596,13 +596,6 @@ struct JSCompartment
isSystem_ = isSystem; isSystem_ = isSystem;
} }
bool isAtomsCompartment() const {
return isAtomsCompartment_;
}
void setIsAtomsCompartment() {
isAtomsCompartment_ = true;
}
// Used to approximate non-content code when reporting telemetry. // Used to approximate non-content code when reporting telemetry.
inline bool isProbablySystemCode() const { inline bool isProbablySystemCode() const {
return isSystem_; return isSystem_;
@ -610,7 +603,6 @@ struct JSCompartment
private: private:
JSPrincipals* principals_; JSPrincipals* principals_;
bool isSystem_; bool isSystem_;
bool isAtomsCompartment_;
public: public:
bool isSelfHosting; bool isSelfHosting;
@ -626,7 +618,6 @@ struct JSCompartment
private: private:
friend struct JSRuntime; friend struct JSRuntime;
friend struct JSContext; friend struct JSContext;
js::ReadBarrieredGlobalObject global_;
unsigned enterCompartmentDepth; unsigned enterCompartmentDepth;
@ -657,46 +648,22 @@ struct JSCompartment
return runtime_; return runtime_;
} }
/* The global object for this compartment.
*
* This returns nullptr if this is the atoms compartment. (The global_
* field is also null briefly during GC, after the global object is
* collected; but when that happens the JSCompartment is destroyed during
* the same GC.)
*
* In contrast, JSObject::global() is infallible because marking a JSObject
* always marks its global as well.
* TODO: add infallible JSScript::global()
*/
inline js::GlobalObject* maybeGlobal() const;
/* An unbarriered getter for use while tracing. */
inline js::GlobalObject* unsafeUnbarrieredMaybeGlobal() const;
/* True if a global object exists, but it's being collected. */
inline bool globalIsAboutToBeFinalized();
inline void initGlobal(js::GlobalObject& global);
public: public:
void* data; void* data;
void* realmData; void* realmData;
private: protected:
const js::AllocationMetadataBuilder *allocationMetadataBuilder; const js::AllocationMetadataBuilder *allocationMetadataBuilder;
js::SavedStacks savedStacks_; js::SavedStacks savedStacks_;
private:
js::WrapperMap crossCompartmentWrappers; js::WrapperMap crossCompartmentWrappers;
// The global environment record's [[VarNames]] list that contains all public:
// names declared using FunctionDeclaration, GeneratorDeclaration, and void assertNoCrossCompartmentWrappers() {
// VariableDeclaration declarations in global code in this compartment. MOZ_ASSERT(crossCompartmentWrappers.empty());
// Names are only removed from this list by a |delete IdentifierReference| }
// that successfully removes that global property.
JS::GCHashSet<JSAtom*,
js::DefaultHasher<JSAtom*>,
js::SystemAllocPolicy> varNames_;
public: public:
/* Last time at which an animation was played for a global in this compartment. */ /* Last time at which an animation was played for a global in this compartment. */
@ -724,7 +691,7 @@ struct JSCompartment
// might be detached. // might be detached.
int32_t detachedTypedObjects; int32_t detachedTypedObjects;
private: protected:
friend class js::AutoSetNewObjectMetadata; friend class js::AutoSetNewObjectMetadata;
js::NewObjectMetadataState objectMetadataState; js::NewObjectMetadataState objectMetadataState;
@ -744,24 +711,11 @@ struct JSCompartment
} }
} }
public: protected:
void addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, void addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf,
size_t* tiAllocationSiteTables, size_t* crossCompartmentWrappersArg);
size_t* tiArrayTypeTables,
size_t* tiObjectTypeTables,
size_t* compartmentObject,
size_t* compartmentTables,
size_t* innerViews,
size_t* lazyArrayBuffers,
size_t* objectMetadataTables,
size_t* crossCompartmentWrappers,
size_t* savedStacksSet,
size_t* varNamesSet,
size_t* nonSyntacticLexicalScopes,
size_t* jitCompartment,
size_t* privateData,
size_t* scriptCountsMapArg);
public:
// Object group tables and other state in the compartment. // Object group tables and other state in the compartment.
js::ObjectGroupCompartment objectGroups; js::ObjectGroupCompartment objectGroups;
@ -794,7 +748,7 @@ struct JSCompartment
// WebAssembly state for the compartment. // WebAssembly state for the compartment.
js::wasm::Compartment wasm; js::wasm::Compartment wasm;
private: protected:
// All non-syntactic lexical environments in the compartment. These are kept in // All non-syntactic lexical environments in the compartment. These are kept in
// a map because when loading scripts into a non-syntactic environment, we need // a map because when loading scripts into a non-syntactic environment, we need
// to use the same lexical environment to persist lexical bindings. // to use the same lexical environment to persist lexical bindings.
@ -848,9 +802,9 @@ struct JSCompartment
explicit JSCompartment(JS::Zone* zone); explicit JSCompartment(JS::Zone* zone);
~JSCompartment(); ~JSCompartment();
public:
MOZ_MUST_USE bool init(JSContext* maybecx); MOZ_MUST_USE bool init(JSContext* maybecx);
public:
MOZ_MUST_USE inline bool wrap(JSContext* cx, JS::MutableHandleValue vp); MOZ_MUST_USE inline bool wrap(JSContext* cx, JS::MutableHandleValue vp);
MOZ_MUST_USE bool wrap(JSContext* cx, js::MutableHandleString strp); MOZ_MUST_USE bool wrap(JSContext* cx, js::MutableHandleString strp);
@ -896,20 +850,6 @@ struct JSCompartment
getOrCreateNonSyntacticLexicalEnvironment(JSContext* cx, js::HandleObject enclosing); getOrCreateNonSyntacticLexicalEnvironment(JSContext* cx, js::HandleObject enclosing);
js::LexicalEnvironmentObject* getNonSyntacticLexicalEnvironment(JSObject* enclosing) const; js::LexicalEnvironmentObject* getNonSyntacticLexicalEnvironment(JSObject* enclosing) const;
/*
* This method traces data that is live iff we know that this compartment's
* global is still live.
*/
void traceGlobal(JSTracer* trc);
/*
* This method traces JSCompartment-owned GC roots that are considered live
* regardless of whether the compartment's global is still live.
*/
void traceRoots(JSTracer* trc, js::gc::GCRuntime::TraceOrMarkRuntime traceOrMark);
/*
* This method clears out tables of roots in preparation for the final GC.
*/
void finishRoots();
/* /*
* These methods mark pointers that cross compartment boundaries. They are * These methods mark pointers that cross compartment boundaries. They are
* called in per-zone GCs to prevent the wrappers' outgoing edges from * called in per-zone GCs to prevent the wrappers' outgoing edges from
@ -924,21 +864,17 @@ struct JSCompartment
void sweepCrossCompartmentWrappers(); void sweepCrossCompartmentWrappers();
void sweepSavedStacks(); void sweepSavedStacks();
void sweepGlobalObject();
void sweepSelfHostingScriptSource(); void sweepSelfHostingScriptSource();
void sweepJitCompartment(); void sweepJitCompartment();
void sweepRegExps(); void sweepRegExps();
void sweepDebugEnvironments(); void sweepDebugEnvironments();
void sweepNativeIterators(); void sweepNativeIterators();
void sweepTemplateObjects(); void sweepTemplateObjects();
void sweepVarNames();
void purge(); void purge();
void clearTables();
static void fixupCrossCompartmentWrappersAfterMovingGC(JSTracer* trc); static void fixupCrossCompartmentWrappersAfterMovingGC(JSTracer* trc);
void fixupAfterMovingGC(); void fixupAfterMovingGC();
void fixupGlobal();
void fixupScriptMapsAfterMovingGC(); void fixupScriptMapsAfterMovingGC();
bool hasAllocationMetadataBuilder() const { return allocationMetadataBuilder; } bool hasAllocationMetadataBuilder() const { return allocationMetadataBuilder; }
@ -955,18 +891,6 @@ struct JSCompartment
js::SavedStacks& savedStacks() { return savedStacks_; } js::SavedStacks& savedStacks() { return savedStacks_; }
// Add a name to [[VarNames]]. Reports OOM on failure.
MOZ_MUST_USE bool addToVarNames(JSContext* cx, JS::Handle<JSAtom*> name);
void removeFromVarNames(JS::Handle<JSAtom*> name) {
varNames_.remove(name);
}
// Whether the given name is in [[VarNames]].
bool isInVarNames(JS::Handle<JSAtom*> name) {
return varNames_.has(name);
}
void findOutgoingEdges(js::gc::ZoneComponentFinder& finder); void findOutgoingEdges(js::gc::ZoneComponentFinder& finder);
js::DtoaCache dtoaCache; js::DtoaCache dtoaCache;
@ -1151,7 +1075,7 @@ struct JSCompartment
bool scheduledForDestruction; bool scheduledForDestruction;
bool maybeAlive; bool maybeAlive;
private: protected:
js::jit::JitCompartment* jitCompartment_; js::jit::JitCompartment* jitCompartment_;
js::ReadBarriered<js::ArgumentsObject*> mappedArgumentsTemplate_; js::ReadBarriered<js::ArgumentsObject*> mappedArgumentsTemplate_;
@ -1206,7 +1130,26 @@ class JS::Realm : public JSCompartment
public: public:
Realm(JS::Zone* zone, const JS::RealmOptions& options); Realm(JS::Zone* zone, const JS::RealmOptions& options);
MOZ_MUST_USE bool init(JSContext* maybecx);
void destroy(js::FreeOp* fop); void destroy(js::FreeOp* fop);
void clearTables();
void addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf,
size_t* tiAllocationSiteTables,
size_t* tiArrayTypeTables,
size_t* tiObjectTypeTables,
size_t* realmObject,
size_t* realmTables,
size_t* innerViews,
size_t* lazyArrayBuffers,
size_t* objectMetadataTables,
size_t* crossCompartmentWrappers,
size_t* savedStacksSet,
size_t* varNamesSet,
size_t* nonSyntacticLexicalScopes,
size_t* jitCompartment,
size_t* privateData,
size_t* scriptCountsMapArg);
const JS::RealmCreationOptions& creationOptions() const { return creationOptions_; } const JS::RealmCreationOptions& creationOptions() const { return creationOptions_; }
JS::RealmBehaviors& behaviors() { return behaviors_; } JS::RealmBehaviors& behaviors() { return behaviors_; }
@ -1214,6 +1157,82 @@ class JS::Realm : public JSCompartment
/* Whether to preserve JIT code on non-shrinking GCs. */ /* Whether to preserve JIT code on non-shrinking GCs. */
bool preserveJitCode() { return creationOptions_.preserveJitCode(); } bool preserveJitCode() { return creationOptions_.preserveJitCode(); }
private:
bool isAtomsRealm_ = false;
public:
bool isAtomsRealm() const {
return isAtomsRealm_;
}
void setIsAtomsRealm() {
isAtomsRealm_ = true;
}
private:
friend struct ::JSContext;
js::ReadBarrieredGlobalObject global_;
public:
/* The global object for this realm.
*
* This returns nullptr if this is the atoms realm. (The global_ field is
* also null briefly during GC, after the global object is collected; but
* when that happens the Realm is destroyed during the same GC.)
*
* In contrast, JSObject::global() is infallible because marking a JSObject
* always marks its global as well.
*/
inline js::GlobalObject* maybeGlobal() const;
/* An unbarriered getter for use while tracing. */
inline js::GlobalObject* unsafeUnbarrieredMaybeGlobal() const;
/* True if a global object exists, but it's being collected. */
inline bool globalIsAboutToBeFinalized();
inline void initGlobal(js::GlobalObject& global);
/*
* This method traces data that is live iff we know that this realm's
* global is still live.
*/
void traceGlobal(JSTracer* trc);
void sweepGlobalObject();
void fixupGlobal();
/*
* This method traces Realm-owned GC roots that are considered live
* regardless of whether the realm's global is still live.
*/
void traceRoots(JSTracer* trc, js::gc::GCRuntime::TraceOrMarkRuntime traceOrMark);
/*
* This method clears out tables of roots in preparation for the final GC.
*/
void finishRoots();
private:
// The global environment record's [[VarNames]] list that contains all
// names declared using FunctionDeclaration, GeneratorDeclaration, and
// VariableDeclaration declarations in global code in this realm.
// Names are only removed from this list by a |delete IdentifierReference|
// that successfully removes that global property.
using VarNamesSet = JS::GCHashSet<JSAtom*,
js::DefaultHasher<JSAtom*>,
js::SystemAllocPolicy>;
VarNamesSet varNames_;
public:
// Add a name to [[VarNames]]. Reports OOM on failure.
MOZ_MUST_USE bool addToVarNames(JSContext* cx, JS::Handle<JSAtom*> name);
void sweepVarNames();
void removeFromVarNames(JS::Handle<JSAtom*> name) {
varNames_.remove(name);
}
// Whether the given name is in [[VarNames]].
bool isInVarNames(JS::Handle<JSAtom*> name) {
return varNames_.has(name);
}
}; };
namespace js { namespace js {
@ -1239,8 +1258,7 @@ JSContext::global() const
* safe to use. * safe to use.
*/ */
MOZ_ASSERT(realm_, "Caller needs to enter a realm first"); MOZ_ASSERT(realm_, "Caller needs to enter a realm first");
JSCompartment* comp = GetCompartmentForRealm(realm_); return js::Handle<js::GlobalObject*>::fromMarkedLocation(realm_->global_.unsafeGet());
return js::Handle<js::GlobalObject*>::fromMarkedLocation(comp->global_.unsafeGet());
} }
namespace js { namespace js {
@ -1282,7 +1300,7 @@ class AutoRealm
protected: protected:
inline AutoRealm(JSContext* cx, JS::Realm* target); inline AutoRealm(JSContext* cx, JS::Realm* target);
// Used only for entering the atoms compartment. // Used only for entering the atoms realm.
inline AutoRealm(JSContext* cx, JS::Realm* target, inline AutoRealm(JSContext* cx, JS::Realm* target,
AutoLockForExclusiveAccess& lock); AutoLockForExclusiveAccess& lock);

Просмотреть файл

@ -491,7 +491,7 @@ inline void
JSContext::enterRealmOf(const T& target) JSContext::enterRealmOf(const T& target)
{ {
MOZ_ASSERT(JS::CellIsNotGray(target)); MOZ_ASSERT(JS::CellIsNotGray(target));
enterNonAtomsRealm(JS::GetRealmForCompartment(target->compartment())); enterNonAtomsRealm(target->realm());
} }
inline void inline void
@ -520,12 +520,12 @@ JSContext::setRealm(JS::Realm* realm,
const js::AutoLockForExclusiveAccess* maybeLock /* = nullptr */) const js::AutoLockForExclusiveAccess* maybeLock /* = nullptr */)
{ {
// Only one thread can be in the atoms realm at a time. // Only one thread can be in the atoms realm at a time.
MOZ_ASSERT_IF(runtime_->isAtomsCompartment(realm), maybeLock != nullptr); MOZ_ASSERT_IF(realm && realm->isAtomsRealm(), maybeLock != nullptr);
MOZ_ASSERT_IF(runtime_->isAtomsCompartment(realm) || runtime_->isAtomsCompartment(realm_), MOZ_ASSERT_IF((realm && realm->isAtomsRealm()) || (realm_ && realm_->isAtomsRealm()),
runtime_->currentThreadHasExclusiveAccess()); runtime_->currentThreadHasExclusiveAccess());
// Make sure that the atoms realm has its own zone. // Make sure that the atoms realm has its own zone.
MOZ_ASSERT_IF(realm && !runtime_->isAtomsCompartment(realm), MOZ_ASSERT_IF(realm && !realm->isAtomsRealm(),
!realm->zone()->isAtomsZone()); !realm->zone()->isAtomsZone());
// Both the current and the new realm should be properly marked as // Both the current and the new realm should be properly marked as

Просмотреть файл

@ -1355,7 +1355,7 @@ JSContext::getPendingException(MutableHandleValue rval)
{ {
MOZ_ASSERT(throwing); MOZ_ASSERT(throwing);
rval.set(unwrappedException()); rval.set(unwrappedException());
if (IsAtomsCompartment(compartment())) if (realm()->isAtomsRealm())
return true; return true;
bool wasOverRecursed = overRecursed_; bool wasOverRecursed = overRecursed_;
clearPendingException(); clearPendingException();

Просмотреть файл

@ -275,8 +275,8 @@ struct JSContext : public JS::RootingContext,
js::AtomSet& atoms(js::AutoLockForExclusiveAccess& lock) { js::AtomSet& atoms(js::AutoLockForExclusiveAccess& lock) {
return runtime_->atoms(lock); return runtime_->atoms(lock);
} }
JSCompartment* atomsCompartment(js::AutoLockForExclusiveAccess& lock) { JS::Realm* atomsRealm(js::AutoLockForExclusiveAccess& lock) {
return runtime_->atomsCompartment(lock); return runtime_->atomsRealm(lock);
} }
js::SymbolRegistry& symbolRegistry(js::AutoLockForExclusiveAccess& lock) { js::SymbolRegistry& symbolRegistry(js::AutoLockForExclusiveAccess& lock) {
return runtime_->symbolRegistry(lock); return runtime_->symbolRegistry(lock);
@ -557,7 +557,7 @@ struct JSContext : public JS::RootingContext,
// stacks of exclusive threads, so we need to avoid collecting their // stacks of exclusive threads, so we need to avoid collecting their
// objects in another way. The only GC thing pointers they have are to // objects in another way. The only GC thing pointers they have are to
// their exclusive compartment (which is not collected) or to the atoms // their exclusive compartment (which is not collected) or to the atoms
// compartment. Therefore, we avoid collecting the atoms compartment when // compartment. Therefore, we avoid collecting the atoms zone when
// exclusive threads are running. // exclusive threads are running.
js::ThreadData<unsigned> keepAtoms; js::ThreadData<unsigned> keepAtoms;

Просмотреть файл

@ -394,17 +394,17 @@ JSObject::global() const
{ {
/* /*
* The global is read-barriered so that it is kept live by access through * The global is read-barriered so that it is kept live by access through
* the JSCompartment. When accessed through a JSObject, however, the global * the Realm. When accessed through a JSObject, however, the global will be
* will be already be kept live by the black JSObject's parent pointer, so * already kept live by the black JSObject's group pointer, so does not
* does not need to be read-barriered. * need to be read-barriered.
*/ */
return *compartment()->unsafeUnbarrieredMaybeGlobal(); return *realm()->unsafeUnbarrieredMaybeGlobal();
} }
inline js::GlobalObject* inline js::GlobalObject*
JSObject::globalForTracing(JSTracer*) const JSObject::globalForTracing(JSTracer*) const
{ {
return compartment()->unsafeUnbarrieredMaybeGlobal(); return realm()->unsafeUnbarrieredMaybeGlobal();
} }
inline bool inline bool

Просмотреть файл

@ -138,10 +138,10 @@ inline js::GlobalObject&
JSScript::global() const JSScript::global() const
{ {
/* /*
* A JSScript always marks its compartment's global (via bindings) so we * A JSScript always marks its realm's global (via bindings) so we can
* can assert that maybeGlobal is non-null here. * assert that maybeGlobal is non-null here.
*/ */
return *compartment()->maybeGlobal(); return *realm()->maybeGlobal();
} }
inline js::LexicalScope* inline js::LexicalScope*

Просмотреть файл

@ -332,6 +332,8 @@ StatsZoneCallback(JSRuntime* rt, void* data, Zone* zone)
static void static void
StatsRealmCallback(JSContext* cx, void* data, JSCompartment* compartment) StatsRealmCallback(JSContext* cx, void* data, JSCompartment* compartment)
{ {
Realm* realm = JS::GetRealmForCompartment(compartment);
// Append a new RealmStats to the vector. // Append a new RealmStats to the vector.
RuntimeStats* rtStats = static_cast<StatsClosure*>(data)->rtStats; RuntimeStats* rtStats = static_cast<StatsClosure*>(data)->rtStats;
@ -342,25 +344,25 @@ StatsRealmCallback(JSContext* cx, void* data, JSCompartment* compartment)
MOZ_CRASH("oom"); MOZ_CRASH("oom");
rtStats->initExtraRealmStats(compartment, &realmStats); rtStats->initExtraRealmStats(compartment, &realmStats);
compartment->setRealmStats(&realmStats); realm->setRealmStats(&realmStats);
// Measure the compartment object itself, and things hanging off it. // Measure the realm object itself, and things hanging off it.
compartment->addSizeOfIncludingThis(rtStats->mallocSizeOf_, realm->addSizeOfIncludingThis(rtStats->mallocSizeOf_,
&realmStats.typeInferenceAllocationSiteTables, &realmStats.typeInferenceAllocationSiteTables,
&realmStats.typeInferenceArrayTypeTables, &realmStats.typeInferenceArrayTypeTables,
&realmStats.typeInferenceObjectTypeTables, &realmStats.typeInferenceObjectTypeTables,
&realmStats.realmObject, &realmStats.realmObject,
&realmStats.realmTables, &realmStats.realmTables,
&realmStats.innerViewsTable, &realmStats.innerViewsTable,
&realmStats.lazyArrayBuffersTable, &realmStats.lazyArrayBuffersTable,
&realmStats.objectMetadataTable, &realmStats.objectMetadataTable,
&realmStats.crossCompartmentWrappersTable, &realmStats.crossCompartmentWrappersTable,
&realmStats.savedStacksSet, &realmStats.savedStacksSet,
&realmStats.varNamesSet, &realmStats.varNamesSet,
&realmStats.nonSyntacticLexicalScopesTable, &realmStats.nonSyntacticLexicalScopesTable,
&realmStats.jitRealm, &realmStats.jitRealm,
&realmStats.privateData, &realmStats.privateData,
&realmStats.scriptCountsMap); &realmStats.scriptCountsMap);
} }
static void static void

Просмотреть файл

@ -22,27 +22,27 @@ gc::TraceRealm(JSTracer* trc, JS::Realm* realm, const char* name)
// reference to its GlobalObject, and vice versa. // reference to its GlobalObject, and vice versa.
// //
// Here we simply trace our side of that edge. During GC, // Here we simply trace our side of that edge. During GC,
// GCRuntime::traceRuntimeCommon() marks all other compartment roots, for // GCRuntime::traceRuntimeCommon() marks all other realm roots, for
// all compartments. // all realms.
JS::GetCompartmentForRealm(realm)->traceGlobal(trc); realm->traceGlobal(trc);
} }
JS_PUBLIC_API(bool) JS_PUBLIC_API(bool)
gc::RealmNeedsSweep(JS::Realm* realm) gc::RealmNeedsSweep(JS::Realm* realm)
{ {
return JS::GetCompartmentForRealm(realm)->globalIsAboutToBeFinalized(); return realm->globalIsAboutToBeFinalized();
} }
JS_PUBLIC_API(JS::Realm*) JS_PUBLIC_API(JS::Realm*)
JS::GetCurrentRealmOrNull(JSContext* cx) JS::GetCurrentRealmOrNull(JSContext* cx)
{ {
return JS::GetRealmForCompartment(cx->compartment()); return cx->realm();
} }
JS_PUBLIC_API(JS::Realm*) JS_PUBLIC_API(JS::Realm*)
JS::GetObjectRealmOrNull(JSObject* obj) JS::GetObjectRealmOrNull(JSObject* obj)
{ {
return IsCrossCompartmentWrapper(obj) ? nullptr : GetRealmForCompartment(obj->compartment()); return IsCrossCompartmentWrapper(obj) ? nullptr : obj->realm();
} }
JS_PUBLIC_API(void*) JS_PUBLIC_API(void*)
@ -72,7 +72,7 @@ JS::SetRealmNameCallback(JSContext* cx, JS::RealmNameCallback callback)
JS_PUBLIC_API(JSObject*) JS_PUBLIC_API(JSObject*)
JS::GetRealmGlobalOrNull(Handle<JS::Realm*> realm) JS::GetRealmGlobalOrNull(Handle<JS::Realm*> realm)
{ {
return GetCompartmentForRealm(realm)->maybeGlobal(); return realm->maybeGlobal();
} }
JS_PUBLIC_API(JSObject*) JS_PUBLIC_API(JSObject*)

Просмотреть файл

@ -157,7 +157,7 @@ JSRuntime::JSRuntime(JSRuntime* parentRuntime)
allowContentJS_(true), allowContentJS_(true),
atoms_(nullptr), atoms_(nullptr),
atomsAddedWhileSweeping_(nullptr), atomsAddedWhileSweeping_(nullptr),
atomsCompartment_(nullptr), atomsRealm_(nullptr),
staticStrings(nullptr), staticStrings(nullptr),
commonNames(nullptr), commonNames(nullptr),
permanentAtoms(nullptr), permanentAtoms(nullptr),
@ -222,19 +222,19 @@ JSRuntime::init(JSContext* cx, uint32_t maxbytes, uint32_t maxNurseryBytes)
return false; return false;
JS::RealmOptions options; JS::RealmOptions options;
ScopedJSDeletePtr<Realm> atomsCompartment(js_new<Realm>(atomsZone.get(), options)); ScopedJSDeletePtr<Realm> atomsRealm(js_new<Realm>(atomsZone.get(), options));
if (!atomsCompartment || !atomsCompartment->init(nullptr)) if (!atomsRealm || !atomsRealm->init(nullptr))
return false; return false;
gc.atomsZone = atomsZone.get(); gc.atomsZone = atomsZone.get();
if (!atomsZone->compartments().append(atomsCompartment.get())) if (!atomsZone->compartments().append(atomsRealm.get()))
return false; return false;
atomsCompartment->setIsSystem(true); atomsRealm->setIsSystem(true);
atomsCompartment->setIsAtomsCompartment(); atomsRealm->setIsAtomsRealm();
atomsZone.forget(); atomsZone.forget();
this->atomsCompartment_ = atomsCompartment.forget(); this->atomsRealm_ = atomsRealm.forget();
if (!symbolRegistry_.ref().init()) if (!symbolRegistry_.ref().init())
return false; return false;
@ -331,7 +331,7 @@ JSRuntime::destroyRuntime()
#endif #endif
gc.finish(); gc.finish();
atomsCompartment_ = nullptr; atomsRealm_ = nullptr;
js_delete(defaultFreeOp_.ref()); js_delete(defaultFreeOp_.ref());
@ -435,7 +435,7 @@ static bool
HandleInterrupt(JSContext* cx, bool invokeCallback) HandleInterrupt(JSContext* cx, bool invokeCallback)
{ {
MOZ_ASSERT(cx->requestDepth >= 1); MOZ_ASSERT(cx->requestDepth >= 1);
MOZ_ASSERT(!cx->compartment()->isAtomsCompartment()); MOZ_ASSERT(!cx->realm()->isAtomsRealm());
cx->runtime()->gc.gcIfRequested(); cx->runtime()->gc.gcIfRequested();
@ -768,7 +768,7 @@ JSRuntime::onOutOfMemoryCanGC(AllocFunction allocFunc, size_t bytes, void* reall
bool bool
JSRuntime::activeGCInAtomsZone() JSRuntime::activeGCInAtomsZone()
{ {
Zone* zone = atomsCompartment_->zone(); Zone* zone = atomsRealm_->zone();
return (zone->needsIncrementalBarrier() && !gc.isVerifyPreBarriersEnabled()) || return (zone->needsIncrementalBarrier() && !gc.isVerifyPreBarriersEnabled()) ||
zone->wasGCStarted(); zone->wasGCStarted();
} }

Просмотреть файл

@ -700,14 +700,14 @@ struct JSRuntime : public js::MallocProvider<JSRuntime>
// Set of all atoms added while the main atoms table is being swept. // Set of all atoms added while the main atoms table is being swept.
js::ExclusiveAccessLockData<js::AtomSet*> atomsAddedWhileSweeping_; js::ExclusiveAccessLockData<js::AtomSet*> atomsAddedWhileSweeping_;
// Compartment and associated zone containing all atoms in the runtime, as // Realm and associated zone containing all atoms in the runtime, as
// well as runtime wide IonCode stubs. Modifying the contents of this // well as runtime wide IonCode stubs. Modifying the contents of this
// compartment requires the calling thread to use AutoLockForExclusiveAccess. // zone requires the calling thread to use AutoLockForExclusiveAccess.
js::WriteOnceData<JSCompartment*> atomsCompartment_; js::WriteOnceData<JS::Realm*> atomsRealm_;
// Set of all live symbols produced by Symbol.for(). All such symbols are // Set of all live symbols produced by Symbol.for(). All such symbols are
// allocated in the atomsCompartment. Reading or writing the symbol // allocated in the atomsZone. Reading or writing the symbol registry
// registry requires the calling thread to use AutoLockForExclusiveAccess. // requires the calling thread to use AutoLockForExclusiveAccess.
js::ExclusiveAccessLockOrGCTaskData<js::SymbolRegistry> symbolRegistry_; js::ExclusiveAccessLockOrGCTaskData<js::SymbolRegistry> symbolRegistry_;
public: public:
@ -735,22 +735,25 @@ struct JSRuntime : public js::MallocProvider<JSRuntime>
return atomsAddedWhileSweeping_; return atomsAddedWhileSweeping_;
} }
JSCompartment* atomsCompartment(js::AutoLockForExclusiveAccess& lock) { JS::Realm* atomsRealm(js::AutoLockForExclusiveAccess& lock) {
return atomsCompartment_; return atomsRealm_;
} }
JSCompartment* unsafeAtomsCompartment() { JS::Realm* unsafeAtomsRealm() {
return atomsCompartment_; return atomsRealm_;
} }
// Note: once JS::Realm and JSCompartment are completely unrelated, the
// atoms realm probably won't have a compartment so we can remove this
// then.
bool isAtomsCompartment(JSCompartment* comp) { bool isAtomsCompartment(JSCompartment* comp) {
return comp == atomsCompartment_; return JS::GetRealmForCompartment(comp) == atomsRealm_;
} }
const JS::Zone* atomsZone(js::AutoLockForExclusiveAccess& lock) const { const JS::Zone* atomsZone(js::AutoLockForExclusiveAccess& lock) const {
return gc.atomsZone; return gc.atomsZone;
} }
// The atoms compartment is the only one in its zone. // The atoms realm is the only one in its zone.
bool isAtomsZone(const JS::Zone* zone) const { bool isAtomsZone(const JS::Zone* zone) const {
return zone == gc.atomsZone; return zone == gc.atomsZone;
} }

Просмотреть файл

@ -1808,7 +1808,8 @@ SavedStacks::getLocation(JSContext* cx, const FrameIter& iter,
void void
SavedStacks::chooseSamplingProbability(JSCompartment* compartment) SavedStacks::chooseSamplingProbability(JSCompartment* compartment)
{ {
GlobalObject* global = compartment->maybeGlobal(); Realm* realm = JS::GetRealmForCompartment(compartment);
GlobalObject* global = realm->maybeGlobal();
if (!global) if (!global)
return; return;

Просмотреть файл

@ -2785,7 +2785,7 @@ GlobalObject*
JSRuntime::createSelfHostingGlobal(JSContext* cx) JSRuntime::createSelfHostingGlobal(JSContext* cx)
{ {
MOZ_ASSERT(!cx->isExceptionPending()); MOZ_ASSERT(!cx->isExceptionPending());
MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(cx->compartment())); MOZ_ASSERT(!cx->realm());
JS::RealmOptions options; JS::RealmOptions options;
options.creationOptions().setNewZone(); options.creationOptions().setNewZone();

Просмотреть файл

@ -2160,8 +2160,8 @@ NewObjectCache::invalidateEntriesForShape(JSContext* cx, HandleShape shape, Hand
} }
EntryIndex entry; EntryIndex entry;
for (CompartmentsInZoneIter comp(shape->zone()); !comp.done(); comp.next()) { for (RealmsInZoneIter realm(shape->zone()); !realm.done(); realm.next()) {
if (GlobalObject* global = comp->unsafeUnbarrieredMaybeGlobal()) { if (GlobalObject* global = realm->unsafeUnbarrieredMaybeGlobal()) {
if (lookupGlobal(clasp, global, kind, &entry)) if (lookupGlobal(clasp, global, kind, &entry))
PodZero(&entries[entry]); PodZero(&entries[entry]);
} }

Просмотреть файл

@ -229,7 +229,7 @@ JSFlatString::new_(JSContext* cx, const CharT* chars, size_t length)
return nullptr; return nullptr;
JSFlatString* str; JSFlatString* str;
if (cx->compartment()->isAtomsCompartment()) if (cx->realm()->isAtomsRealm())
str = js::Allocate<js::NormalAtom, allowGC>(cx); str = js::Allocate<js::NormalAtom, allowGC>(cx);
else else
str = js::Allocate<JSFlatString, allowGC>(cx, js::gc::DefaultHeap); str = js::Allocate<JSFlatString, allowGC>(cx, js::gc::DefaultHeap);
@ -273,7 +273,7 @@ template <js::AllowGC allowGC>
MOZ_ALWAYS_INLINE JSThinInlineString* MOZ_ALWAYS_INLINE JSThinInlineString*
JSThinInlineString::new_(JSContext* cx) JSThinInlineString::new_(JSContext* cx)
{ {
if (cx->compartment()->isAtomsCompartment()) if (cx->realm()->isAtomsRealm())
return (JSThinInlineString*)(js::Allocate<js::NormalAtom, allowGC>(cx)); return (JSThinInlineString*)(js::Allocate<js::NormalAtom, allowGC>(cx));
return js::Allocate<JSThinInlineString, allowGC>(cx, js::gc::DefaultHeap); return js::Allocate<JSThinInlineString, allowGC>(cx, js::gc::DefaultHeap);
@ -283,7 +283,7 @@ template <js::AllowGC allowGC>
MOZ_ALWAYS_INLINE JSFatInlineString* MOZ_ALWAYS_INLINE JSFatInlineString*
JSFatInlineString::new_(JSContext* cx) JSFatInlineString::new_(JSContext* cx)
{ {
if (cx->compartment()->isAtomsCompartment()) if (cx->realm()->isAtomsRealm())
return (JSFatInlineString*)(js::Allocate<js::FatInlineAtom, allowGC>(cx)); return (JSFatInlineString*)(js::Allocate<js::FatInlineAtom, allowGC>(cx));
return js::Allocate<JSFatInlineString, allowGC>(cx, js::gc::DefaultHeap); return js::Allocate<JSFatInlineString, allowGC>(cx, js::gc::DefaultHeap);

Просмотреть файл

@ -22,7 +22,7 @@ Symbol*
Symbol::newInternal(JSContext* cx, JS::SymbolCode code, uint32_t hash, JSAtom* description, Symbol::newInternal(JSContext* cx, JS::SymbolCode code, uint32_t hash, JSAtom* description,
AutoLockForExclusiveAccess& lock) AutoLockForExclusiveAccess& lock)
{ {
MOZ_ASSERT(cx->compartment() == cx->atomsCompartment(lock)); MOZ_ASSERT(cx->realm() == cx->atomsRealm(lock));
// Following js::AtomizeString, we grudgingly forgo last-ditch GC here. // Following js::AtomizeString, we grudgingly forgo last-ditch GC here.
Symbol* p = Allocate<JS::Symbol, NoGC>(cx); Symbol* p = Allocate<JS::Symbol, NoGC>(cx);

Просмотреть файл

@ -3546,10 +3546,10 @@ PreliminaryObjectArray::sweep()
// Object.prototype group. This is done to ensure JSObject::finalize // Object.prototype group. This is done to ensure JSObject::finalize
// sees a NativeObject Class even if we change the current group's // sees a NativeObject Class even if we change the current group's
// Class to one of the unboxed object classes in the meantime. If // Class to one of the unboxed object classes in the meantime. If
// the compartment's global is dead, we don't do anything as the // the realm's global is dead, we don't do anything as the group's
// group's Class is not going to change in that case. // Class is not going to change in that case.
JSObject* obj = *ptr; JSObject* obj = *ptr;
GlobalObject* global = obj->compartment()->unsafeUnbarrieredMaybeGlobal(); GlobalObject* global = obj->realm()->unsafeUnbarrieredMaybeGlobal();
if (global && !obj->isSingleton()) { if (global && !obj->isSingleton()) {
JSObject* objectProto = global->maybeGetPrototype(JSProto_Object); JSObject* objectProto = global->maybeGetPrototype(JSProto_Object);
obj->setGroup(objectProto->groupRaw()); obj->setGroup(objectProto->groupRaw());

Просмотреть файл

@ -33,7 +33,7 @@ CountDeleter::operator()(CountBase* ptr)
JS_PUBLIC_API(bool) JS_PUBLIC_API(bool)
Census::init() { Census::init() {
AutoLockForExclusiveAccess lock(cx); AutoLockForExclusiveAccess lock(cx);
atomsZone = cx->runtime()->atomsCompartment(lock)->zone(); atomsZone = cx->runtime()->atomsRealm(lock)->zone();
return targetZones.init(); return targetZones.init();
} }

Просмотреть файл

@ -1078,7 +1078,7 @@ static void
GetCompartmentName(JSCompartment* c, nsCString& name, int* anonymizeID, GetCompartmentName(JSCompartment* c, nsCString& name, int* anonymizeID,
bool replaceSlashes) bool replaceSlashes)
{ {
if (js::IsAtomsCompartment(c)) { if (js::IsAtomsRealm(JS::GetRealmForCompartment(c))) {
name.AssignLiteral("atoms"); name.AssignLiteral("atoms");
} else if (*anonymizeID && !js::IsSystemCompartment(c)) { } else if (*anonymizeID && !js::IsSystemCompartment(c)) {
name.AppendPrintf("<anonymized-%d>", *anonymizeID); name.AppendPrintf("<anonymized-%d>", *anonymizeID);

Просмотреть файл

@ -193,30 +193,26 @@ include css-grid/reftest.list
# floats/ # floats/
include floats/reftest.list include floats/reftest.list
###################################
# These tests have been moved to reftest_fonts.list
#
# font-face # font-face
#include font-face/reftest.list include font-face/reftest.list
# font features (opentype) # font features (opentype)
#include font-features/reftest.list include font-features/reftest.list
# mobile font size inflation # mobile font size inflation
#include font-inflation/reftest.list include font-inflation/reftest.list
# CSS Font Loading API # CSS Font Loading API
#include font-loading-api/reftest.list include font-loading-api/reftest.list
# font matching # font matching
#include font-matching/reftest.list include font-matching/reftest.list
# font variations # font variations
#include font-variations/reftest.list include font-variations/reftest.list
# forms # forms
#include forms/reftest.list include forms/reftest.list
#######################################
# frameset # frameset
include frameset/reftest.list include frameset/reftest.list
@ -349,30 +345,26 @@ include table-width/reftest.list
include ../tables/reftests/reftest.list include ../tables/reftests/reftest.list
##############################################
# These tests have been moved to reftest_fonts.list
#
# text/ # text/
#include text/reftest.list include text/reftest.list
# text-stroke # text-stroke
#include text-stroke/reftest.list include text-stroke/reftest.list
# text-decoration/ # text-decoration/
#include text-decoration/reftest.list include text-decoration/reftest.list
# text-indent/ # text-indent/
#include text-indent/reftest.list include text-indent/reftest.list
# text-shadow/ # text-shadow/
#include text-shadow/reftest.list include text-shadow/reftest.list
# text-svgglyphs/ # text-svgglyphs/
#include text-svgglyphs/reftest.list include text-svgglyphs/reftest.list
# text-transform/ # text-transform/
#include text-transform/reftest.list include text-transform/reftest.list
##############################################
# theme (osx) # theme (osx)
include ../../toolkit/themes/osx/reftests/reftest.list include ../../toolkit/themes/osx/reftests/reftest.list

Просмотреть файл

@ -1,45 +0,0 @@
# font-face
include font-face/reftest.list
# font features (opentype)
include font-features/reftest.list
# mobile font size inflation
include font-inflation/reftest.list
# CSS Font Loading API
include font-loading-api/reftest.list
# font matching
include font-matching/reftest.list
# font variations
include font-variations/reftest.list
# from svg/reftest.list
include svg/text/reftest.list
# text/
include text/reftest.list
# text-stroke
include text-stroke/reftest.list
# text-decoration/
include text-decoration/reftest.list
# text-indent/
include text-indent/reftest.list
# text-shadow/
include text-shadow/reftest.list
# text-svgglyphs/
include text-svgglyphs/reftest.list
# text-transform/
include text-transform/reftest.list
# css writing mode
skip-if(winWidget&&isDebugBuild&&/^Windows\x20NT\x206\.1/.test(http.oscpu)) include w3c-css/received/reftest_writing_modes.list # Bug 1392106

Просмотреть файл

@ -13,9 +13,8 @@ include filters/reftest.list
# smil / animation tests # smil / animation tests
include smil/reftest.list include smil/reftest.list
# These tests have been moved to reftest_fonts.list
# text tests # text tests
# include text/reftest.list include text/reftest.list
# load only tests # load only tests
include load-only/reftest.list include load-only/reftest.list

Просмотреть файл

@ -71,6 +71,7 @@ support_dirs_mapped = set()
filemap = {} filemap = {}
speclinkmap = {} speclinkmap = {}
propsaddedfor = [] propsaddedfor = []
tests = []
gOptions = None gOptions = None
gArgs = None gArgs = None
gTestfiles = [] gTestfiles = []
@ -208,11 +209,10 @@ def get_document_for(srcname):
document = xml.dom.minidom.parse(srcname) document = xml.dom.minidom.parse(srcname)
return document return document
def add_test_items(srcname, tests): def add_test_items(srcname):
if not (is_html(srcname) or is_xml(srcname)): if not (is_html(srcname) or is_xml(srcname)):
map_file(srcname) map_file(srcname)
return tests return None
document = get_document_for(srcname) document = get_document_for(srcname)
refs = [] refs = []
notrefs = [] notrefs = []
@ -236,10 +236,9 @@ def add_test_items(srcname, tests):
tests.append(["!=", map_file(srcname), map_file(notref)]) tests.append(["!=", map_file(srcname), map_file(notref)])
# Add chained references too # Add chained references too
for ref in refs: for ref in refs:
tests = add_test_items(ref, tests) add_test_items(ref)
for notref in notrefs: for notref in notrefs:
tests = add_test_items(notref, tests) add_test_items(notref)
return tests
AHEM_FONT_PATH = os.path.normpath( AHEM_FONT_PATH = os.path.normpath(
os.path.join(os.path.dirname(__file__), "../fonts/Ahem.ttf")) os.path.join(os.path.dirname(__file__), "../fonts/Ahem.ttf"))
@ -333,9 +332,20 @@ def read_fail_list():
pat = re.compile(fnmatch.translate(items.pop())) pat = re.compile(fnmatch.translate(items.pop()))
gFailList.append((pat, refpat, items)) gFailList.append((pat, refpat, items))
def create_list_file(filename, tests): def main():
global gDestPath, gTestfiles, gTestFlags, gFailList global gDestPath, gLog, gTestfiles, gTestFlags, gFailList
listfile = open(os.path.join(gDestPath, filename), "wb") read_options()
setup_paths()
read_fail_list()
setup_log()
write_log_header()
remove_existing_dirs()
populate_test_files()
for t in gTestfiles:
add_test_items(t)
listfile = open(os.path.join(gDestPath, "reftest.list"), "wb")
listfile.write("# THIS FILE IS AUTOGENERATED BY {0}\n# DO NOT EDIT!\n".format(os.path.basename(__file__))) listfile.write("# THIS FILE IS AUTOGENERATED BY {0}\n# DO NOT EDIT!\n".format(os.path.basename(__file__)))
lastDefaultPreferences = None lastDefaultPreferences = None
for test in tests: for test in tests:
@ -367,30 +377,6 @@ def create_list_file(filename, tests):
listfile.write(" ".join(test) + "\n") listfile.write(" ".join(test) + "\n")
listfile.close() listfile.close()
def main():
global gLog
read_options()
setup_paths()
read_fail_list()
setup_log()
write_log_header()
remove_existing_dirs()
populate_test_files()
tests = []
for t in gTestfiles:
if 'css-writing-modes' in t:
continue
tests = add_test_items(t, tests)
create_list_file("reftest.list", tests)
tests = []
for t in gTestfiles:
if 'css-writing-modes' not in t:
continue
tests = add_test_items(t, tests)
create_list_file("reftest_writing_modes.list", tests)
gLog.close() gLog.close()
if __name__ == '__main__': if __name__ == '__main__':

Просмотреть файл

@ -46,46 +46,46 @@ Importing css-conditional/at-supports-037.html to css-conditional/at-supports-03
Importing css-conditional/at-supports-038.html to css-conditional/at-supports-038.html Importing css-conditional/at-supports-038.html to css-conditional/at-supports-038.html
Importing css-conditional/at-supports-039.html to css-conditional/at-supports-039.html Importing css-conditional/at-supports-039.html to css-conditional/at-supports-039.html
Importing css-multicol/OWNERS to css-multicol/OWNERS Importing css-multicol/OWNERS to css-multicol/OWNERS
Importing css-multicol/support/swatch-green.png to css-multicol/support/swatch-green.png
Importing css-multicol/support/swatch-blue.png to css-multicol/support/swatch-blue.png
Importing css-multicol/support/swatch-pink.png to css-multicol/support/swatch-pink.png
Importing css-multicol/support/60x60-green.png to css-multicol/support/60x60-green.png
Importing css-multicol/support/import-red.css to css-multicol/support/import-red.css
Importing css-multicol/support/pattern-rgr-grg-rgr.png to css-multicol/support/pattern-rgr-grg-rgr.png
Importing css-multicol/support/pattern-grg-rrg-rgg.png to css-multicol/support/pattern-grg-rrg-rgg.png
Importing css-multicol/support/60x60-red.png to css-multicol/support/60x60-red.png
Importing css-multicol/support/swatch-yellow.png to css-multicol/support/swatch-yellow.png
Importing css-multicol/support/test-br.png to css-multicol/support/test-br.png
Importing css-multicol/support/1x1-green.png to css-multicol/support/1x1-green.png Importing css-multicol/support/1x1-green.png to css-multicol/support/1x1-green.png
Importing css-multicol/support/test-tl.png to css-multicol/support/test-tl.png
Importing css-multicol/support/b-green.css to css-multicol/support/b-green.css
Importing css-multicol/support/1x1-navy.png to css-multicol/support/1x1-navy.png
Importing css-multicol/support/pattern-tr.png to css-multicol/support/pattern-tr.png
Importing css-multicol/support/1x1-maroon.png to css-multicol/support/1x1-maroon.png
Importing css-multicol/support/1x1-white.png to css-multicol/support/1x1-white.png
Importing css-multicol/support/swatch-gray.png to css-multicol/support/swatch-gray.png
Importing css-multicol/support/60x60-gg-rr.png to css-multicol/support/60x60-gg-rr.png
Importing css-multicol/support/swatch-white.png to css-multicol/support/swatch-white.png
Importing css-multicol/support/swatch-lime.png to css-multicol/support/swatch-lime.png
Importing css-multicol/support/black20x20.png to css-multicol/support/black20x20.png
Importing css-multicol/support/swatch-navy.png to css-multicol/support/swatch-navy.png
Importing css-multicol/support/cat.png to css-multicol/support/cat.png
Importing css-multicol/support/red20x20.png to css-multicol/support/red20x20.png
Importing css-multicol/support/swatch-purple.png to css-multicol/support/swatch-purple.png
Importing css-multicol/support/square-teal.png to css-multicol/support/square-teal.png
Importing css-multicol/support/1x1-lime.png to css-multicol/support/1x1-lime.png Importing css-multicol/support/1x1-lime.png to css-multicol/support/1x1-lime.png
Importing css-multicol/support/c-red.css to css-multicol/support/c-red.css Importing css-multicol/support/1x1-maroon.png to css-multicol/support/1x1-maroon.png
Importing css-multicol/support/square-white.png to css-multicol/support/square-white.png Importing css-multicol/support/1x1-navy.png to css-multicol/support/1x1-navy.png
Importing css-multicol/support/pattern-grg-rgr-grg.png to css-multicol/support/pattern-grg-rgr-grg.png
Importing css-multicol/support/swatch-orange.png to css-multicol/support/swatch-orange.png
Importing css-multicol/support/test-bl.png to css-multicol/support/test-bl.png
Importing css-multicol/support/import-green.css to css-multicol/support/import-green.css
Importing css-multicol/support/test-outer.png to css-multicol/support/test-outer.png
Importing css-multicol/support/1x1-red.png to css-multicol/support/1x1-red.png Importing css-multicol/support/1x1-red.png to css-multicol/support/1x1-red.png
Importing css-multicol/support/square-purple.png to css-multicol/support/square-purple.png Importing css-multicol/support/1x1-white.png to css-multicol/support/1x1-white.png
Importing css-multicol/support/swatch-red.png to css-multicol/support/swatch-red.png Importing css-multicol/support/60x60-gg-rr.png to css-multicol/support/60x60-gg-rr.png
Importing css-multicol/support/test-tr.png to css-multicol/support/test-tr.png Importing css-multicol/support/60x60-green.png to css-multicol/support/60x60-green.png
Importing css-multicol/support/60x60-red.png to css-multicol/support/60x60-red.png
Importing css-multicol/support/a-green.css to css-multicol/support/a-green.css Importing css-multicol/support/a-green.css to css-multicol/support/a-green.css
Importing css-multicol/support/b-green.css to css-multicol/support/b-green.css
Importing css-multicol/support/black20x20.png to css-multicol/support/black20x20.png
Importing css-multicol/support/c-red.css to css-multicol/support/c-red.css
Importing css-multicol/support/cat.png to css-multicol/support/cat.png
Importing css-multicol/support/import-green.css to css-multicol/support/import-green.css
Importing css-multicol/support/import-red.css to css-multicol/support/import-red.css
Importing css-multicol/support/pattern-grg-rgr-grg.png to css-multicol/support/pattern-grg-rgr-grg.png
Importing css-multicol/support/pattern-grg-rrg-rgg.png to css-multicol/support/pattern-grg-rrg-rgg.png
Importing css-multicol/support/pattern-rgr-grg-rgr.png to css-multicol/support/pattern-rgr-grg-rgr.png
Importing css-multicol/support/pattern-tr.png to css-multicol/support/pattern-tr.png
Importing css-multicol/support/red20x20.png to css-multicol/support/red20x20.png
Importing css-multicol/support/square-purple.png to css-multicol/support/square-purple.png
Importing css-multicol/support/square-teal.png to css-multicol/support/square-teal.png
Importing css-multicol/support/square-white.png to css-multicol/support/square-white.png
Importing css-multicol/support/swatch-blue.png to css-multicol/support/swatch-blue.png
Importing css-multicol/support/swatch-gray.png to css-multicol/support/swatch-gray.png
Importing css-multicol/support/swatch-green.png to css-multicol/support/swatch-green.png
Importing css-multicol/support/swatch-lime.png to css-multicol/support/swatch-lime.png
Importing css-multicol/support/swatch-navy.png to css-multicol/support/swatch-navy.png
Importing css-multicol/support/swatch-orange.png to css-multicol/support/swatch-orange.png
Importing css-multicol/support/swatch-pink.png to css-multicol/support/swatch-pink.png
Importing css-multicol/support/swatch-purple.png to css-multicol/support/swatch-purple.png
Importing css-multicol/support/swatch-red.png to css-multicol/support/swatch-red.png
Importing css-multicol/support/swatch-white.png to css-multicol/support/swatch-white.png
Importing css-multicol/support/swatch-yellow.png to css-multicol/support/swatch-yellow.png
Importing css-multicol/support/test-bl.png to css-multicol/support/test-bl.png
Importing css-multicol/support/test-br.png to css-multicol/support/test-br.png
Importing css-multicol/support/test-outer.png to css-multicol/support/test-outer.png
Importing css-multicol/support/test-tl.png to css-multicol/support/test-tl.png
Importing css-multicol/support/test-tr.png to css-multicol/support/test-tr.png
Importing css-multicol/multicol-basic-001.html to css-multicol/multicol-basic-001.html Importing css-multicol/multicol-basic-001.html to css-multicol/multicol-basic-001.html
Importing css-multicol/reference/multicol-basic-ref.html to css-multicol/reference/multicol-basic-ref.html Importing css-multicol/reference/multicol-basic-ref.html to css-multicol/reference/multicol-basic-ref.html
Importing css-multicol/multicol-basic-002.html to css-multicol/multicol-basic-002.html Importing css-multicol/multicol-basic-002.html to css-multicol/multicol-basic-002.html
@ -314,10 +314,10 @@ Importing css-multicol/multicol-width-small-001-ref.xht to css-multicol/multicol
Importing css-multicol/multicol-zero-height-001.xht to css-multicol/multicol-zero-height-001.xht Importing css-multicol/multicol-zero-height-001.xht to css-multicol/multicol-zero-height-001.xht
Importing css-multicol/multicol-zero-height-001-ref.xht to css-multicol/multicol-zero-height-001-ref.xht Importing css-multicol/multicol-zero-height-001-ref.xht to css-multicol/multicol-zero-height-001-ref.xht
Importing css-namespaces/OWNERS to css-namespaces/OWNERS Importing css-namespaces/OWNERS to css-namespaces/OWNERS
Importing css-namespaces/support/syntax-007.css to css-namespaces/support/syntax-007.css
Importing css-namespaces/support/scope-002b.css to css-namespaces/support/scope-002b.css
Importing css-namespaces/support/fail.css to css-namespaces/support/fail.css Importing css-namespaces/support/fail.css to css-namespaces/support/fail.css
Importing css-namespaces/support/scope-002a.css to css-namespaces/support/scope-002a.css Importing css-namespaces/support/scope-002a.css to css-namespaces/support/scope-002a.css
Importing css-namespaces/support/scope-002b.css to css-namespaces/support/scope-002b.css
Importing css-namespaces/support/syntax-007.css to css-namespaces/support/syntax-007.css
Importing css-namespaces/prefix-001.xml to css-namespaces/prefix-001.xml Importing css-namespaces/prefix-001.xml to css-namespaces/prefix-001.xml
Importing css-namespaces/reftest/ref-lime-1.xml to css-namespaces/reftest/ref-lime-1.xml Importing css-namespaces/reftest/ref-lime-1.xml to css-namespaces/reftest/ref-lime-1.xml
Importing css-namespaces/prefix-002.xml to css-namespaces/prefix-002.xml Importing css-namespaces/prefix-002.xml to css-namespaces/prefix-002.xml
@ -350,52 +350,52 @@ Importing css-namespaces/syntax-013.xml to css-namespaces/syntax-013.xml
Importing css-namespaces/syntax-014.xml to css-namespaces/syntax-014.xml Importing css-namespaces/syntax-014.xml to css-namespaces/syntax-014.xml
Importing css-namespaces/syntax-015.xml to css-namespaces/syntax-015.xml Importing css-namespaces/syntax-015.xml to css-namespaces/syntax-015.xml
Importing css-values/OWNERS to css-values/OWNERS Importing css-values/OWNERS to css-values/OWNERS
Importing css-values/support/swatch-green.png to css-values/support/swatch-green.png
Importing css-values/support/swatch-blue.png to css-values/support/swatch-blue.png
Importing css-values/support/60x60-green.png to css-values/support/60x60-green.png
Importing css-values/support/import-red.css to css-values/support/import-red.css
Importing css-values/support/pattern-rgr-grg-rgr.png to css-values/support/pattern-rgr-grg-rgr.png
Importing css-values/support/pattern-grg-rrg-rgg.png to css-values/support/pattern-grg-rrg-rgg.png
Importing css-values/support/60x60-red.png to css-values/support/60x60-red.png
Importing css-values/support/swatch-yellow.png to css-values/support/swatch-yellow.png
Importing css-values/support/test-br.png to css-values/support/test-br.png
Importing css-values/support/1x1-green.png to css-values/support/1x1-green.png Importing css-values/support/1x1-green.png to css-values/support/1x1-green.png
Importing css-values/support/test-tl.png to css-values/support/test-tl.png Importing css-values/support/1x1-lime.png to css-values/support/1x1-lime.png
Importing css-values/support/ruler-h-50%.png to css-values/support/ruler-h-50%.png
Importing css-values/support/b-green.css to css-values/support/b-green.css
Importing css-values/support/1x1-navy.png to css-values/support/1x1-navy.png
Importing css-values/support/pattern-tr.png to css-values/support/pattern-tr.png
Importing css-values/support/ruler-v-100px.png to css-values/support/ruler-v-100px.png
Importing css-values/support/swatch-teal.png to css-values/support/swatch-teal.png
Importing css-values/support/ruler-v-50px.png to css-values/support/ruler-v-50px.png
Importing css-values/support/1x1-maroon.png to css-values/support/1x1-maroon.png Importing css-values/support/1x1-maroon.png to css-values/support/1x1-maroon.png
Importing css-values/support/ruler-h-50px.png to css-values/support/ruler-h-50px.png Importing css-values/support/1x1-navy.png to css-values/support/1x1-navy.png
Importing css-values/support/1x1-red.png to css-values/support/1x1-red.png
Importing css-values/support/1x1-white.png to css-values/support/1x1-white.png Importing css-values/support/1x1-white.png to css-values/support/1x1-white.png
Importing css-values/support/60x60-gg-rr.png to css-values/support/60x60-gg-rr.png Importing css-values/support/60x60-gg-rr.png to css-values/support/60x60-gg-rr.png
Importing css-values/support/swatch-white.png to css-values/support/swatch-white.png Importing css-values/support/60x60-green.png to css-values/support/60x60-green.png
Importing css-values/support/swatch-lime.png to css-values/support/swatch-lime.png Importing css-values/support/60x60-red.png to css-values/support/60x60-red.png
Importing css-values/support/README to css-values/support/README
Importing css-values/support/vh-support-transform-translate-iframe.html to css-values/support/vh-support-transform-translate-iframe.html
Importing css-values/support/test-inner-half-size.png to css-values/support/test-inner-half-size.png
Importing css-values/support/vh_not_refreshing_on_chrome_iframe.html to css-values/support/vh_not_refreshing_on_chrome_iframe.html
Importing css-values/support/cat.png to css-values/support/cat.png
Importing css-values/support/square-teal.png to css-values/support/square-teal.png
Importing css-values/support/1x1-lime.png to css-values/support/1x1-lime.png
Importing css-values/support/c-red.css to css-values/support/c-red.css
Importing css-values/support/square-white.png to css-values/support/square-white.png
Importing css-values/support/pattern-grg-rgr-grg.png to css-values/support/pattern-grg-rgr-grg.png
Importing css-values/support/swatch-orange.png to css-values/support/swatch-orange.png
Importing css-values/support/test-bl.png to css-values/support/test-bl.png
Importing css-values/support/import-green.css to css-values/support/import-green.css
Importing css-values/support/test-outer.png to css-values/support/test-outer.png
Importing css-values/support/1x1-red.png to css-values/support/1x1-red.png
Importing css-values/support/square-purple.png to css-values/support/square-purple.png
Importing css-values/support/vh-support-transform-origin-iframe.html to css-values/support/vh-support-transform-origin-iframe.html
Importing css-values/support/swatch-red.png to css-values/support/swatch-red.png
Importing css-values/support/test-tr.png to css-values/support/test-tr.png
Importing css-values/support/a-green.css to css-values/support/a-green.css Importing css-values/support/a-green.css to css-values/support/a-green.css
Importing css-values/support/support/swatch-green.png to css-values/support/support/swatch-green.png Importing css-values/support/b-green.css to css-values/support/b-green.css
Importing css-values/support/c-red.css to css-values/support/c-red.css
Importing css-values/support/cat.png to css-values/support/cat.png
Importing css-values/support/import-green.css to css-values/support/import-green.css
Importing css-values/support/import-red.css to css-values/support/import-red.css
Importing css-values/support/pattern-grg-rgr-grg.png to css-values/support/pattern-grg-rgr-grg.png
Importing css-values/support/pattern-grg-rrg-rgg.png to css-values/support/pattern-grg-rrg-rgg.png
Importing css-values/support/pattern-rgr-grg-rgr.png to css-values/support/pattern-rgr-grg-rgr.png
Importing css-values/support/pattern-tr.png to css-values/support/pattern-tr.png
Importing css-values/support/README to css-values/support/README
Importing css-values/support/ruler-h-50%.png to css-values/support/ruler-h-50%.png
Importing css-values/support/ruler-h-50px.png to css-values/support/ruler-h-50px.png
Importing css-values/support/ruler-v-100px.png to css-values/support/ruler-v-100px.png
Importing css-values/support/ruler-v-50px.png to css-values/support/ruler-v-50px.png
Importing css-values/support/square-purple.png to css-values/support/square-purple.png
Importing css-values/support/square-teal.png to css-values/support/square-teal.png
Importing css-values/support/square-white.png to css-values/support/square-white.png
Importing css-values/support/swatch-blue.png to css-values/support/swatch-blue.png
Importing css-values/support/swatch-green.png to css-values/support/swatch-green.png
Importing css-values/support/swatch-lime.png to css-values/support/swatch-lime.png
Importing css-values/support/swatch-orange.png to css-values/support/swatch-orange.png
Importing css-values/support/swatch-red.png to css-values/support/swatch-red.png
Importing css-values/support/swatch-teal.png to css-values/support/swatch-teal.png
Importing css-values/support/swatch-white.png to css-values/support/swatch-white.png
Importing css-values/support/swatch-yellow.png to css-values/support/swatch-yellow.png
Importing css-values/support/test-bl.png to css-values/support/test-bl.png
Importing css-values/support/test-br.png to css-values/support/test-br.png
Importing css-values/support/test-inner-half-size.png to css-values/support/test-inner-half-size.png
Importing css-values/support/test-outer.png to css-values/support/test-outer.png
Importing css-values/support/test-tl.png to css-values/support/test-tl.png
Importing css-values/support/test-tr.png to css-values/support/test-tr.png
Importing css-values/support/vh-support-transform-origin-iframe.html to css-values/support/vh-support-transform-origin-iframe.html
Importing css-values/support/vh-support-transform-translate-iframe.html to css-values/support/vh-support-transform-translate-iframe.html
Importing css-values/support/vh_not_refreshing_on_chrome_iframe.html to css-values/support/vh_not_refreshing_on_chrome_iframe.html
Importing css-values/support/support/README to css-values/support/support/README Importing css-values/support/support/README to css-values/support/support/README
Importing css-values/support/support/swatch-green.png to css-values/support/support/swatch-green.png
Importing css-values/support/support/swatch-red.png to css-values/support/support/swatch-red.png Importing css-values/support/support/swatch-red.png to css-values/support/support/swatch-red.png
Importing css-values/attr-color-invalid-cast.html to css-values/attr-color-invalid-cast.html Importing css-values/attr-color-invalid-cast.html to css-values/attr-color-invalid-cast.html
Importing css-values/reference/200-200-green.html to css-values/reference/200-200-green.html Importing css-values/reference/200-200-green.html to css-values/reference/200-200-green.html
@ -450,150 +450,150 @@ Importing css-values/vh-zero-support.html to css-values/vh-zero-support.html
Importing css-values/vh_not_refreshing_on_chrome.html to css-values/vh_not_refreshing_on_chrome.html Importing css-values/vh_not_refreshing_on_chrome.html to css-values/vh_not_refreshing_on_chrome.html
Importing css-values/reference/vh_not_refreshing_on_chrome-ref.html to css-values/reference/vh_not_refreshing_on_chrome-ref.html Importing css-values/reference/vh_not_refreshing_on_chrome-ref.html to css-values/reference/vh_not_refreshing_on_chrome-ref.html
Importing css-writing-modes/OWNERS to css-writing-modes/OWNERS Importing css-writing-modes/OWNERS to css-writing-modes/OWNERS
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-023.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-023.html
Importing css-writing-modes/support/form-controls-vlr.png to css-writing-modes/support/form-controls-vlr.png
Importing css-writing-modes/support/swatch-green.png to css-writing-modes/support/swatch-green.png
Importing css-writing-modes/support/swatch-blue.png to css-writing-modes/support/swatch-blue.png
Importing css-writing-modes/support/bg-red-upp-left-corn-320x320.png to css-writing-modes/support/bg-red-upp-left-corn-320x320.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-019.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-019.html
Importing css-writing-modes/support/yellow-square-vert-redline-right-59x59.png to css-writing-modes/support/yellow-square-vert-redline-right-59x59.png
Importing css-writing-modes/support/swatch-olive.png to css-writing-modes/support/swatch-olive.png
Importing css-writing-modes/support/pass-cdts-clearance-calculations.png to css-writing-modes/support/pass-cdts-clearance-calculations.png
Importing css-writing-modes/support/swatch-yellow.png to css-writing-modes/support/swatch-yellow.png
Importing css-writing-modes/support/bg-red-upp-rght-corn-320x320.png to css-writing-modes/support/bg-red-upp-rght-corn-320x320.png
Importing css-writing-modes/support/text-orientation-sideways-right-001.png to css-writing-modes/support/text-orientation-sideways-right-001.png
Importing css-writing-modes/support/test-br.png to css-writing-modes/support/test-br.png
Importing css-writing-modes/support/right-side-filled-square-40x160.png to css-writing-modes/support/right-side-filled-square-40x160.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-015.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-015.html
Importing css-writing-modes/support/vertical-form.png to css-writing-modes/support/vertical-form.png
Importing css-writing-modes/support/sileot-webfont.woff to css-writing-modes/support/sileot-webfont.woff
Importing css-writing-modes/support/blue-yellow-206w-165h.png to css-writing-modes/support/blue-yellow-206w-165h.png
Importing css-writing-modes/support/swatch-fuchsia.png to css-writing-modes/support/swatch-fuchsia.png
Importing css-writing-modes/support/block-flow-direction-066-exp-res.png to css-writing-modes/support/block-flow-direction-066-exp-res.png
Importing css-writing-modes/support/pass-cdts-first-page-vrl-002.png to css-writing-modes/support/pass-cdts-first-page-vrl-002.png
Importing css-writing-modes/support/test-tl.png to css-writing-modes/support/test-tl.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-014.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-014.html
Importing css-writing-modes/support/pattern-gg-gr-100x100.png to css-writing-modes/support/pattern-gg-gr-100x100.png
Importing css-writing-modes/support/pass-cdts-horiz-rule.png to css-writing-modes/support/pass-cdts-horiz-rule.png
Importing css-writing-modes/support/left-center-green-200x300.png to css-writing-modes/support/left-center-green-200x300.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-022.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-022.html
Importing css-writing-modes/support/pattern-rg-rg-100x100.png to css-writing-modes/support/pattern-rg-rg-100x100.png
Importing css-writing-modes/support/pattern-gg-rg-100x100.png to css-writing-modes/support/pattern-gg-rg-100x100.png
Importing css-writing-modes/support/text-orientation-mixed-vrl-002.png to css-writing-modes/support/text-orientation-mixed-vrl-002.png
Importing css-writing-modes/support/text-orientation.js to css-writing-modes/support/text-orientation.js
Importing css-writing-modes/support/pattern-rg-gr-100x100.png to css-writing-modes/support/pattern-rg-gr-100x100.png
Importing css-writing-modes/support/yellow-square-59x59.png to css-writing-modes/support/yellow-square-59x59.png
Importing css-writing-modes/support/pass-cdts-abs-pos-non-replaced.png to css-writing-modes/support/pass-cdts-abs-pos-non-replaced.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-018.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-018.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-029.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-029.html
Importing css-writing-modes/support/blue20x20.png to css-writing-modes/support/blue20x20.png
Importing css-writing-modes/support/blue-horiz-line-220x1.png to css-writing-modes/support/blue-horiz-line-220x1.png
Importing css-writing-modes/support/right-top-green-200x300.png to css-writing-modes/support/right-top-green-200x300.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-018.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-018.png
Importing css-writing-modes/support/pattern-rg-rr-100x100.png to css-writing-modes/support/pattern-rg-rr-100x100.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-025.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-025.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-033.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-033.html
Importing css-writing-modes/support/text-orientation-sideways-lr.png to css-writing-modes/support/text-orientation-sideways-lr.png
Importing css-writing-modes/support/pass-cdts-float-contiguous.png to css-writing-modes/support/pass-cdts-float-contiguous.png
Importing css-writing-modes/support/pattern-rg-gg-100x100.png to css-writing-modes/support/pattern-rg-gg-100x100.png
Importing css-writing-modes/support/swatch-teal.png to css-writing-modes/support/swatch-teal.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-009.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-009.html
Importing css-writing-modes/support/pattern-gg-rr-100x100.png to css-writing-modes/support/pattern-gg-rr-100x100.png
Importing css-writing-modes/support/100x100-red.png to css-writing-modes/support/100x100-red.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-032.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-032.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-024.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-024.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-008.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-008.html
Importing css-writing-modes/support/bg-red-low-left-corn-320x320.png to css-writing-modes/support/bg-red-low-left-corn-320x320.png
Importing css-writing-modes/support/text-orientation-010.png to css-writing-modes/support/text-orientation-010.png
Importing css-writing-modes/support/left-top-200x300.png to css-writing-modes/support/left-top-200x300.png
Importing css-writing-modes/support/pass-cdts-first-page-vlr-003.png to css-writing-modes/support/pass-cdts-first-page-vlr-003.png
Importing css-writing-modes/support/yellow-square-vert-redline-left-59x59.png to css-writing-modes/support/yellow-square-vert-redline-left-59x59.png
Importing css-writing-modes/support/pass-cdts-box-offsets-rel-pos.png to css-writing-modes/support/pass-cdts-box-offsets-rel-pos.png
Importing css-writing-modes/support/wm-propagation-body-003-exp-res.png to css-writing-modes/support/wm-propagation-body-003-exp-res.png
Importing css-writing-modes/support/form-controls-slr.png to css-writing-modes/support/form-controls-slr.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-008.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-008.png
Importing css-writing-modes/support/blue-horiz-line-320x1.png to css-writing-modes/support/blue-horiz-line-320x1.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-028.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-028.html
Importing css-writing-modes/support/text-orientation-012.png to css-writing-modes/support/text-orientation-012.png
Importing css-writing-modes/support/embedded-doc-for-background-size-root-vrl-006.html to css-writing-modes/support/embedded-doc-for-background-size-root-vrl-006.html
Importing css-writing-modes/support/bg-red-low-rght-corn-320x320.png to css-writing-modes/support/bg-red-low-rght-corn-320x320.png
Importing css-writing-modes/support/right-bottom-green-200x300.png to css-writing-modes/support/right-bottom-green-200x300.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-007.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-007.html
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-010.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-010.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-004.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-004.png
Importing css-writing-modes/support/page-flow-direction-002p1.png to css-writing-modes/support/page-flow-direction-002p1.png
Importing css-writing-modes/support/blue-vert-line-1x320.png to css-writing-modes/support/blue-vert-line-1x320.png
Importing css-writing-modes/support/opaque-square-40x160.png to css-writing-modes/support/opaque-square-40x160.png
Importing css-writing-modes/support/cat.png to css-writing-modes/support/cat.png
Importing css-writing-modes/support/text-orientation-sideways-left-001.png to css-writing-modes/support/text-orientation-sideways-left-001.png
Importing css-writing-modes/support/block-flow-direction-025-exp-res.png to css-writing-modes/support/block-flow-direction-025-exp-res.png
Importing css-writing-modes/support/page-flow-direction-002p2.png to css-writing-modes/support/page-flow-direction-002p2.png
Importing css-writing-modes/support/pattern-gr-rr-100x100.png to css-writing-modes/support/pattern-gr-rr-100x100.png
Importing css-writing-modes/support/yellow-square-horiz-redline-bottom-59x59.png to css-writing-modes/support/yellow-square-horiz-redline-bottom-59x59.png
Importing css-writing-modes/support/page-flow-direction-002p3.png to css-writing-modes/support/page-flow-direction-002p3.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-031.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-031.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-027.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-027.html
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-012.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-012.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-006.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-006.png
Importing css-writing-modes/support/pattern-gr-gg-100x100.png to css-writing-modes/support/pattern-gr-gg-100x100.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-002.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-002.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-016.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-016.png
Importing css-writing-modes/support/ortho-htb-alongside-vrl-floats-002-exp-res.png to css-writing-modes/support/ortho-htb-alongside-vrl-floats-002-exp-res.png
Importing css-writing-modes/support/blue1x1.png to css-writing-modes/support/blue1x1.png
Importing css-writing-modes/support/left-bottom-green-200x300.png to css-writing-modes/support/left-bottom-green-200x300.png
Importing css-writing-modes/support/embedded-doc-for-background-size-root-vrl-008.html to css-writing-modes/support/embedded-doc-for-background-size-root-vrl-008.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-026.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-026.html
Importing css-writing-modes/support/100x100-lime.png to css-writing-modes/support/100x100-lime.png Importing css-writing-modes/support/100x100-lime.png to css-writing-modes/support/100x100-lime.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-030.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-030.html Importing css-writing-modes/support/100x100-red.png to css-writing-modes/support/100x100-red.png
Importing css-writing-modes/support/left-center-200x300.png to css-writing-modes/support/left-center-200x300.png
Importing css-writing-modes/support/swatch-aqua.png to css-writing-modes/support/swatch-aqua.png
Importing css-writing-modes/support/left-bottom-200x300.png to css-writing-modes/support/left-bottom-200x300.png
Importing css-writing-modes/support/mplus-1p-regular.woff to css-writing-modes/support/mplus-1p-regular.woff
Importing css-writing-modes/support/page-flow-direction-002p4.png to css-writing-modes/support/page-flow-direction-002p4.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-006.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-006.html
Importing css-writing-modes/support/tcu-font.otf to css-writing-modes/support/tcu-font.otf
Importing css-writing-modes/support/embedded-doc-for-background-size-root-vrl-004.html to css-writing-modes/support/embedded-doc-for-background-size-root-vrl-004.html
Importing css-writing-modes/support/yellow-square-vert-redline-center-59x59.png to css-writing-modes/support/yellow-square-vert-redline-center-59x59.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-014.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-014.png
Importing css-writing-modes/support/DejaVuSerif-webfont.woff to css-writing-modes/support/DejaVuSerif-webfont.woff
Importing css-writing-modes/support/bg-red-3col-2row-320x320.png to css-writing-modes/support/bg-red-3col-2row-320x320.png
Importing css-writing-modes/support/text-orientation-upright-001.png to css-writing-modes/support/text-orientation-upright-001.png
Importing css-writing-modes/support/bg-red-2col-2row-320x320.png to css-writing-modes/support/bg-red-2col-2row-320x320.png
Importing css-writing-modes/support/bg-red-4col-3row-320x320.png to css-writing-modes/support/bg-red-4col-3row-320x320.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-021.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-021.html
Importing css-writing-modes/support/swatch-orange.png to css-writing-modes/support/swatch-orange.png
Importing css-writing-modes/support/test-bl.png to css-writing-modes/support/test-bl.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-017.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-017.html
Importing css-writing-modes/support/bg-red-1col-2row-320x320.png to css-writing-modes/support/bg-red-1col-2row-320x320.png Importing css-writing-modes/support/bg-red-1col-2row-320x320.png to css-writing-modes/support/bg-red-1col-2row-320x320.png
Importing css-writing-modes/support/clearance-calculation-vrl-002.png to css-writing-modes/support/clearance-calculation-vrl-002.png
Importing css-writing-modes/support/blue-vert-line-1x220.png to css-writing-modes/support/blue-vert-line-1x220.png
Importing css-writing-modes/support/form-controls-srl.png to css-writing-modes/support/form-controls-srl.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-016.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-016.html
Importing css-writing-modes/support/margin-collapse-2em-space-wm-vert.png to css-writing-modes/support/margin-collapse-2em-space-wm-vert.png
Importing css-writing-modes/support/clearance-calculation-vrl-006.png to css-writing-modes/support/clearance-calculation-vrl-006.png
Importing css-writing-modes/support/test-tr.png to css-writing-modes/support/test-tr.png
Importing css-writing-modes/support/embedded-doc-for-background-size-root-vrl-002.html to css-writing-modes/support/embedded-doc-for-background-size-root-vrl-002.html
Importing css-writing-modes/support/right-center-green-200x300.png to css-writing-modes/support/right-center-green-200x300.png
Importing css-writing-modes/support/bg-red-1col-3row-320x320.png to css-writing-modes/support/bg-red-1col-3row-320x320.png Importing css-writing-modes/support/bg-red-1col-3row-320x320.png to css-writing-modes/support/bg-red-1col-3row-320x320.png
Importing css-writing-modes/support/right-top-200x300.png to css-writing-modes/support/right-top-200x300.png Importing css-writing-modes/support/bg-red-2col-2row-320x320.png to css-writing-modes/support/bg-red-2col-2row-320x320.png
Importing css-writing-modes/support/right-center-200x300.png to css-writing-modes/support/right-center-200x300.png
Importing css-writing-modes/support/bg-red-4col-2row-320x320.png to css-writing-modes/support/bg-red-4col-2row-320x320.png
Importing css-writing-modes/support/bg-red-2col-3row-320x320.png to css-writing-modes/support/bg-red-2col-3row-320x320.png Importing css-writing-modes/support/bg-red-2col-3row-320x320.png to css-writing-modes/support/bg-red-2col-3row-320x320.png
Importing css-writing-modes/support/pattern-gr-rg-100x100.png to css-writing-modes/support/pattern-gr-rg-100x100.png Importing css-writing-modes/support/bg-red-3col-2row-320x320.png to css-writing-modes/support/bg-red-3col-2row-320x320.png
Importing css-writing-modes/support/tcu-font.woff to css-writing-modes/support/tcu-font.woff
Importing css-writing-modes/support/pattern-rr-gr-100x100.png to css-writing-modes/support/pattern-rr-gr-100x100.png
Importing css-writing-modes/support/right-bottom-200x300.png to css-writing-modes/support/right-bottom-200x300.png
Importing css-writing-modes/support/pattern-gr-gr-100x100.png to css-writing-modes/support/pattern-gr-gr-100x100.png
Importing css-writing-modes/support/clearance-calculation-vrl-004.png to css-writing-modes/support/clearance-calculation-vrl-004.png
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-020.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-020.html
Importing css-writing-modes/support/left-side-filled-square-40x160.png to css-writing-modes/support/left-side-filled-square-40x160.png
Importing css-writing-modes/support/bg-red-3col-3row-320x320.png to css-writing-modes/support/bg-red-3col-3row-320x320.png Importing css-writing-modes/support/bg-red-3col-3row-320x320.png to css-writing-modes/support/bg-red-3col-3row-320x320.png
Importing css-writing-modes/support/text-orientation-upright-vrl-002.png to css-writing-modes/support/text-orientation-upright-vrl-002.png Importing css-writing-modes/support/bg-red-4col-2row-320x320.png to css-writing-modes/support/bg-red-4col-2row-320x320.png
Importing css-writing-modes/support/bg-red-4col-3row-320x320.png to css-writing-modes/support/bg-red-4col-3row-320x320.png
Importing css-writing-modes/support/bg-red-low-left-corn-320x320.png to css-writing-modes/support/bg-red-low-left-corn-320x320.png
Importing css-writing-modes/support/bg-red-low-rght-corn-320x320.png to css-writing-modes/support/bg-red-low-rght-corn-320x320.png
Importing css-writing-modes/support/bg-red-upp-left-corn-320x320.png to css-writing-modes/support/bg-red-upp-left-corn-320x320.png
Importing css-writing-modes/support/bg-red-upp-rght-corn-320x320.png to css-writing-modes/support/bg-red-upp-rght-corn-320x320.png
Importing css-writing-modes/support/block-flow-direction-025-exp-res.png to css-writing-modes/support/block-flow-direction-025-exp-res.png
Importing css-writing-modes/support/block-flow-direction-066-exp-res.png to css-writing-modes/support/block-flow-direction-066-exp-res.png
Importing css-writing-modes/support/blue-horiz-line-220x1.png to css-writing-modes/support/blue-horiz-line-220x1.png
Importing css-writing-modes/support/blue-horiz-line-320x1.png to css-writing-modes/support/blue-horiz-line-320x1.png
Importing css-writing-modes/support/blue-vert-line-1x220.png to css-writing-modes/support/blue-vert-line-1x220.png
Importing css-writing-modes/support/blue-vert-line-1x320.png to css-writing-modes/support/blue-vert-line-1x320.png
Importing css-writing-modes/support/blue-yellow-206w-165h.png to css-writing-modes/support/blue-yellow-206w-165h.png
Importing css-writing-modes/support/blue1x1.png to css-writing-modes/support/blue1x1.png
Importing css-writing-modes/support/blue20x20.png to css-writing-modes/support/blue20x20.png
Importing css-writing-modes/support/cat.png to css-writing-modes/support/cat.png
Importing css-writing-modes/support/clearance-calculation-vrl-002.png to css-writing-modes/support/clearance-calculation-vrl-002.png
Importing css-writing-modes/support/clearance-calculation-vrl-004.png to css-writing-modes/support/clearance-calculation-vrl-004.png
Importing css-writing-modes/support/clearance-calculation-vrl-006.png to css-writing-modes/support/clearance-calculation-vrl-006.png
Importing css-writing-modes/support/DejaVuSerif-webfont.woff to css-writing-modes/support/DejaVuSerif-webfont.woff
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-007.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-007.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-009.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-009.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-015.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-015.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-017.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-017.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-019.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-019.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-021.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-021.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-023.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-023.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-025.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-025.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-027.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-027.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-029.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-029.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-031.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-031.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-033.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vlr-033.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-006.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-006.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-008.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-008.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-014.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-014.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-016.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-016.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-018.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-018.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-020.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-020.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-022.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-022.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-024.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-024.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-026.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-026.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-028.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-028.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-030.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-030.html
Importing css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-032.html to css-writing-modes/support/embedded-doc-abs-pos-non-replaced-icb-vrl-032.html
Importing css-writing-modes/support/embedded-doc-for-background-size-root-vrl-002.html to css-writing-modes/support/embedded-doc-for-background-size-root-vrl-002.html
Importing css-writing-modes/support/embedded-doc-for-background-size-root-vrl-004.html to css-writing-modes/support/embedded-doc-for-background-size-root-vrl-004.html
Importing css-writing-modes/support/embedded-doc-for-background-size-root-vrl-006.html to css-writing-modes/support/embedded-doc-for-background-size-root-vrl-006.html
Importing css-writing-modes/support/embedded-doc-for-background-size-root-vrl-008.html to css-writing-modes/support/embedded-doc-for-background-size-root-vrl-008.html
Importing css-writing-modes/support/form-controls-slr.png to css-writing-modes/support/form-controls-slr.png
Importing css-writing-modes/support/form-controls-srl.png to css-writing-modes/support/form-controls-srl.png
Importing css-writing-modes/support/form-controls-vlr.png to css-writing-modes/support/form-controls-vlr.png
Importing css-writing-modes/support/left-bottom-200x300.png to css-writing-modes/support/left-bottom-200x300.png
Importing css-writing-modes/support/left-bottom-green-200x300.png to css-writing-modes/support/left-bottom-green-200x300.png
Importing css-writing-modes/support/left-center-200x300.png to css-writing-modes/support/left-center-200x300.png
Importing css-writing-modes/support/left-center-green-200x300.png to css-writing-modes/support/left-center-green-200x300.png
Importing css-writing-modes/support/left-side-filled-square-40x160.png to css-writing-modes/support/left-side-filled-square-40x160.png
Importing css-writing-modes/support/left-top-200x300.png to css-writing-modes/support/left-top-200x300.png
Importing css-writing-modes/support/margin-collapse-2em-space-wm-vert.png to css-writing-modes/support/margin-collapse-2em-space-wm-vert.png
Importing css-writing-modes/support/mplus-1p-regular.woff to css-writing-modes/support/mplus-1p-regular.woff
Importing css-writing-modes/support/opaque-square-40x160.png to css-writing-modes/support/opaque-square-40x160.png
Importing css-writing-modes/support/ortho-htb-alongside-vrl-floats-002-exp-res.png to css-writing-modes/support/ortho-htb-alongside-vrl-floats-002-exp-res.png
Importing css-writing-modes/support/page-flow-direction-002p1.png to css-writing-modes/support/page-flow-direction-002p1.png
Importing css-writing-modes/support/page-flow-direction-002p2.png to css-writing-modes/support/page-flow-direction-002p2.png
Importing css-writing-modes/support/page-flow-direction-002p3.png to css-writing-modes/support/page-flow-direction-002p3.png
Importing css-writing-modes/support/page-flow-direction-002p4.png to css-writing-modes/support/page-flow-direction-002p4.png
Importing css-writing-modes/support/pass-cdts-abs-pos-non-replaced.png to css-writing-modes/support/pass-cdts-abs-pos-non-replaced.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-002.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-002.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-004.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-004.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-006.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-006.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-008.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-008.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-010.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-010.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-012.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-012.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-014.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-014.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-016.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-016.png
Importing css-writing-modes/support/pass-cdts-bg-pos-vrl-018.png to css-writing-modes/support/pass-cdts-bg-pos-vrl-018.png
Importing css-writing-modes/support/pass-cdts-box-offsets-rel-pos.png to css-writing-modes/support/pass-cdts-box-offsets-rel-pos.png
Importing css-writing-modes/support/pass-cdts-clearance-calculations.png to css-writing-modes/support/pass-cdts-clearance-calculations.png
Importing css-writing-modes/support/pass-cdts-first-page-vlr-003.png to css-writing-modes/support/pass-cdts-first-page-vlr-003.png
Importing css-writing-modes/support/pass-cdts-first-page-vrl-002.png to css-writing-modes/support/pass-cdts-first-page-vrl-002.png
Importing css-writing-modes/support/pass-cdts-float-contiguous.png to css-writing-modes/support/pass-cdts-float-contiguous.png
Importing css-writing-modes/support/pass-cdts-horiz-rule.png to css-writing-modes/support/pass-cdts-horiz-rule.png
Importing css-writing-modes/support/pattern-gg-gr-100x100.png to css-writing-modes/support/pattern-gg-gr-100x100.png
Importing css-writing-modes/support/pattern-gg-rg-100x100.png to css-writing-modes/support/pattern-gg-rg-100x100.png
Importing css-writing-modes/support/pattern-gg-rr-100x100.png to css-writing-modes/support/pattern-gg-rr-100x100.png
Importing css-writing-modes/support/pattern-gr-gg-100x100.png to css-writing-modes/support/pattern-gr-gg-100x100.png
Importing css-writing-modes/support/pattern-gr-gr-100x100.png to css-writing-modes/support/pattern-gr-gr-100x100.png
Importing css-writing-modes/support/pattern-gr-rg-100x100.png to css-writing-modes/support/pattern-gr-rg-100x100.png
Importing css-writing-modes/support/pattern-gr-rr-100x100.png to css-writing-modes/support/pattern-gr-rr-100x100.png
Importing css-writing-modes/support/pattern-rg-gg-100x100.png to css-writing-modes/support/pattern-rg-gg-100x100.png
Importing css-writing-modes/support/pattern-rg-gr-100x100.png to css-writing-modes/support/pattern-rg-gr-100x100.png
Importing css-writing-modes/support/pattern-rg-rg-100x100.png to css-writing-modes/support/pattern-rg-rg-100x100.png
Importing css-writing-modes/support/pattern-rg-rr-100x100.png to css-writing-modes/support/pattern-rg-rr-100x100.png
Importing css-writing-modes/support/pattern-rr-gr-100x100.png to css-writing-modes/support/pattern-rr-gr-100x100.png
Importing css-writing-modes/support/pattern-rr-rg-100x100.png to css-writing-modes/support/pattern-rr-rg-100x100.png Importing css-writing-modes/support/pattern-rr-rg-100x100.png to css-writing-modes/support/pattern-rr-rg-100x100.png
Importing css-writing-modes/support/right-bottom-200x300.png to css-writing-modes/support/right-bottom-200x300.png
Importing css-writing-modes/support/right-bottom-green-200x300.png to css-writing-modes/support/right-bottom-green-200x300.png
Importing css-writing-modes/support/right-center-200x300.png to css-writing-modes/support/right-center-200x300.png
Importing css-writing-modes/support/right-center-green-200x300.png to css-writing-modes/support/right-center-green-200x300.png
Importing css-writing-modes/support/right-side-filled-square-40x160.png to css-writing-modes/support/right-side-filled-square-40x160.png
Importing css-writing-modes/support/right-top-200x300.png to css-writing-modes/support/right-top-200x300.png
Importing css-writing-modes/support/right-top-green-200x300.png to css-writing-modes/support/right-top-green-200x300.png
Importing css-writing-modes/support/sileot-webfont.woff to css-writing-modes/support/sileot-webfont.woff
Importing css-writing-modes/support/swatch-aqua.png to css-writing-modes/support/swatch-aqua.png
Importing css-writing-modes/support/swatch-blue.png to css-writing-modes/support/swatch-blue.png
Importing css-writing-modes/support/swatch-fuchsia.png to css-writing-modes/support/swatch-fuchsia.png
Importing css-writing-modes/support/swatch-green.png to css-writing-modes/support/swatch-green.png
Importing css-writing-modes/support/swatch-olive.png to css-writing-modes/support/swatch-olive.png
Importing css-writing-modes/support/swatch-orange.png to css-writing-modes/support/swatch-orange.png
Importing css-writing-modes/support/swatch-teal.png to css-writing-modes/support/swatch-teal.png
Importing css-writing-modes/support/swatch-yellow.png to css-writing-modes/support/swatch-yellow.png
Importing css-writing-modes/support/tcu-font.otf to css-writing-modes/support/tcu-font.otf
Importing css-writing-modes/support/tcu-font.woff to css-writing-modes/support/tcu-font.woff
Importing css-writing-modes/support/test-bl.png to css-writing-modes/support/test-bl.png
Importing css-writing-modes/support/test-br.png to css-writing-modes/support/test-br.png
Importing css-writing-modes/support/test-tl.png to css-writing-modes/support/test-tl.png
Importing css-writing-modes/support/test-tr.png to css-writing-modes/support/test-tr.png
Importing css-writing-modes/support/text-orientation-010.png to css-writing-modes/support/text-orientation-010.png
Importing css-writing-modes/support/text-orientation-012.png to css-writing-modes/support/text-orientation-012.png
Importing css-writing-modes/support/text-orientation-mixed-vrl-002.png to css-writing-modes/support/text-orientation-mixed-vrl-002.png
Importing css-writing-modes/support/text-orientation-sideways-left-001.png to css-writing-modes/support/text-orientation-sideways-left-001.png
Importing css-writing-modes/support/text-orientation-sideways-lr.png to css-writing-modes/support/text-orientation-sideways-lr.png
Importing css-writing-modes/support/text-orientation-sideways-right-001.png to css-writing-modes/support/text-orientation-sideways-right-001.png
Importing css-writing-modes/support/text-orientation-upright-001.png to css-writing-modes/support/text-orientation-upright-001.png
Importing css-writing-modes/support/text-orientation-upright-vrl-002.png to css-writing-modes/support/text-orientation-upright-vrl-002.png
Importing css-writing-modes/support/text-orientation.js to css-writing-modes/support/text-orientation.js
Importing css-writing-modes/support/vertical-form.png to css-writing-modes/support/vertical-form.png
Importing css-writing-modes/support/wm-propagation-body-003-exp-res.png to css-writing-modes/support/wm-propagation-body-003-exp-res.png
Importing css-writing-modes/support/yellow-square-59x59.png to css-writing-modes/support/yellow-square-59x59.png
Importing css-writing-modes/support/yellow-square-horiz-redline-bottom-59x59.png to css-writing-modes/support/yellow-square-horiz-redline-bottom-59x59.png
Importing css-writing-modes/support/yellow-square-vert-redline-center-59x59.png to css-writing-modes/support/yellow-square-vert-redline-center-59x59.png
Importing css-writing-modes/support/yellow-square-vert-redline-left-59x59.png to css-writing-modes/support/yellow-square-vert-redline-left-59x59.png
Importing css-writing-modes/support/yellow-square-vert-redline-right-59x59.png to css-writing-modes/support/yellow-square-vert-redline-right-59x59.png
Importing css-writing-modes/support/adobe-fonts/CSSFWOrientationTest.otf to css-writing-modes/support/adobe-fonts/CSSFWOrientationTest.otf
Importing css-writing-modes/support/adobe-fonts/CSSHWOrientationTest.otf to css-writing-modes/support/adobe-fonts/CSSHWOrientationTest.otf
Importing css-writing-modes/support/adobe-fonts/LICENSE to css-writing-modes/support/adobe-fonts/LICENSE Importing css-writing-modes/support/adobe-fonts/LICENSE to css-writing-modes/support/adobe-fonts/LICENSE
Importing css-writing-modes/support/adobe-fonts/README.md to css-writing-modes/support/adobe-fonts/README.md Importing css-writing-modes/support/adobe-fonts/README.md to css-writing-modes/support/adobe-fonts/README.md
Importing css-writing-modes/support/adobe-fonts/CSSHWOrientationTest.otf to css-writing-modes/support/adobe-fonts/CSSHWOrientationTest.otf
Importing css-writing-modes/support/adobe-fonts/CSSFWOrientationTest.otf to css-writing-modes/support/adobe-fonts/CSSFWOrientationTest.otf
Importing css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht to css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht Importing css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht to css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht
Importing css-writing-modes/abs-pos-non-replaced-icb-vlr-005.xht to css-writing-modes/abs-pos-non-replaced-icb-vlr-005.xht Importing css-writing-modes/abs-pos-non-replaced-icb-vlr-005.xht to css-writing-modes/abs-pos-non-replaced-icb-vlr-005.xht
Importing css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht to css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht Importing css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht to css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht

Просмотреть файл

@ -242,6 +242,927 @@ skip == css-values/vh-support-transform-translate.html css-values/reference/all-
== css-values/vh-support.html css-values/reference/all-green.html == css-values/vh-support.html css-values/reference/all-green.html
== css-values/vh-zero-support.html css-values/reference/all-green.html == css-values/vh-zero-support.html css-values/reference/all-green.html
skip == css-values/vh_not_refreshing_on_chrome.html css-values/reference/vh_not_refreshing_on_chrome-ref.html skip == css-values/vh_not_refreshing_on_chrome.html css-values/reference/vh_not_refreshing_on_chrome-ref.html
== css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-005.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-007.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-009.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-011.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-013.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-015.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-017.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-019.xht reference/ref-filled-green-100px-square.xht
skip == css-writing-modes/abs-pos-non-replaced-icb-vlr-021.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-023.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-025.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-027.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-029.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-031.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-033.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-002.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-004.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-006.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-008.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-010.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-012.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-014.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-016.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-018.xht reference/ref-filled-green-100px-square.xht
skip == css-writing-modes/abs-pos-non-replaced-icb-vrl-020.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-022.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-024.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-026.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-028.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-030.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vrl-032.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-003.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-005.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-007.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-009.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-011.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-013.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-015.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-017.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-019.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-021.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-023.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-025.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-027.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-029.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-031.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-033.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-035.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-037.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-039.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-041.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-043.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-045.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-047.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-049.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-051.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-053.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-055.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-057.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-059.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-061.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-063.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-065.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-067.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-069.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-071.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-073.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-075.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-077.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-079.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-081.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-083.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-085.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-087.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-089.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-091.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-093.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-095.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-097.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-103.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-105.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-107.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-109.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-111.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-113.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-115.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-117.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-119.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-121.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-123.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-125.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-127.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-129.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-131.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-133.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-135.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-137.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-139.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-141.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-143.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-145.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-147.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-149.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-151.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-153.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-155.xht css-writing-modes/abs-pos-non-replaced-vlr-155-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-157.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-159.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-161.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-163.xht css-writing-modes/abs-pos-non-replaced-vlr-163-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-165.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-167.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-169.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-171.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-173.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-175.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-177.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-179.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-181.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-183.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-185.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-187.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-189.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-191.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-193.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-195.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-197.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-199.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-201.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-203.xht css-writing-modes/abs-pos-non-replaced-vlr-155-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-205.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-207.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-209.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-211.xht css-writing-modes/abs-pos-non-replaced-vlr-163-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-213.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-215.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-217.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-219.xht css-writing-modes/abs-pos-non-replaced-vlr-155-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-221.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-223.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-225.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-227.xht css-writing-modes/abs-pos-non-replaced-vlr-163-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vlr-229.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-002.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-004.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-006.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-008.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-010.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-012.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-014.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-016.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-018.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-020.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-022.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-024.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-026.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-028.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-030.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-032.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-034.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-036.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-038.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-040.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-042.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-044.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-046.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-048.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-050.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-052.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-054.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-056.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-058.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-060.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-062.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-064.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-066.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-068.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-070.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-072.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-074.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-076.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-078.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-080.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-082.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-084.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-086.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-088.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-090.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-092.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-094.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-096.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-102.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-104.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-106.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-108.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-110.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-112.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-114.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-116.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-118.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-120.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-122.xht css-writing-modes/abs-pos-non-replaced-vrl-122-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-124.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-126.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-128.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-130.xht css-writing-modes/abs-pos-non-replaced-vrl-130-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-132.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-134.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-136.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-138.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-140.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-142.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-144.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-146.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-148.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-150.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-152.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-154.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-156.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-158.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-160.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-162.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-164.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-166.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-168.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-170.xht css-writing-modes/abs-pos-non-replaced-vrl-122-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-172.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-174.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-176.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-178.xht css-writing-modes/abs-pos-non-replaced-vrl-130-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-180.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-182.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-184.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-186.xht css-writing-modes/abs-pos-non-replaced-vrl-122-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-188.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-190.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-192.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-194.xht css-writing-modes/abs-pos-non-replaced-vrl-130-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-196.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-198.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-200.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-202.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-204.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-206.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-208.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-210.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-212.xht css-writing-modes/abs-pos-non-replaced-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-214.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-216.xht css-writing-modes/abs-pos-non-replaced-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-218.xht css-writing-modes/abs-pos-non-replaced-vrl-122-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-220.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-222.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-224.xht css-writing-modes/abs-pos-non-replaced-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-226.xht css-writing-modes/abs-pos-non-replaced-vrl-130-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/abs-pos-non-replaced-vrl-228.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
== css-writing-modes/background-position-vrl-018.xht css-writing-modes/background-position-vrl-018-ref.xht
== css-writing-modes/background-position-vrl-020.xht css-writing-modes/background-position-vrl-018-ref.xht
== css-writing-modes/background-position-vrl-022.xht css-writing-modes/background-position-vrl-018-ref.xht
== css-writing-modes/background-size-document-root-vrl-002.html css-writing-modes/background-size-document-root-vrl-002-ref.xht
== css-writing-modes/background-size-document-root-vrl-004.html css-writing-modes/background-size-document-root-vrl-002-ref.xht
== css-writing-modes/background-size-document-root-vrl-006.html css-writing-modes/background-size-document-root-vrl-002-ref.xht
== css-writing-modes/background-size-document-root-vrl-008.html css-writing-modes/background-size-document-root-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,114,600) == css-writing-modes/baseline-inline-non-replaced-002.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,114,600) == css-writing-modes/baseline-inline-non-replaced-003.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,114,600) == css-writing-modes/baseline-inline-non-replaced-004.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,114,600) == css-writing-modes/baseline-inline-non-replaced-005.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/baseline-inline-replaced-002.xht css-writing-modes/baseline-inline-replaced-002-ref.xht
== css-writing-modes/baseline-inline-replaced-003.xht css-writing-modes/baseline-inline-replaced-002-ref.xht
== css-writing-modes/bidi-embed-001.html css-writing-modes/reference/bidi-embed-001.html
== css-writing-modes/bidi-embed-002.html css-writing-modes/reference/bidi-embed-002.html
== css-writing-modes/bidi-embed-003.html css-writing-modes/reference/bidi-embed-003.html
== css-writing-modes/bidi-embed-004.html css-writing-modes/reference/bidi-embed-004.html
== css-writing-modes/bidi-embed-005.html css-writing-modes/reference/bidi-embed-005.html
== css-writing-modes/bidi-embed-006.html css-writing-modes/reference/bidi-embed-006.html
== css-writing-modes/bidi-embed-007.html css-writing-modes/reference/bidi-embed-007.html
== css-writing-modes/bidi-embed-008.html css-writing-modes/reference/bidi-embed-008.html
== css-writing-modes/bidi-embed-009.html css-writing-modes/reference/bidi-embed-009.html
== css-writing-modes/bidi-embed-010.html css-writing-modes/reference/bidi-embed-010.html
== css-writing-modes/bidi-embed-011.html css-writing-modes/reference/bidi-embed-011.html
== css-writing-modes/bidi-isolate-001.html css-writing-modes/reference/bidi-isolate-001.html
== css-writing-modes/bidi-isolate-002.html css-writing-modes/reference/bidi-isolate-002.html
== css-writing-modes/bidi-isolate-003.html css-writing-modes/reference/bidi-isolate-003.html
== css-writing-modes/bidi-isolate-004.html css-writing-modes/reference/bidi-isolate-004.html
== css-writing-modes/bidi-isolate-005.html css-writing-modes/reference/bidi-isolate-005.html
== css-writing-modes/bidi-isolate-006.html css-writing-modes/reference/bidi-isolate-006.html
== css-writing-modes/bidi-isolate-007.html css-writing-modes/reference/bidi-isolate-007.html
== css-writing-modes/bidi-isolate-008.html css-writing-modes/reference/bidi-isolate-008.html
== css-writing-modes/bidi-isolate-009.html css-writing-modes/reference/bidi-isolate-009.html
== css-writing-modes/bidi-isolate-010.html css-writing-modes/reference/bidi-isolate-010.html
== css-writing-modes/bidi-isolate-011.html css-writing-modes/reference/bidi-embed-011.html
== css-writing-modes/bidi-isolate-override-001.html css-writing-modes/reference/bidi-isolate-override-001.html
== css-writing-modes/bidi-isolate-override-002.html css-writing-modes/reference/bidi-isolate-override-002.html
== css-writing-modes/bidi-isolate-override-003.html css-writing-modes/reference/bidi-isolate-override-003.html
== css-writing-modes/bidi-isolate-override-004.html css-writing-modes/reference/bidi-isolate-override-004.html
== css-writing-modes/bidi-isolate-override-005.html css-writing-modes/reference/bidi-isolate-override-005.html
== css-writing-modes/bidi-isolate-override-006.html css-writing-modes/reference/bidi-isolate-override-006.html
== css-writing-modes/bidi-isolate-override-007.html css-writing-modes/reference/bidi-isolate-override-007.html
== css-writing-modes/bidi-isolate-override-008.html css-writing-modes/reference/bidi-isolate-override-008.html
== css-writing-modes/bidi-isolate-override-009.html css-writing-modes/reference/bidi-isolate-override-009.html
== css-writing-modes/bidi-isolate-override-010.html css-writing-modes/reference/bidi-isolate-override-010.html
== css-writing-modes/bidi-isolate-override-011.html css-writing-modes/reference/bidi-isolate-override-011.html
== css-writing-modes/bidi-isolate-override-012.html css-writing-modes/reference/bidi-isolate-override-012.html
== css-writing-modes/bidi-normal-001.html css-writing-modes/reference/bidi-normal-001.html
== css-writing-modes/bidi-normal-002.html css-writing-modes/reference/bidi-normal-002.html
== css-writing-modes/bidi-normal-003.html css-writing-modes/reference/bidi-normal-003.html
== css-writing-modes/bidi-normal-004.html css-writing-modes/reference/bidi-normal-004.html
== css-writing-modes/bidi-normal-005.html css-writing-modes/reference/bidi-normal-005.html
== css-writing-modes/bidi-normal-006.html css-writing-modes/reference/bidi-normal-006.html
== css-writing-modes/bidi-normal-007.html css-writing-modes/reference/bidi-normal-007.html
== css-writing-modes/bidi-normal-008.html css-writing-modes/reference/bidi-normal-008.html
== css-writing-modes/bidi-normal-009.html css-writing-modes/reference/bidi-normal-009.html
== css-writing-modes/bidi-normal-010.html css-writing-modes/reference/bidi-normal-010.html
== css-writing-modes/bidi-normal-011.html css-writing-modes/reference/bidi-normal-011.html
== css-writing-modes/bidi-override-001.html css-writing-modes/reference/bidi-override-001.html
== css-writing-modes/bidi-override-002.html css-writing-modes/reference/bidi-override-002.html
== css-writing-modes/bidi-override-003.html css-writing-modes/reference/bidi-override-003.html
== css-writing-modes/bidi-override-004.html css-writing-modes/reference/bidi-override-004.html
== css-writing-modes/bidi-override-005.html css-writing-modes/reference/bidi-override-005.html
== css-writing-modes/bidi-override-006.html css-writing-modes/reference/bidi-override-006.html
== css-writing-modes/bidi-override-007.html css-writing-modes/reference/bidi-override-007.html
== css-writing-modes/bidi-override-008.html css-writing-modes/reference/bidi-override-008.html
== css-writing-modes/bidi-override-009.html css-writing-modes/reference/bidi-override-009.html
== css-writing-modes/bidi-override-010.html css-writing-modes/reference/bidi-override-010.html
== css-writing-modes/bidi-override-011.html css-writing-modes/reference/bidi-override-011.html
== css-writing-modes/bidi-override-012.html css-writing-modes/reference/bidi-override-012.html
== css-writing-modes/bidi-plaintext-001.html css-writing-modes/reference/bidi-plaintext-001.html
== css-writing-modes/bidi-plaintext-002.html css-writing-modes/reference/bidi-plaintext-002.html
== css-writing-modes/bidi-plaintext-003.html css-writing-modes/reference/bidi-plaintext-003.html
== css-writing-modes/bidi-plaintext-004.html css-writing-modes/reference/bidi-plaintext-004.html
== css-writing-modes/bidi-plaintext-005.html css-writing-modes/reference/bidi-plaintext-005.html
== css-writing-modes/bidi-plaintext-006.html css-writing-modes/reference/bidi-plaintext-006.html
== css-writing-modes/bidi-plaintext-007.html css-writing-modes/reference/bidi-plaintext-007.html
== css-writing-modes/bidi-plaintext-008.html css-writing-modes/reference/bidi-plaintext-008.html
== css-writing-modes/bidi-plaintext-009.html css-writing-modes/reference/bidi-plaintext-009.html
== css-writing-modes/bidi-plaintext-010.html css-writing-modes/reference/bidi-plaintext-010.html
== css-writing-modes/bidi-plaintext-011.html css-writing-modes/reference/bidi-plaintext-011.html
skip == css-writing-modes/bidi-table-001.html css-writing-modes/reference/bidi-table-001.html
== css-writing-modes/bidi-unset-001.html css-writing-modes/reference/bidi-normal-001.html
== css-writing-modes/bidi-unset-002.html css-writing-modes/reference/bidi-normal-002.html
== css-writing-modes/bidi-unset-003.html css-writing-modes/reference/bidi-normal-003.html
== css-writing-modes/bidi-unset-004.html css-writing-modes/reference/bidi-normal-004.html
== css-writing-modes/bidi-unset-005.html css-writing-modes/reference/bidi-normal-005.html
== css-writing-modes/bidi-unset-006.html css-writing-modes/reference/bidi-normal-006.html
== css-writing-modes/bidi-unset-007.html css-writing-modes/reference/bidi-normal-007.html
== css-writing-modes/bidi-unset-008.html css-writing-modes/reference/bidi-normal-008.html
== css-writing-modes/bidi-unset-009.html css-writing-modes/reference/bidi-normal-009.html
== css-writing-modes/bidi-unset-010.html css-writing-modes/reference/bidi-normal-010.html
== css-writing-modes/block-embed-001.html css-writing-modes/reference/block-embed-001.html
== css-writing-modes/block-embed-002.html css-writing-modes/reference/block-embed-002.html
== css-writing-modes/block-embed-003.html css-writing-modes/reference/block-embed-003.html
== css-writing-modes/block-flow-direction-004.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-htb-001.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-043.xht css-writing-modes/block-flow-direction-043-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-047.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-048.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-050.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-054.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-055.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-056.xht css-writing-modes/block-flow-direction-001-ref.xht
fails == css-writing-modes/block-flow-direction-slr-058.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-060.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-062.xht css-writing-modes/block-flow-direction-043-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-063.xht css-writing-modes/block-flow-direction-043-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-slr-066.xht css-writing-modes/block-flow-direction-066-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-042.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-045.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-046.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-049.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-051.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-052.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-053.xht css-writing-modes/block-flow-direction-001-ref.xht
fails == css-writing-modes/block-flow-direction-srl-057.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-059.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-061.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-064.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-srl-065.xht css-writing-modes/block-flow-direction-025-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-003.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-007.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-008.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-010.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-014.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-015.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-016.xht css-writing-modes/block-flow-direction-001-ref.xht
fails == css-writing-modes/block-flow-direction-vlr-018.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-020.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-022.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vlr-023.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-002.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-005.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-006.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-009.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-011.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-012.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-013.xht css-writing-modes/block-flow-direction-001-ref.xht
fails == css-writing-modes/block-flow-direction-vrl-017.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-019.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-021.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-024.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-025.xht css-writing-modes/block-flow-direction-025-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/block-flow-direction-vrl-026.xht css-writing-modes/block-flow-direction-vrl-026-ref.xht
== css-writing-modes/block-override-001.html css-writing-modes/reference/block-override-001.html
== css-writing-modes/block-override-002.html css-writing-modes/reference/block-override-002.html
== css-writing-modes/block-override-003.html css-writing-modes/reference/block-override-003.html
== css-writing-modes/block-override-004.html css-writing-modes/reference/block-override-004.html
== css-writing-modes/block-override-isolate-001.html css-writing-modes/reference/block-override-isolate-001.html
== css-writing-modes/block-override-isolate-002.html css-writing-modes/reference/block-override-isolate-002.html
== css-writing-modes/block-override-isolate-003.html css-writing-modes/reference/block-override-isolate-003.html
== css-writing-modes/block-override-isolate-004.html css-writing-modes/reference/block-override-isolate-004.html
== css-writing-modes/block-plaintext-001.html css-writing-modes/reference/block-plaintext-001.html
== css-writing-modes/block-plaintext-002.html css-writing-modes/reference/block-plaintext-002.html
== css-writing-modes/block-plaintext-003.html css-writing-modes/reference/block-plaintext-003.html
== css-writing-modes/block-plaintext-004.html css-writing-modes/reference/block-plaintext-004.html
skip == css-writing-modes/block-plaintext-006.html css-writing-modes/reference/block-plaintext-006.html
== css-writing-modes/border-conflict-element-vlr-003.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vlr-005.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vlr-007.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vlr-009.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vlr-011.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vlr-013.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vrl-002.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vrl-004.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vrl-006.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vrl-008.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vrl-010.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-conflict-element-vrl-012.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/border-spacing-vlr-003.xht css-writing-modes/border-spacing-vrl-002-ref.xht
== css-writing-modes/border-spacing-vlr-005.xht css-writing-modes/border-spacing-vrl-002-ref.xht
== css-writing-modes/border-spacing-vrl-002.xht css-writing-modes/border-spacing-vrl-002-ref.xht
== css-writing-modes/border-spacing-vrl-004.xht css-writing-modes/border-spacing-vrl-002-ref.xht
== css-writing-modes/border-vlr-007.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/border-vrl-006.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/box-offsets-rel-pos-vlr-003.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
fuzzy-if(OSX,255,200) == css-writing-modes/box-offsets-rel-pos-vlr-005.xht css-writing-modes/box-offsets-rel-pos-vlr-005-ref.xht
== css-writing-modes/box-offsets-rel-pos-vrl-002.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
fuzzy-if(OSX,255,200) == css-writing-modes/box-offsets-rel-pos-vrl-004.xht css-writing-modes/box-offsets-rel-pos-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,114,300) == css-writing-modes/caption-side-vlr-003.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,114,300) == css-writing-modes/caption-side-vlr-005.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,114,300) == css-writing-modes/caption-side-vrl-002.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,114,300) == css-writing-modes/caption-side-vrl-004.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/central-baseline-alignment-002.xht css-writing-modes/central-baseline-alignment-002-ref.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/central-baseline-alignment-003.xht css-writing-modes/central-baseline-alignment-002-ref.xht
== css-writing-modes/clearance-calculations-vrl-002.xht css-writing-modes/clearance-calculations-vrl-002-ref.xht
== css-writing-modes/clearance-calculations-vrl-004.xht css-writing-modes/clearance-calculations-vrl-004-ref.xht
== css-writing-modes/clearance-calculations-vrl-006.xht css-writing-modes/clearance-calculations-vrl-006-ref.xht
== css-writing-modes/clearance-calculations-vrl-008.xht css-writing-modes/clearance-calculations-vrl-008-ref.xht
== css-writing-modes/clip-rect-vlr-003.xht css-writing-modes/clip-rect-vrl-002-ref.xht
== css-writing-modes/clip-rect-vlr-005.xht css-writing-modes/clip-rect-vrl-004-ref.xht
== css-writing-modes/clip-rect-vlr-007.xht css-writing-modes/clip-rect-vrl-006-ref.xht
== css-writing-modes/clip-rect-vlr-009.xht css-writing-modes/clip-rect-vrl-008-ref.xht
== css-writing-modes/clip-rect-vlr-011.xht css-writing-modes/clip-rect-vlr-011-ref.xht
== css-writing-modes/clip-rect-vlr-013.xht css-writing-modes/clip-rect-vlr-013-ref.xht
== css-writing-modes/clip-rect-vlr-015.xht css-writing-modes/clip-rect-vlr-015-ref.xht
== css-writing-modes/clip-rect-vlr-017.xht css-writing-modes/clip-rect-vlr-017-ref.xht
== css-writing-modes/clip-rect-vrl-002.xht css-writing-modes/clip-rect-vrl-002-ref.xht
== css-writing-modes/clip-rect-vrl-004.xht css-writing-modes/clip-rect-vrl-004-ref.xht
== css-writing-modes/clip-rect-vrl-006.xht css-writing-modes/clip-rect-vrl-006-ref.xht
== css-writing-modes/clip-rect-vrl-008.xht css-writing-modes/clip-rect-vrl-008-ref.xht
== css-writing-modes/clip-rect-vrl-010.xht css-writing-modes/clip-rect-vrl-010-ref.xht
== css-writing-modes/clip-rect-vrl-012.xht css-writing-modes/clip-rect-vrl-012-ref.xht
== css-writing-modes/clip-rect-vrl-014.xht css-writing-modes/clip-rect-vrl-014-ref.xht
== css-writing-modes/clip-rect-vrl-016.xht css-writing-modes/clip-rect-vrl-016-ref.xht
fails == css-writing-modes/contiguous-floated-table-vlr-003.xht reference/ref-filled-green-100px-square.xht
fails == css-writing-modes/contiguous-floated-table-vlr-005.xht reference/ref-filled-green-100px-square.xht
fails == css-writing-modes/contiguous-floated-table-vlr-007.xht reference/ref-filled-green-100px-square.xht
fails == css-writing-modes/contiguous-floated-table-vlr-009.xht reference/ref-filled-green-100px-square.xht
fails == css-writing-modes/contiguous-floated-table-vrl-002.xht reference/ref-filled-green-100px-square.xht
fails == css-writing-modes/contiguous-floated-table-vrl-004.xht reference/ref-filled-green-100px-square.xht
fails == css-writing-modes/contiguous-floated-table-vrl-006.xht reference/ref-filled-green-100px-square.xht
fails == css-writing-modes/contiguous-floated-table-vrl-008.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(webrender&&cocoaWidget,15-15,3-3) == css-writing-modes/different-block-flow-dir-001.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(webrender&&cocoaWidget,7-7,2-2) == css-writing-modes/different-block-flow-dir-002.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/direction-vlr-003.xht css-writing-modes/direction-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/direction-vlr-005.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/direction-vrl-002.xht css-writing-modes/direction-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/direction-vrl-004.xht css-writing-modes/direction-vrl-004-ref.xht
== css-writing-modes/flexbox_align-items-stretch-writing-modes.html css-writing-modes/flexbox_align-items-stretch-writing-modes-ref.html
== css-writing-modes/float-clear-vlr-003.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-clear-vlr-005.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-clear-vlr-007.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-clear-vlr-009.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-clear-vrl-002.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-clear-vrl-004.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-clear-vrl-006.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-clear-vrl-008.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-contiguous-vlr-003.xht css-writing-modes/inline-replaced-vrl-004-ref.xht
== css-writing-modes/float-contiguous-vlr-005.xht css-writing-modes/inline-replaced-vrl-004-ref.xht
== css-writing-modes/float-contiguous-vlr-007.xht css-writing-modes/float-contiguous-vlr-007-ref.xht
== css-writing-modes/float-contiguous-vlr-009.xht css-writing-modes/float-contiguous-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,135,902) == css-writing-modes/float-contiguous-vlr-011.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,135,902) == css-writing-modes/float-contiguous-vlr-013.xht css-writing-modes/float-contiguous-vrl-012-ref.xht
== css-writing-modes/float-contiguous-vrl-002.xht css-writing-modes/inline-replaced-vrl-004-ref.xht
== css-writing-modes/float-contiguous-vrl-004.xht css-writing-modes/inline-replaced-vrl-004-ref.xht
== css-writing-modes/float-contiguous-vrl-006.xht css-writing-modes/float-contiguous-vrl-006-ref.xht
== css-writing-modes/float-contiguous-vrl-008.xht css-writing-modes/float-contiguous-vrl-008-ref.xht
fuzzy-if(OSX||winWidget,135,902) == css-writing-modes/float-contiguous-vrl-010.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,135,902) == css-writing-modes/float-contiguous-vrl-012.xht css-writing-modes/float-contiguous-vrl-012-ref.xht
fails == css-writing-modes/float-lft-orthog-htb-in-vlr-002.xht css-writing-modes/float-lft-orthog-htb-in-vlr-002-ref.xht
fails == css-writing-modes/float-lft-orthog-htb-in-vrl-002.xht css-writing-modes/float-lft-orthog-htb-in-vrl-002-ref.xht
fails == css-writing-modes/float-lft-orthog-vlr-in-htb-002.xht css-writing-modes/float-lft-orthog-vlr-in-htb-002-ref.xht
fails == css-writing-modes/float-lft-orthog-vrl-in-htb-002.xht css-writing-modes/float-lft-orthog-vrl-in-htb-002-ref.xht
fails == css-writing-modes/float-rgt-orthog-htb-in-vlr-003.xht css-writing-modes/float-rgt-orthog-htb-in-vlr-003-ref.xht
fails == css-writing-modes/float-rgt-orthog-htb-in-vrl-003.xht css-writing-modes/float-rgt-orthog-htb-in-vrl-003-ref.xht
fails == css-writing-modes/float-rgt-orthog-vlr-in-htb-003.xht css-writing-modes/float-rgt-orthog-vlr-in-htb-003-ref.xht
fails == css-writing-modes/float-rgt-orthog-vrl-in-htb-003.xht css-writing-modes/float-rgt-orthog-vrl-in-htb-003-ref.xht
== css-writing-modes/float-shrink-to-fit-vlr-003.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-shrink-to-fit-vlr-005.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-shrink-to-fit-vlr-007.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,109,300) == css-writing-modes/float-shrink-to-fit-vlr-009.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-shrink-to-fit-vrl-002.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-shrink-to-fit-vrl-004.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-shrink-to-fit-vrl-006.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,109,300) == css-writing-modes/float-shrink-to-fit-vrl-008.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/float-shrink-to-fit-vrl-vlr-016.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vlr-003.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vlr-005.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vlr-007.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vlr-009.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vlr-011.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vlr-013.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vrl-002.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vrl-004.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vrl-006.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vrl-008.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vrl-010.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,108,300) == css-writing-modes/float-vrl-012.xht reference/ref-filled-green-100px-square.xht
!= css-writing-modes/full-width-001.html css-writing-modes/reference/full-width-001-horizontal-notref.html
!= css-writing-modes/full-width-001.html css-writing-modes/reference/full-width-001-nofullwidth-notref.html
!= css-writing-modes/full-width-002.html css-writing-modes/reference/full-width-002-notcu-notref.html
!= css-writing-modes/full-width-002.html css-writing-modes/reference/full-width-002-horizontal-notref.html
skip != css-writing-modes/full-width-003.html css-writing-modes/reference/full-width-002-notcu-notref.html
skip != css-writing-modes/full-width-003.html css-writing-modes/reference/full-width-002-horizontal-notref.html
fuzzy-if(OSX||winWidget,62,404) fuzzy-if(webrender&&winWidget,92-92,100-100) fails-if(webrender&&cocoaWidget) == css-writing-modes/height-width-inline-non-replaced-vlr-003.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,62,404) fuzzy-if(webrender&&winWidget,92-92,100-100) fails-if(webrender&&cocoaWidget) == css-writing-modes/height-width-inline-non-replaced-vrl-002.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-008-ref.xht
== css-writing-modes/horizontal-rule-vlr-003.xht css-writing-modes/horizontal-rule-vlr-003-ref.xht
== css-writing-modes/horizontal-rule-vlr-005.xht css-writing-modes/horizontal-rule-vrl-004-ref.xht
== css-writing-modes/horizontal-rule-vrl-002.xht css-writing-modes/horizontal-rule-vrl-002-ref.xht
== css-writing-modes/horizontal-rule-vrl-004.xht css-writing-modes/horizontal-rule-vrl-004-ref.xht
fails == css-writing-modes/inline-block-alignment-002.xht css-writing-modes/inline-block-alignment-002-ref.xht
fails == css-writing-modes/inline-block-alignment-003.xht css-writing-modes/inline-block-alignment-003-ref.xht
fails == css-writing-modes/inline-block-alignment-004.xht css-writing-modes/inline-block-alignment-002-ref.xht
fails == css-writing-modes/inline-block-alignment-005.xht css-writing-modes/inline-block-alignment-003-ref.xht
fuzzy-if(OSX||winWidget,112,960) == css-writing-modes/inline-block-alignment-006.xht css-writing-modes/inline-block-alignment-006-ref.xht
fails == css-writing-modes/inline-block-alignment-007.xht css-writing-modes/inline-block-alignment-006-ref.xht
fuzzy-if(OSX||winWidget,218,621) == css-writing-modes/inline-block-alignment-orthogonal-vlr-003.xht css-writing-modes/inline-block-alignment-orthogonal-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,218,621) == css-writing-modes/inline-block-alignment-orthogonal-vlr-005.xht css-writing-modes/inline-block-alignment-orthogonal-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,218,621) == css-writing-modes/inline-block-alignment-orthogonal-vrl-002.xht css-writing-modes/inline-block-alignment-orthogonal-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,218,621) == css-writing-modes/inline-block-alignment-orthogonal-vrl-004.xht css-writing-modes/inline-block-alignment-orthogonal-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,135,1080) == css-writing-modes/inline-block-alignment-slr-009.xht css-writing-modes/inline-block-alignment-slr-009-ref.xht
fuzzy-if(OSX||winWidget,112,960) == css-writing-modes/inline-block-alignment-srl-008.xht css-writing-modes/inline-block-alignment-006-ref.xht
== css-writing-modes/inline-replaced-vlr-003.xht css-writing-modes/inline-replaced-vrl-002-ref.xht
== css-writing-modes/inline-replaced-vlr-005.xht css-writing-modes/inline-replaced-vrl-004-ref.xht
== css-writing-modes/inline-replaced-vrl-002.xht css-writing-modes/inline-replaced-vrl-002-ref.xht
== css-writing-modes/inline-replaced-vrl-004.xht css-writing-modes/inline-replaced-vrl-004-ref.xht
fails == css-writing-modes/inline-table-alignment-002.xht css-writing-modes/inline-table-alignment-002-ref.xht
fails == css-writing-modes/inline-table-alignment-003.xht css-writing-modes/inline-table-alignment-003-ref.xht
fails == css-writing-modes/inline-table-alignment-004.xht css-writing-modes/inline-table-alignment-002-ref.xht
fails == css-writing-modes/inline-table-alignment-005.xht css-writing-modes/inline-table-alignment-003-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-htb-001.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-slr-043.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-slr-047.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-slr-048.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-slr-050.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-slr-053.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-slr-054.xht css-writing-modes/block-flow-direction-001-ref.xht
random == css-writing-modes/line-box-direction-slr-056.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-slr-058.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-slr-060.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-srl-042.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-srl-045.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-srl-046.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-srl-049.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-srl-051.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-srl-052.xht css-writing-modes/block-flow-direction-001-ref.xht
random == css-writing-modes/line-box-direction-srl-055.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-srl-057.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-srl-059.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vlr-003.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vlr-007.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vlr-008.xht css-writing-modes/block-flow-direction-002-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vlr-010.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vlr-013.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vlr-014.xht css-writing-modes/block-flow-direction-001-ref.xht
random == css-writing-modes/line-box-direction-vlr-016.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vlr-018.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vlr-020.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vrl-002.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vrl-005.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vrl-006.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vrl-009.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vrl-011.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vrl-012.xht css-writing-modes/block-flow-direction-001-ref.xht
random == css-writing-modes/line-box-direction-vrl-015.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vrl-017.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,213,1540) == css-writing-modes/line-box-direction-vrl-019.xht css-writing-modes/block-flow-direction-001-ref.xht
fails == css-writing-modes/line-box-height-vlr-003.xht css-writing-modes/line-box-height-vlr-003-ref.xht
fails == css-writing-modes/line-box-height-vlr-005.xht css-writing-modes/line-box-height-vlr-003-ref.xht
== css-writing-modes/line-box-height-vlr-007.xht css-writing-modes/line-box-height-vlr-007-ref.xht
== css-writing-modes/line-box-height-vlr-009.xht css-writing-modes/line-box-height-vlr-007-ref.xht
fails == css-writing-modes/line-box-height-vlr-011.xht css-writing-modes/line-box-height-vlr-011-ref.xht
fails == css-writing-modes/line-box-height-vlr-013.xht css-writing-modes/line-box-height-vlr-011-ref.xht
fails == css-writing-modes/line-box-height-vlr-021.xht css-writing-modes/line-box-height-vlr-021-ref.xht
fails == css-writing-modes/line-box-height-vlr-023.xht css-writing-modes/line-box-height-vlr-023-ref.xht
fails == css-writing-modes/line-box-height-vrl-002.xht css-writing-modes/line-box-height-vrl-002-ref.xht
fails == css-writing-modes/line-box-height-vrl-004.xht css-writing-modes/line-box-height-vrl-002-ref.xht
== css-writing-modes/line-box-height-vrl-006.xht css-writing-modes/line-box-height-vrl-006-ref.xht
== css-writing-modes/line-box-height-vrl-008.xht css-writing-modes/line-box-height-vrl-006-ref.xht
fails == css-writing-modes/line-box-height-vrl-010.xht css-writing-modes/line-box-height-vrl-010-ref.xht
fails == css-writing-modes/line-box-height-vrl-012.xht css-writing-modes/line-box-height-vrl-010-ref.xht
== css-writing-modes/margin-collapse-vlr-003.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vlr-009.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vlr-011.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vlr-015.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vlr-017.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vlr-025.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vlr-031.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vlr-035.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vlr-037.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vrl-002.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vrl-008.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vrl-010.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vrl-014.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vrl-016.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vrl-024.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vrl-030.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vrl-034.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-collapse-vrl-036.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/margin-vlr-003.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/margin-vrl-002.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/normal-flow-overconstrained-vlr-003.xht css-writing-modes/abs-pos-non-replaced-vlr-007-ref.xht
== css-writing-modes/normal-flow-overconstrained-vlr-005.xht css-writing-modes/abs-pos-non-replaced-vlr-013-ref.xht
== css-writing-modes/normal-flow-overconstrained-vrl-002.xht css-writing-modes/abs-pos-non-replaced-vrl-006-ref.xht
== css-writing-modes/normal-flow-overconstrained-vrl-004.xht css-writing-modes/abs-pos-non-replaced-vrl-012-ref.xht
== css-writing-modes/ortho-htb-alongside-vrl-floats-002.xht css-writing-modes/ortho-htb-alongside-vrl-floats-002-ref.xht
== css-writing-modes/ortho-htb-alongside-vrl-floats-006.xht css-writing-modes/ortho-htb-alongside-vrl-floats-006-ref.xht
== css-writing-modes/ortho-htb-alongside-vrl-floats-010.xht css-writing-modes/ortho-htb-alongside-vrl-floats-010-ref.xht
== css-writing-modes/ortho-htb-alongside-vrl-floats-014.xht css-writing-modes/ortho-htb-alongside-vrl-floats-014-ref.xht
== css-writing-modes/outline-inline-block-vrl-006.html css-writing-modes/reference/outline-inline-block-vrl-006.html
== css-writing-modes/outline-inline-vlr-006.html css-writing-modes/reference/outline-inline-vlr-006.html
== css-writing-modes/outline-inline-vrl-006.html css-writing-modes/reference/outline-inline-vrl-006.html
== css-writing-modes/overconstrained-rel-pos-ltr-left-right-vlr-005.xht css-writing-modes/overconstrained-rel-pos-ltr-left-right-vlr-005-ref.xht
== css-writing-modes/overconstrained-rel-pos-ltr-left-right-vrl-004.xht css-writing-modes/overconstrained-rel-pos-ltr-left-right-vrl-004-ref.xht
== css-writing-modes/overconstrained-rel-pos-ltr-top-bottom-vlr-003.xht css-writing-modes/overconstrained-rel-pos-ltr-top-bottom-vlr-003-ref.xht
== css-writing-modes/overconstrained-rel-pos-ltr-top-bottom-vrl-002.xht css-writing-modes/overconstrained-rel-pos-ltr-top-bottom-vrl-002-ref.xht
== css-writing-modes/overconstrained-rel-pos-rtl-left-right-vlr-009.xht css-writing-modes/overconstrained-rel-pos-rtl-left-right-vlr-009-ref.xht
== css-writing-modes/overconstrained-rel-pos-rtl-left-right-vrl-008.xht css-writing-modes/overconstrained-rel-pos-rtl-left-right-vrl-008-ref.xht
== css-writing-modes/overconstrained-rel-pos-rtl-top-bottom-vlr-007.xht css-writing-modes/overconstrained-rel-pos-rtl-top-bottom-vlr-007-ref.xht
== css-writing-modes/overconstrained-rel-pos-rtl-top-bottom-vrl-006.xht css-writing-modes/overconstrained-rel-pos-rtl-top-bottom-vrl-006-ref.xht
== css-writing-modes/padding-vlr-005.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/padding-vrl-004.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-margin-vlr-003.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-margin-vlr-005.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-margin-vlr-007.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-margin-vrl-002.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-margin-vrl-004.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-margin-vrl-006.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-padding-vlr-003.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-padding-vlr-005.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-padding-vlr-007.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-padding-vrl-002.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-padding-vrl-004.xht css-writing-modes/margin-vrl-002-ref.xht
== css-writing-modes/percent-padding-vrl-006.xht css-writing-modes/margin-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-slr-023.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-slr-029.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-srl-022.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-srl-028.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-vlr-003.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-vlr-005.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-vlr-007.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-vlr-009.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-vrl-002.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-vrl-004.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-vrl-006.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/row-progression-vrl-008.xht css-writing-modes/block-flow-direction-001-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-001.xht css-writing-modes/sizing-orthog-htb-in-vlr-001-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-htb-in-vlr-003.xht css-writing-modes/sizing-orthog-htb-in-vlr-003-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-004.xht css-writing-modes/sizing-orthog-htb-in-vlr-004-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-006.xht css-writing-modes/sizing-orthog-htb-in-vlr-006-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-007.xht css-writing-modes/sizing-orthog-htb-in-vlr-007-ref.xht
fails-if(OSX||winWidget||Android) == css-writing-modes/sizing-orthog-htb-in-vlr-008.xht css-writing-modes/sizing-orthog-htb-in-vlr-008-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-htb-in-vlr-009.xht css-writing-modes/sizing-orthog-htb-in-vlr-003-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-010.xht css-writing-modes/sizing-orthog-htb-in-vlr-010-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-011.xht css-writing-modes/sizing-orthog-htb-in-vlr-011-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-012.xht css-writing-modes/sizing-orthog-htb-in-vlr-006-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-013.xht css-writing-modes/sizing-orthog-htb-in-vlr-013-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-htb-in-vlr-015.xht css-writing-modes/sizing-orthog-htb-in-vlr-015-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-016.xht css-writing-modes/sizing-orthog-htb-in-vlr-016-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-018.xht css-writing-modes/sizing-orthog-htb-in-vlr-018-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-019.xht css-writing-modes/sizing-orthog-htb-in-vlr-019-ref.xht
fails-if(OSX||winWidget||Android) == css-writing-modes/sizing-orthog-htb-in-vlr-020.xht css-writing-modes/sizing-orthog-htb-in-vlr-020-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-htb-in-vlr-021.xht css-writing-modes/sizing-orthog-htb-in-vlr-015-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-022.xht css-writing-modes/sizing-orthog-htb-in-vlr-022-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-023.xht css-writing-modes/sizing-orthog-htb-in-vlr-023-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vlr-024.xht css-writing-modes/sizing-orthog-htb-in-vlr-018-ref.xht
fails == css-writing-modes/sizing-orthog-htb-in-vrl-001.xht css-writing-modes/sizing-orthog-htb-in-vrl-001-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-htb-in-vrl-003.xht css-writing-modes/sizing-orthog-htb-in-vrl-003-ref.xht
fails == css-writing-modes/sizing-orthog-htb-in-vrl-004.xht css-writing-modes/sizing-orthog-htb-in-vlr-004-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-006.xht css-writing-modes/sizing-orthog-htb-in-vrl-006-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-007.xht css-writing-modes/sizing-orthog-htb-in-vrl-007-ref.xht
fails-if(OSX||winWidget||Android) == css-writing-modes/sizing-orthog-htb-in-vrl-008.xht css-writing-modes/sizing-orthog-htb-in-vrl-008-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-htb-in-vrl-009.xht css-writing-modes/sizing-orthog-htb-in-vrl-003-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-010.xht css-writing-modes/sizing-orthog-htb-in-vrl-010-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-011.xht css-writing-modes/sizing-orthog-htb-in-vrl-011-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-012.xht css-writing-modes/sizing-orthog-htb-in-vrl-006-ref.xht
fails == css-writing-modes/sizing-orthog-htb-in-vrl-013.xht css-writing-modes/sizing-orthog-htb-in-vrl-013-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-htb-in-vrl-015.xht css-writing-modes/sizing-orthog-htb-in-vrl-015-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-016.xht css-writing-modes/sizing-orthog-htb-in-vlr-016-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-018.xht css-writing-modes/sizing-orthog-htb-in-vrl-018-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-019.xht css-writing-modes/sizing-orthog-htb-in-vrl-019-ref.xht
fails-if(OSX||winWidget||Android) == css-writing-modes/sizing-orthog-htb-in-vrl-020.xht css-writing-modes/sizing-orthog-htb-in-vrl-020-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-htb-in-vrl-021.xht css-writing-modes/sizing-orthog-htb-in-vrl-015-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-022.xht css-writing-modes/sizing-orthog-htb-in-vrl-022-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-023.xht css-writing-modes/sizing-orthog-htb-in-vrl-023-ref.xht
== css-writing-modes/sizing-orthog-htb-in-vrl-024.xht css-writing-modes/sizing-orthog-htb-in-vrl-018-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vlr-001.xht css-writing-modes/sizing-orthog-prct-htb-in-vlr-001-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vlr-002.xht css-writing-modes/sizing-orthog-prct-htb-in-vlr-002-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vlr-003.xht css-writing-modes/sizing-orthog-prct-htb-in-vlr-003-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vlr-004.xht css-writing-modes/sizing-orthog-prct-htb-in-vlr-004-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vlr-005.xht css-writing-modes/sizing-orthog-prct-htb-in-vlr-005-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vlr-006.xht css-writing-modes/sizing-orthog-prct-htb-in-vlr-006-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vlr-007.xht css-writing-modes/sizing-orthog-prct-htb-in-vlr-007-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vlr-008.xht css-writing-modes/sizing-orthog-prct-htb-in-vlr-008-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vrl-001.xht css-writing-modes/sizing-orthog-prct-htb-in-vrl-001-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vrl-002.xht css-writing-modes/sizing-orthog-prct-htb-in-vrl-002-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vrl-003.xht css-writing-modes/sizing-orthog-prct-htb-in-vrl-003-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vrl-004.xht css-writing-modes/sizing-orthog-prct-htb-in-vrl-004-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vrl-005.xht css-writing-modes/sizing-orthog-prct-htb-in-vrl-005-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vrl-006.xht css-writing-modes/sizing-orthog-prct-htb-in-vrl-006-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vrl-007.xht css-writing-modes/sizing-orthog-prct-htb-in-vrl-007-ref.xht
== css-writing-modes/sizing-orthog-prct-htb-in-vrl-008.xht css-writing-modes/sizing-orthog-prct-htb-in-vrl-008-ref.xht
== css-writing-modes/sizing-orthog-prct-vlr-in-htb-001.xht css-writing-modes/sizing-orthog-prct-vlr-in-htb-001-ref.xht
== css-writing-modes/sizing-orthog-prct-vlr-in-htb-002.xht css-writing-modes/sizing-orthog-prct-vlr-in-htb-002-ref.xht
== css-writing-modes/sizing-orthog-prct-vlr-in-htb-003.xht css-writing-modes/sizing-orthog-prct-vlr-in-htb-003-ref.xht
== css-writing-modes/sizing-orthog-prct-vlr-in-htb-004.xht css-writing-modes/sizing-orthog-prct-vlr-in-htb-004-ref.xht
== css-writing-modes/sizing-orthog-prct-vlr-in-htb-005.xht css-writing-modes/sizing-orthog-prct-vlr-in-htb-005-ref.xht
== css-writing-modes/sizing-orthog-prct-vlr-in-htb-006.xht css-writing-modes/sizing-orthog-prct-vlr-in-htb-006-ref.xht
== css-writing-modes/sizing-orthog-prct-vlr-in-htb-007.xht css-writing-modes/sizing-orthog-prct-vlr-in-htb-007-ref.xht
== css-writing-modes/sizing-orthog-prct-vlr-in-htb-008.xht css-writing-modes/sizing-orthog-prct-vlr-in-htb-008-ref.xht
== css-writing-modes/sizing-orthog-prct-vrl-in-htb-001.xht css-writing-modes/sizing-orthog-prct-vrl-in-htb-001-ref.xht
== css-writing-modes/sizing-orthog-prct-vrl-in-htb-002.xht css-writing-modes/sizing-orthog-prct-vrl-in-htb-002-ref.xht
== css-writing-modes/sizing-orthog-prct-vrl-in-htb-003.xht css-writing-modes/sizing-orthog-prct-vrl-in-htb-003-ref.xht
== css-writing-modes/sizing-orthog-prct-vrl-in-htb-004.xht css-writing-modes/sizing-orthog-prct-vrl-in-htb-004-ref.xht
== css-writing-modes/sizing-orthog-prct-vrl-in-htb-005.xht css-writing-modes/sizing-orthog-prct-vrl-in-htb-005-ref.xht
== css-writing-modes/sizing-orthog-prct-vrl-in-htb-006.xht css-writing-modes/sizing-orthog-prct-vrl-in-htb-006-ref.xht
== css-writing-modes/sizing-orthog-prct-vrl-in-htb-007.xht css-writing-modes/sizing-orthog-prct-vrl-in-htb-007-ref.xht
== css-writing-modes/sizing-orthog-prct-vrl-in-htb-008.xht css-writing-modes/sizing-orthog-prct-vrl-in-htb-008-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-001.xht css-writing-modes/sizing-orthog-vlr-in-htb-001-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-vlr-in-htb-003.xht css-writing-modes/sizing-orthog-vlr-in-htb-003-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-004.xht css-writing-modes/sizing-orthog-vlr-in-htb-004-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-006.xht css-writing-modes/sizing-orthog-vlr-in-htb-006-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-007.xht css-writing-modes/sizing-orthog-vlr-in-htb-007-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-008.xht css-writing-modes/sizing-orthog-vlr-in-htb-008-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-vlr-in-htb-009.xht css-writing-modes/sizing-orthog-vlr-in-htb-009-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-010.xht css-writing-modes/sizing-orthog-vlr-in-htb-010-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-011.xht css-writing-modes/sizing-orthog-vlr-in-htb-011-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-012.xht css-writing-modes/sizing-orthog-vlr-in-htb-012-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-013.xht css-writing-modes/sizing-orthog-vlr-in-htb-013-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-vlr-in-htb-015.xht css-writing-modes/sizing-orthog-vlr-in-htb-015-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-016.xht css-writing-modes/sizing-orthog-vlr-in-htb-016-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-018.xht css-writing-modes/sizing-orthog-vlr-in-htb-018-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-019.xht css-writing-modes/sizing-orthog-vlr-in-htb-019-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-020.xht css-writing-modes/sizing-orthog-vlr-in-htb-020-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-vlr-in-htb-021.xht css-writing-modes/sizing-orthog-vlr-in-htb-015-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-022.xht css-writing-modes/sizing-orthog-vlr-in-htb-022-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-023.xht css-writing-modes/sizing-orthog-vlr-in-htb-023-ref.xht
== css-writing-modes/sizing-orthog-vlr-in-htb-024.xht css-writing-modes/sizing-orthog-vlr-in-htb-018-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-001.xht css-writing-modes/sizing-orthog-vrl-in-htb-001-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-vrl-in-htb-003.xht css-writing-modes/sizing-orthog-vrl-in-htb-003-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-004.xht css-writing-modes/sizing-orthog-vrl-in-htb-004-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-006.xht css-writing-modes/sizing-orthog-vrl-in-htb-006-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-007.xht css-writing-modes/sizing-orthog-vrl-in-htb-007-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-008.xht css-writing-modes/sizing-orthog-vrl-in-htb-008-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-vrl-in-htb-009.xht css-writing-modes/sizing-orthog-vrl-in-htb-009-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-010.xht css-writing-modes/sizing-orthog-vrl-in-htb-010-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-011.xht css-writing-modes/sizing-orthog-vrl-in-htb-011-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-012.xht css-writing-modes/sizing-orthog-vrl-in-htb-012-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-013.xht css-writing-modes/sizing-orthog-vrl-in-htb-013-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-vrl-in-htb-015.xht css-writing-modes/sizing-orthog-vrl-in-htb-015-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-016.xht css-writing-modes/sizing-orthog-vrl-in-htb-016-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-018.xht css-writing-modes/sizing-orthog-vrl-in-htb-018-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-019.xht css-writing-modes/sizing-orthog-vrl-in-htb-019-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-020.xht css-writing-modes/sizing-orthog-vrl-in-htb-020-ref.xht
fails-if(Android) == css-writing-modes/sizing-orthog-vrl-in-htb-021.xht css-writing-modes/sizing-orthog-vrl-in-htb-015-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-022.xht css-writing-modes/sizing-orthog-vrl-in-htb-022-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-023.xht css-writing-modes/sizing-orthog-vrl-in-htb-023-ref.xht
== css-writing-modes/sizing-orthog-vrl-in-htb-024.xht css-writing-modes/sizing-orthog-vrl-in-htb-018-ref.xht
skip == css-writing-modes/table-cell-001.html css-writing-modes/reference/table-cell-001-ref.html
skip == css-writing-modes/table-cell-002.html css-writing-modes/reference/table-cell-002-ref.html
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/table-column-order-002.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/table-column-order-003.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/table-column-order-004.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/table-column-order-005.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(winWidget,110,1200) fuzzy-if(webrender&&cocoaWidget,1-1,2-2) == css-writing-modes/table-column-order-slr-007.xht css-writing-modes/block-flow-direction-001-ref.xht
fuzzy-if(OSX||winWidget,110,1200) == css-writing-modes/table-column-order-srl-006.xht css-writing-modes/block-flow-direction-001-ref.xht
== css-writing-modes/table-progression-slr-001.html css-writing-modes/table-progression-slr-001-ref.html
fails == css-writing-modes/table-progression-slr-002.html css-writing-modes/table-progression-002-ref.html
== css-writing-modes/table-progression-srl-001.html css-writing-modes/table-progression-001-ref.html
fails == css-writing-modes/table-progression-srl-002.html css-writing-modes/table-progression-002-ref.html
== css-writing-modes/table-progression-vlr-001.html css-writing-modes/table-progression-001-ref.html
fails == css-writing-modes/table-progression-vlr-002.html css-writing-modes/table-progression-002-ref.html
fails == css-writing-modes/table-progression-vlr-003.html css-writing-modes/table-progression-001-ref.html
fails == css-writing-modes/table-progression-vlr-004.html css-writing-modes/table-progression-002-ref.html
== css-writing-modes/table-progression-vrl-001.html css-writing-modes/table-progression-001-ref.html
fails == css-writing-modes/table-progression-vrl-002.html css-writing-modes/table-progression-002-ref.html
fails == css-writing-modes/table-progression-vrl-003.html css-writing-modes/table-progression-001-ref.html
fails == css-writing-modes/table-progression-vrl-004.html css-writing-modes/table-progression-002-ref.html
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vlr-003.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vlr-005.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vlr-007.xht reference/ref-filled-green-100px-square.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vlr-009.xht css-writing-modes/text-align-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vlr-011.xht css-writing-modes/text-align-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vlr-013.xht css-writing-modes/text-align-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vlr-015.xht css-writing-modes/direction-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vlr-017.xht css-writing-modes/direction-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vlr-019.xht css-writing-modes/direction-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vrl-002.xht css-writing-modes/direction-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vrl-004.xht css-writing-modes/direction-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vrl-006.xht css-writing-modes/direction-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vrl-008.xht css-writing-modes/text-align-vrl-008-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vrl-010.xht css-writing-modes/text-align-vrl-008-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vrl-012.xht css-writing-modes/text-align-vrl-008-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vrl-014.xht css-writing-modes/direction-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vrl-016.xht css-writing-modes/direction-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,75,404) fuzzy-if(webrender&&!gtkWidget,92-108,300-302) == css-writing-modes/text-align-vrl-018.xht css-writing-modes/direction-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/text-baseline-slr-009.xht css-writing-modes/text-baseline-slr-009-ref.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/text-baseline-srl-008.xht css-writing-modes/text-baseline-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/text-baseline-vlr-003.xht css-writing-modes/text-baseline-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/text-baseline-vlr-005.xht css-writing-modes/text-baseline-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/text-baseline-vlr-007.xht css-writing-modes/text-baseline-vrl-006-ref.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/text-baseline-vrl-002.xht css-writing-modes/text-baseline-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/text-baseline-vrl-004.xht css-writing-modes/text-baseline-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,215,780) == css-writing-modes/text-baseline-vrl-006.xht css-writing-modes/text-baseline-vrl-006-ref.xht
fuzzy-if(OSX,15,16) == css-writing-modes/text-combine-upright-decorations-001.html css-writing-modes/reference/text-combine-upright-decorations-001.html
== css-writing-modes/text-combine-upright-inherit-all-001.html css-writing-modes/reference/text-combine-upright-inherit-all-001.html
== css-writing-modes/text-combine-upright-inherit-all-002.html css-writing-modes/reference/text-combine-upright-inherit-all-002.html
== css-writing-modes/text-combine-upright-layout-rules-001.html css-writing-modes/reference/text-combine-upright-layout-rules-001-ref.html
== css-writing-modes/text-combine-upright-line-breaking-rules-001.html css-writing-modes/text-combine-upright-line-breaking-rules-001-ref.html
fuzzy(255,960) == css-writing-modes/text-combine-upright-value-all-001.html css-writing-modes/reference/text-combine-upright-value-single-character.html
fuzzy(255,960) == css-writing-modes/text-combine-upright-value-all-002.html css-writing-modes/reference/vertical-ahem-1x1-ref.html
fuzzy(255,960) != css-writing-modes/text-combine-upright-value-all-002.html css-writing-modes/reference/horizontal-ahem-1x1-notref.html
fuzzy(255,960) == css-writing-modes/text-combine-upright-value-all-003.html css-writing-modes/reference/vertical-ahem-1x1-ref.html
fuzzy(255,960) != css-writing-modes/text-combine-upright-value-all-003.html css-writing-modes/reference/horizontal-ahem-1x1-notref.html
skip == css-writing-modes/text-combine-upright-value-digits2-001.html css-writing-modes/reference/text-combine-upright-value-single-character.html
skip == css-writing-modes/text-combine-upright-value-digits2-002.html css-writing-modes/reference/vertical-ahem-1x1-ref.html
skip != css-writing-modes/text-combine-upright-value-digits2-002.html css-writing-modes/reference/horizontal-ahem-1x1-notref.html
== css-writing-modes/text-combine-upright-value-digits2-003.html css-writing-modes/reference/vertical-ahem-1x3-ref.html
!= css-writing-modes/text-combine-upright-value-digits2-003.html css-writing-modes/reference/horizontal-ahem-1x3-notref.html
skip == css-writing-modes/text-combine-upright-value-digits3-001.html css-writing-modes/reference/vertical-ahem-1x1-ref.html
skip != css-writing-modes/text-combine-upright-value-digits3-001.html css-writing-modes/reference/horizontal-ahem-1x1-notref.html
skip == css-writing-modes/text-combine-upright-value-digits3-002.html css-writing-modes/reference/vertical-ahem-1x1-ref.html
skip != css-writing-modes/text-combine-upright-value-digits3-002.html css-writing-modes/reference/horizontal-ahem-1x1-notref.html
== css-writing-modes/text-combine-upright-value-digits3-003.html css-writing-modes/reference/vertical-ahem-1x4-ref.html
!= css-writing-modes/text-combine-upright-value-digits3-003.html css-writing-modes/reference/horizontal-ahem-1x4-notref.html
skip == css-writing-modes/text-combine-upright-value-digits4-001.html css-writing-modes/reference/vertical-ahem-1x1-ref.html
skip != css-writing-modes/text-combine-upright-value-digits4-001.html css-writing-modes/reference/horizontal-ahem-1x1-notref.html
skip == css-writing-modes/text-combine-upright-value-digits4-002.html css-writing-modes/reference/vertical-ahem-1x1-ref.html
skip != css-writing-modes/text-combine-upright-value-digits4-002.html css-writing-modes/reference/horizontal-ahem-1x1-notref.html
== css-writing-modes/text-combine-upright-value-digits4-003.html css-writing-modes/reference/vertical-ahem-1x5-ref.html
!= css-writing-modes/text-combine-upright-value-digits4-003.html css-writing-modes/reference/horizontal-ahem-1x5-notref.html
== css-writing-modes/text-combine-upright-value-none-001.html css-writing-modes/reference/vertical-ahem-1x3-ref.html
!= css-writing-modes/text-combine-upright-value-none-001.html css-writing-modes/reference/horizontal-ahem-1x3-notref.html
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vlr-003.xht css-writing-modes/text-indent-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vlr-005.xht css-writing-modes/text-indent-vlr-005-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vlr-007.xht css-writing-modes/text-indent-vlr-003-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vlr-009.xht css-writing-modes/text-indent-vlr-005-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vlr-011.xht css-writing-modes/text-indent-vlr-011-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vlr-013.xht css-writing-modes/text-indent-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vlr-015.xht css-writing-modes/text-indent-vlr-011-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vlr-017.xht css-writing-modes/text-indent-vlr-013-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vrl-002.xht css-writing-modes/text-indent-vrl-002-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vrl-004.xht css-writing-modes/text-indent-vrl-004-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vrl-006.xht css-writing-modes/abs-pos-non-replaced-vlr-009-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vrl-008.xht css-writing-modes/text-indent-vrl-008-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vrl-010.xht css-writing-modes/text-indent-vrl-010-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vrl-012.xht css-writing-modes/text-indent-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vrl-014.xht css-writing-modes/text-indent-vrl-010-ref.xht
fuzzy-if(OSX||winWidget,255,480) == css-writing-modes/text-indent-vrl-016.xht css-writing-modes/text-indent-vrl-012-ref.xht
fuzzy-if(OSX||winWidget,226,960) fails-if(webrender&&cocoaWidget) == css-writing-modes/text-orientation-016.xht css-writing-modes/text-orientation-016-ref.xht
== css-writing-modes/text-orientation-mixed-srl-016.xht css-writing-modes/text-orientation-mixed-srl-016-ref.xht
== css-writing-modes/text-orientation-mixed-vlr-100.html css-writing-modes/text-orientation-mixed-vlr-100-ref.html
== css-writing-modes/text-orientation-mixed-vrl-100.html css-writing-modes/text-orientation-mixed-vrl-100-ref.html
== css-writing-modes/text-orientation-sideways-vlr-100.html css-writing-modes/text-orientation-sideways-vlr-100-ref.html
== css-writing-modes/text-orientation-sideways-vrl-100.html css-writing-modes/text-orientation-sideways-vrl-100-ref.html
== css-writing-modes/text-orientation-upright-srl-018.xht css-writing-modes/text-orientation-mixed-srl-016-ref.xht
== css-writing-modes/text-orientation-upright-vlr-100.html css-writing-modes/text-orientation-upright-vlr-100-ref.html
== css-writing-modes/text-orientation-upright-vrl-100.html css-writing-modes/text-orientation-upright-vrl-100-ref.html
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-002.xht css-writing-modes/vertical-alignment-002-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-003.xht css-writing-modes/vertical-alignment-002-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-004.xht css-writing-modes/vertical-alignment-004-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-005.xht css-writing-modes/vertical-alignment-004-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-006.xht css-writing-modes/vertical-alignment-006-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-007.xht css-writing-modes/vertical-alignment-006-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-008.xht css-writing-modes/vertical-alignment-008-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-009.xht css-writing-modes/vertical-alignment-008-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-slr-029.xht css-writing-modes/vertical-alignment-008-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-slr-031.xht css-writing-modes/vertical-alignment-006-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-slr-033.xht css-writing-modes/vertical-alignment-004-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-slr-035.xht css-writing-modes/vertical-alignment-002-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-slr-041.xht css-writing-modes/vertical-alignment-slr-049-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-srl-028.xht css-writing-modes/vertical-alignment-002-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-srl-030.xht css-writing-modes/vertical-alignment-004-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-srl-032.xht css-writing-modes/vertical-alignment-006-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-srl-034.xht css-writing-modes/vertical-alignment-008-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-srl-040.xht css-writing-modes/vertical-alignment-vrl-026-ref.xht
fails == css-writing-modes/vertical-alignment-vlr-023.xht css-writing-modes/vertical-alignment-vrl-022-ref.xht
fails == css-writing-modes/vertical-alignment-vlr-025.xht css-writing-modes/vertical-alignment-vrl-022-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-vlr-027.xht css-writing-modes/vertical-alignment-vrl-026-ref.xht
fails == css-writing-modes/vertical-alignment-vrl-022.xht css-writing-modes/vertical-alignment-vrl-022-ref.xht
fails == css-writing-modes/vertical-alignment-vrl-024.xht css-writing-modes/vertical-alignment-vrl-022-ref.xht
fuzzy-if(OSX||winWidget,223,720) == css-writing-modes/vertical-alignment-vrl-026.xht css-writing-modes/vertical-alignment-vrl-026-ref.xht
fails == css-writing-modes/wm-propagation-body-006.xht css-writing-modes/block-flow-direction-025-ref.xht
fails == css-writing-modes/wm-propagation-body-008.xht css-writing-modes/block-flow-direction-025-ref.xht
fails == css-writing-modes/wm-propagation-body-010.xht css-writing-modes/wm-propagation-body-003-ref.xht
fails == css-writing-modes/wm-propagation-body-011.xht css-writing-modes/wm-propagation-body-003-ref.xht
fails == css-writing-modes/wm-propagation-body-015.xht css-writing-modes/block-flow-direction-025-ref.xht
== css-writing-modes/writing-mode-horizontal-001l.html css-writing-modes/reference/writing-mode-horizontal-001l-ref.html
== css-writing-modes/writing-mode-horizontal-001r.html css-writing-modes/reference/writing-mode-horizontal-001r-ref.html
fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-lr-002.xht css-writing-modes/reftest/writing-mode-vertical-lr-002-ref.xht
fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-rl-001.xht css-writing-modes/reftest/writing-mode-vertical-rl-001-ref.xht
fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-rl-002.xht css-writing-modes/reftest/writing-mode-vertical-rl-002-ref.xht
fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-rl-003.htm css-writing-modes/writing-mode-vertical-rl-003-ref.htm
skip == selectors/any-link-dynamic-001.html selectors/any-link-dynamic-001-ref.html skip == selectors/any-link-dynamic-001.html selectors/any-link-dynamic-001-ref.html
needs-focus == selectors/focus-within-001.html selectors/focus-within-001-ref.html needs-focus == selectors/focus-within-001.html selectors/focus-within-001-ref.html
needs-focus == selectors/focus-within-002.html selectors/focus-within-001-ref.html needs-focus == selectors/focus-within-002.html selectors/focus-within-001-ref.html

Просмотреть файл

@ -1,5 +1,3 @@
# THIS FILE IS AUTOGENERATED BY import-tests.py
# DO NOT EDIT!
== css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht reference/ref-filled-green-100px-square.xht == css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht reference/ref-filled-green-100px-square.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-005.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht == css-writing-modes/abs-pos-non-replaced-icb-vlr-005.xht css-writing-modes/abs-pos-non-replaced-icb-vrl-004-ref.xht
== css-writing-modes/abs-pos-non-replaced-icb-vlr-007.xht reference/ref-filled-green-100px-square.xht == css-writing-modes/abs-pos-non-replaced-icb-vlr-007.xht reference/ref-filled-green-100px-square.xht
@ -921,3 +919,4 @@ fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-lr-0
fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-rl-001.xht css-writing-modes/reftest/writing-mode-vertical-rl-001-ref.xht fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-rl-001.xht css-writing-modes/reftest/writing-mode-vertical-rl-001-ref.xht
fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-rl-002.xht css-writing-modes/reftest/writing-mode-vertical-rl-002-ref.xht fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-rl-002.xht css-writing-modes/reftest/writing-mode-vertical-rl-002-ref.xht
fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-rl-003.htm css-writing-modes/writing-mode-vertical-rl-003-ref.htm fuzzy-if(OSX||winWidget,153,612) == css-writing-modes/writing-mode-vertical-rl-003.htm css-writing-modes/writing-mode-vertical-rl-003-ref.htm

Просмотреть файл

@ -462,47 +462,55 @@ nsTransitionManager::DoUpdateTransitions(
// Per http://lists.w3.org/Archives/Public/www-style/2009Aug/0109.html // Per http://lists.w3.org/Archives/Public/www-style/2009Aug/0109.html
// I'll consider only the transitions from the number of items in // I'll consider only the transitions from the number of items in
// 'transition-property' on down, and later ones will override earlier // 'transition-property' on down, and later ones will override earlier
// ones (tracked using |whichStarted|). // ones (tracked using |propertiesChecked|).
bool startedAny = false; bool startedAny = false;
nsCSSPropertyIDSet whichStarted; nsCSSPropertyIDSet propertiesChecked;
for (uint32_t i = aDisp.mTransitionPropertyCount; i-- != 0; ) { for (uint32_t i = aDisp.mTransitionPropertyCount; i--; ) {
// Check the combined duration (combination of delay and duration) // We're not going to look at any further transitions, so we can just avoid
// first, since it defaults to zero, which means we can ignore the // looking at this if we know it will not start any transitions.
// transition. if (i == 0 && aDisp.GetTransitionCombinedDuration(i) <= 0.0f) {
if (aDisp.GetTransitionCombinedDuration(i) > 0.0f) { continue;
// We might have something to transition. See if any of the }
// properties in question changed and are animatable.
// FIXME: Would be good to find a way to share code between this nsCSSPropertyID property = aDisp.GetTransitionProperty(i);
// interpretation of transition-property and the one below. if (property == eCSSPropertyExtra_no_properties ||
nsCSSPropertyID property = aDisp.GetTransitionProperty(i); property == eCSSPropertyExtra_variable ||
if (property == eCSSPropertyExtra_no_properties || property == eCSSProperty_UNKNOWN) {
property == eCSSPropertyExtra_variable || // Nothing to do.
property == eCSSProperty_UNKNOWN) { continue;
// Nothing to do, but need to exclude this from cases below. }
} else if (property == eCSSPropertyExtra_all_properties) { // We might have something to transition. See if any of the
for (nsCSSPropertyID p = nsCSSPropertyID(0); // properties in question changed and are animatable.
p < eCSSProperty_COUNT_no_shorthands; // FIXME: Would be good to find a way to share code between this
p = nsCSSPropertyID(p + 1)) { // interpretation of transition-property and the one below.
// FIXME(emilio): This should probably just use the "all" shorthand id, and
// we should probably remove eCSSPropertyExtra_all_properties.
if (property == eCSSPropertyExtra_all_properties) {
for (nsCSSPropertyID p = nsCSSPropertyID(0);
p < eCSSProperty_COUNT_no_shorthands;
p = nsCSSPropertyID(p + 1)) {
startedAny |=
ConsiderInitiatingTransition(p, aDisp, i, aElement, aPseudoType, ConsiderInitiatingTransition(p, aDisp, i, aElement, aPseudoType,
aElementTransitions, aElementTransitions,
aOldStyle, aNewStyle, aOldStyle, aNewStyle,
&startedAny, &whichStarted); propertiesChecked);
} }
} else if (nsCSSProps::IsShorthand(property)) { } else if (nsCSSProps::IsShorthand(property)) {
CSSPROPS_FOR_SHORTHAND_SUBPROPERTIES(subprop, property, CSSPROPS_FOR_SHORTHAND_SUBPROPERTIES(subprop, property,
CSSEnabledState::eForAllContent) CSSEnabledState::eForAllContent)
{ {
startedAny |=
ConsiderInitiatingTransition(*subprop, aDisp, i, aElement, aPseudoType, ConsiderInitiatingTransition(*subprop, aDisp, i, aElement, aPseudoType,
aElementTransitions, aElementTransitions,
aOldStyle, aNewStyle, aOldStyle, aNewStyle,
&startedAny, &whichStarted); propertiesChecked);
} }
} else { } else {
startedAny |=
ConsiderInitiatingTransition(property, aDisp, i, aElement, aPseudoType, ConsiderInitiatingTransition(property, aDisp, i, aElement, aPseudoType,
aElementTransitions, aElementTransitions,
aOldStyle, aNewStyle, aOldStyle, aNewStyle,
&startedAny, &whichStarted); propertiesChecked);
}
} }
} }
@ -631,7 +639,7 @@ IsTransitionable(nsCSSPropertyID aProperty)
return Servo_Property_IsTransitionable(aProperty); return Servo_Property_IsTransitionable(aProperty);
} }
void bool
nsTransitionManager::ConsiderInitiatingTransition( nsTransitionManager::ConsiderInitiatingTransition(
nsCSSPropertyID aProperty, nsCSSPropertyID aProperty,
const nsStyleDisplay& aStyleDisplay, const nsStyleDisplay& aStyleDisplay,
@ -641,8 +649,7 @@ nsTransitionManager::ConsiderInitiatingTransition(
CSSTransitionCollection*& aElementTransitions, CSSTransitionCollection*& aElementTransitions,
const ComputedStyle& aOldStyle, const ComputedStyle& aOldStyle,
const ComputedStyle& aNewStyle, const ComputedStyle& aNewStyle,
bool* aStartedAny, nsCSSPropertyIDSet& aPropertiesChecked)
nsCSSPropertyIDSet* aWhichStarted)
{ {
// IsShorthand itself will assert if aProperty is not a property. // IsShorthand itself will assert if aProperty is not a property.
MOZ_ASSERT(!nsCSSProps::IsShorthand(aProperty), MOZ_ASSERT(!nsCSSProps::IsShorthand(aProperty),
@ -650,23 +657,36 @@ nsTransitionManager::ConsiderInitiatingTransition(
NS_ASSERTION(!aElementTransitions || NS_ASSERTION(!aElementTransitions ||
aElementTransitions->mElement == aElement, "Element mismatch"); aElementTransitions->mElement == aElement, "Element mismatch");
// A later item in transition-property already specified a transition for this
// property, so we ignore this one.
// See http://lists.w3.org/Archives/Public/www-style/2009Aug/0109.html .
if (aPropertiesChecked.HasProperty(aProperty)) {
return false;
}
aPropertiesChecked.AddProperty(aProperty);
// Ignore disabled properties. We can arrive here if the transition-property // Ignore disabled properties. We can arrive here if the transition-property
// is 'all' and the disabled property has a default value which derives value // is 'all' and the disabled property has a default value which derives value
// from another property, e.g. color. // from another property, e.g. color.
if (!nsCSSProps::IsEnabled(aProperty, CSSEnabledState::eForAllContent)) { if (!nsCSSProps::IsEnabled(aProperty, CSSEnabledState::eForAllContent)) {
return; return false;
}
if (aWhichStarted->HasProperty(aProperty)) {
// A later item in transition-property already started a
// transition for this property, so we ignore this one.
// See comment above and
// http://lists.w3.org/Archives/Public/www-style/2009Aug/0109.html .
return;
} }
if (!IsTransitionable(aProperty)) { if (!IsTransitionable(aProperty)) {
return; return false;
}
float delay = aStyleDisplay.GetTransitionDelay(transitionIdx);
// The spec says a negative duration is treated as zero.
float duration =
std::max(aStyleDisplay.GetTransitionDuration(transitionIdx), 0.0f);
// If the combined duration of this transition is 0 or less don't start a
// transition.
if (delay + duration <= 0.0f) {
return false;
} }
dom::DocumentTimeline* timeline = aElement->OwnerDoc()->Timeline(); dom::DocumentTimeline* timeline = aElement->OwnerDoc()->Timeline();
@ -717,7 +737,7 @@ nsTransitionManager::ConsiderInitiatingTransition(
if (haveCurrentTransition && haveValues && if (haveCurrentTransition && haveValues &&
aElementTransitions->mAnimations[currentIndex]->ToValue() == endValue) { aElementTransitions->mAnimations[currentIndex]->ToValue() == endValue) {
// GetAnimationRule already called RestyleForAnimation. // GetAnimationRule already called RestyleForAnimation.
return; return false;
} }
if (!shouldAnimate) { if (!shouldAnimate) {
@ -745,17 +765,11 @@ nsTransitionManager::ConsiderInitiatingTransition(
} }
// GetAnimationRule already called RestyleForAnimation. // GetAnimationRule already called RestyleForAnimation.
} }
return; return false;
} }
const nsTimingFunction &tf = const nsTimingFunction &tf =
aStyleDisplay.GetTransitionTimingFunction(transitionIdx); aStyleDisplay.GetTransitionTimingFunction(transitionIdx);
float delay = aStyleDisplay.GetTransitionDelay(transitionIdx);
float duration = aStyleDisplay.GetTransitionDuration(transitionIdx);
if (duration < 0.0) {
// The spec says a negative duration is treated as zero.
duration = 0.0;
}
AnimationValue startForReversingTest = startValue; AnimationValue startForReversingTest = startValue;
double reversePortion = 1.0; double reversePortion = 1.0;
@ -839,7 +853,7 @@ nsTransitionManager::ConsiderInitiatingTransition(
if (!aElementTransitions) { if (!aElementTransitions) {
MOZ_ASSERT(!createdCollection, "outparam should agree with return value"); MOZ_ASSERT(!createdCollection, "outparam should agree with return value");
NS_WARNING("allocating collection failed"); NS_WARNING("allocating collection failed");
return; return false;
} }
if (createdCollection) { if (createdCollection) {
@ -886,7 +900,7 @@ nsTransitionManager::ConsiderInitiatingTransition(
} else { } else {
if (!animations.AppendElement(animation)) { if (!animations.AppendElement(animation)) {
NS_WARNING("out of memory"); NS_WARNING("out of memory");
return; return false;
} }
} }
@ -895,7 +909,6 @@ nsTransitionManager::ConsiderInitiatingTransition(
effectSet->UpdateAnimationGeneration(mPresContext); effectSet->UpdateAnimationGeneration(mPresContext);
} }
*aStartedAny = true; return true;
aWhichStarted->AddProperty(aProperty);
} }

Просмотреть файл

@ -339,7 +339,8 @@ protected:
const mozilla::ComputedStyle& aOldStyle, const mozilla::ComputedStyle& aOldStyle,
const mozilla::ComputedStyle& aNewStyle); const mozilla::ComputedStyle& aNewStyle);
void ConsiderInitiatingTransition(nsCSSPropertyID aProperty, // Returns whether the transition actually started.
bool ConsiderInitiatingTransition(nsCSSPropertyID aProperty,
const nsStyleDisplay& aStyleDisplay, const nsStyleDisplay& aStyleDisplay,
uint32_t transitionIdx, uint32_t transitionIdx,
mozilla::dom::Element* aElement, mozilla::dom::Element* aElement,
@ -347,9 +348,7 @@ protected:
CSSTransitionCollection*& aElementTransitions, CSSTransitionCollection*& aElementTransitions,
const mozilla::ComputedStyle& aOldStyle, const mozilla::ComputedStyle& aOldStyle,
const mozilla::ComputedStyle& aNewStyle, const mozilla::ComputedStyle& aNewStyle,
bool* aStartedAny, nsCSSPropertyIDSet& aPropertiesChecked);
nsCSSPropertyIDSet* aWhichStarted);
}; };
#endif /* !defined(nsTransitionManager_h_) */ #endif /* !defined(nsTransitionManager_h_) */

Просмотреть файл

@ -71,9 +71,6 @@ for (let [key, val] of Object.entries({
focusFilterMode: "all", focusFilterMode: "all",
compareRetainedDisplayLists: false, compareRetainedDisplayLists: false,
// add a delay between loading tests
runSlower: false,
browser: undefined, browser: undefined,
// Are we testing web content loaded in a separate process? // Are we testing web content loaded in a separate process?
browserIsRemote: undefined, // bool browserIsRemote: undefined, // bool

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше