Merge inbound to mozilla-central. a=merge
authorGurzau Raul <rgurzau@mozilla.com>
Tue, 06 Aug 2019 00:59:38 +0300
changeset 486450 dba2c8019074a017293f708cec0292607c2e803c
parent 486234 8437b860258fe0a83da254761f7c8f5b221f7116 (current diff)
parent 486449 7a4031897e6bd0d5e86a56e5cd727eef4c0f2558 (diff)
child 486451 8d5149913cfebf6efc3a64e1bce847bf52e96079
child 486499 145d56e982b708669872b7cf3fbc0c2cbfbd4858
push id91730
push userrgurzau@mozilla.com
push dateMon, 05 Aug 2019 22:05:51 +0000
treeherderautoland@8d5149913cfe [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone70.0a1
first release with
nightly linux32
dba2c8019074 / 70.0a1 / 20190805220030 / files
nightly linux64
dba2c8019074 / 70.0a1 / 20190805220030 / files
nightly mac
dba2c8019074 / 70.0a1 / 20190805220030 / files
nightly win32
dba2c8019074 / 70.0a1 / 20190805220030 / files
nightly win64
dba2c8019074 / 70.0a1 / 20190805220030 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to mozilla-central. a=merge
testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-006.xht.ini
testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-008.xht.ini
testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-010.xht.ini
testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-011.xht.ini
testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-015.xht.ini
testing/web-platform/meta/mathml/presentation-markup/operators/mo-movablelimits.html.ini
testing/web-platform/meta/mathml/relations/css-styling/color-1.html.ini
testing/web-platform/meta/native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.js.ini
testing/web-platform/meta/shape-detection/detected-boundingBox-read-only.html.ini
testing/web-platform/meta/shape-detection/detection-HTMLCanvasElement.html.ini
testing/web-platform/meta/shape-detection/detection-HTMLImageElement.html.ini
testing/web-platform/meta/shape-detection/detection-HTMLVideoElement.html.ini
testing/web-platform/meta/shape-detection/detection-ImageBitmap.html.ini
testing/web-platform/meta/shape-detection/detection-ImageData-detached.html.ini
testing/web-platform/meta/shape-detection/detection-ImageData.html.ini
testing/web-platform/meta/shape-detection/detection-getSupportedFormats.html.ini
testing/web-platform/meta/shape-detection/detection-on-worker.worker.js.ini
testing/web-platform/meta/shape-detection/detection-options.html.ini
testing/web-platform/meta/shape-detection/detection-security-test.html.ini
testing/web-platform/meta/shape-detection/detector-same-object.html.ini
testing/web-platform/meta/shape-detection/idlharness.any.js.ini
testing/web-platform/meta/shape-detection/shapedetection-cross-origin.sub.html.ini
testing/web-platform/meta/shape-detection/shapedetection-empty-input.html.ini
testing/web-platform/meta/web-nfc/NFCReader.html.ini
testing/web-platform/meta/webxr/xrWebGLLayer_framebuffer.https.html.ini
testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-003-ref.xht
testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-006.xht
testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-008.xht
testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-010.xht
testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-011.xht
testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-015.xht
testing/web-platform/tests/mathml/relations/css-styling/color-1-ref.html
testing/web-platform/tests/mathml/relations/css-styling/color-1.html
testing/web-platform/tests/mathml/relations/css-styling/visibility-1-ref.html
testing/web-platform/tests/mathml/relations/css-styling/visibility-1.html
testing/web-platform/tests/mixed-content/generic/tools/spec_validator.py
testing/web-platform/tests/native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.js
testing/web-platform/tests/referrer-policy/generic/tools/spec_validator.py
testing/web-platform/tests/shape-detection/detected-boundingBox-read-only.html
testing/web-platform/tests/shape-detection/detection-HTMLCanvasElement.html
testing/web-platform/tests/shape-detection/detection-HTMLImageElement.html
testing/web-platform/tests/shape-detection/detection-HTMLVideoElement.html
testing/web-platform/tests/shape-detection/detection-ImageBitmap.html
testing/web-platform/tests/shape-detection/detection-ImageData-detached.html
testing/web-platform/tests/shape-detection/detection-ImageData.html
testing/web-platform/tests/shape-detection/detection-getSupportedFormats.html
testing/web-platform/tests/shape-detection/detection-on-worker.worker.js
testing/web-platform/tests/shape-detection/detection-options.html
testing/web-platform/tests/shape-detection/detection-security-test.html
testing/web-platform/tests/shape-detection/detector-same-object.html
testing/web-platform/tests/shape-detection/idlharness.any.js
testing/web-platform/tests/shape-detection/shapedetection-cross-origin.sub.html
testing/web-platform/tests/shape-detection/shapedetection-empty-input.html
testing/web-platform/tests/web-nfc/NFCReader.html
testing/web-platform/tests/webxr/xrWebGLLayer_framebuffer.https.html
--- a/layout/style/Loader.cpp
+++ b/layout/style/Loader.cpp
@@ -838,17 +838,17 @@ nsresult Loader::CheckContentPolicy(nsIP
  * are clones off; make sure to call PrepareSheet() on the result of
  * CreateSheet().
  */
 nsresult Loader::CreateSheet(
     nsIURI* aURI, nsIContent* aLinkingContent, nsIPrincipal* aLoaderPrincipal,
     css::SheetParsingMode aParsingMode, CORSMode aCORSMode,
     nsIReferrerInfo* aLoadingReferrerInfo, const nsAString& aIntegrity,
     bool aSyncLoad, StyleSheetState& aSheetState, RefPtr<StyleSheet>* aSheet) {
-  LOG(("css::Loader::CreateSheet"));
+  LOG(("css::Loader::CreateSheet(%s)", aURI ? aURI->GetSpecOrDefault().get() : "inline"));
   MOZ_ASSERT(aSheet, "Null out param!");
 
   if (!mSheets) {
     mSheets = MakeUnique<Sheets>();
   }
 
   *aSheet = nullptr;
   aSheetState = eSheetStateUnknown;
@@ -892,18 +892,18 @@ nsresult Loader::CreateSheet(
       // that is an indication that its rules have been exposed to
       // CSSOM and so we can't use it.
       //
       // Similarly, if the sheet doesn't have the right parsing mode just bail.
       if (sheet->HasForcedUniqueInner() ||
           sheet->ParsingMode() != aParsingMode) {
         LOG(
             ("  Not cloning completed sheet %p because it has a "
-             "forced unique inner or the wrong parsing mode",
-             sheet.get()));
+             "forced unique inner (%d) or the wrong parsing mode",
+             sheet.get(), sheet->HasForcedUniqueInner()));
         sheet = nullptr;
         fromCompleteSheets = false;
       }
     }
 
     // Then loading sheets
     if (!sheet && !aSyncLoad) {
       aSheetState = eSheetLoading;
--- a/security/nss/TAG-INFO
+++ b/security/nss/TAG-INFO
@@ -1,1 +1,1 @@
-a31fc0eefc4c
+777b6070fe76
--- a/security/nss/cmd/lib/secpwd.c
+++ b/security/nss/cmd/lib/secpwd.c
@@ -61,17 +61,17 @@ SEC_GetPassword(FILE *input, FILE *outpu
 #if defined(_WINDOWS)
     int isTTY = (input == stdin);
 #define echoOn(x)
 #define echoOff(x)
 #else
     int infd = fileno(input);
     int isTTY = isatty(infd);
 #endif
-    char phrase[200] = { '\0' }; /* ensure EOF doesn't return junk */
+    char phrase[500] = { '\0' }; /* ensure EOF doesn't return junk */
 
     for (;;) {
         /* Prompt for password */
         if (isTTY) {
             fprintf(output, "%s", prompt);
             fflush(output);
             echoOff(infd);
         }
--- a/security/nss/cmd/pk11mode/pk11mode.c
+++ b/security/nss/cmd/pk11mode/pk11mode.c
@@ -5224,17 +5224,17 @@ PKM_Digest(CK_FUNCTION_LIST_PTR pFunctio
     }
 
     return crv;
 }
 
 char *
 PKM_FilePasswd(char *pwFile)
 {
-    unsigned char phrase[200];
+    unsigned char phrase[500];
     PRFileDesc *fd;
     PRInt32 nb;
     int i;
 
     if (!pwFile)
         return 0;
 
     fd = PR_Open(pwFile, PR_RDONLY, 0);
--- a/security/nss/cmd/shlibsign/shlibsign.c
+++ b/security/nss/cmd/shlibsign/shlibsign.c
@@ -609,17 +609,17 @@ cleanup:
     }
 
     return crv;
 }
 
 static char *
 filePasswd(char *pwFile)
 {
-    unsigned char phrase[200];
+    unsigned char phrase[500];
     PRFileDesc *fd;
     PRInt32 nb;
     int i;
 
     if (!pwFile)
         return 0;
 
     fd = PR_Open(pwFile, PR_RDONLY, 0);
--- a/security/nss/coreconf/coreconf.dep
+++ b/security/nss/coreconf/coreconf.dep
@@ -5,9 +5,8 @@
 
 /*
  * A dummy header file that is a dependency for all the object files.
  * Used to force a full recompilation of NSS in Mozilla's Tinderbox
  * depend builds.  See comments in rules.mk.
  */
 
 #error "Do not include this header file."
-
--- a/security/nss/gtests/softoken_gtest/softoken_gtest.cc
+++ b/security/nss/gtests/softoken_gtest/softoken_gtest.cc
@@ -1,13 +1,14 @@
 #include "cert.h"
 #include "certdb.h"
 #include "nspr.h"
 #include "nss.h"
 #include "pk11pub.h"
+#include "secmod.h"
 #include "secerr.h"
 
 #include "nss_scoped_ptrs.h"
 #include "util.h"
 
 #define GTEST_HAS_RTTI 0
 #include "gtest/gtest.h"
 
@@ -114,16 +115,37 @@ TEST_F(SoftokenTest, CreateObjectChangeP
   EXPECT_EQ(SECSuccess, PK11_InitPin(slot.get(), nullptr, nullptr));
   EXPECT_EQ(SECSuccess, PK11_ChangePW(slot.get(), "", "password"));
   EXPECT_EQ(SECSuccess, PK11_Logout(slot.get()));
   ScopedPK11GenericObject obj(PK11_CreateGenericObject(
       slot.get(), attributes, PR_ARRAY_SIZE(attributes), true));
   EXPECT_EQ(nullptr, obj);
 }
 
+/* The size limit for a password is 500 characters as defined in pkcs11i.h */
+TEST_F(SoftokenTest, CreateObjectChangeToBigPassword) {
+  ScopedPK11SlotInfo slot(PK11_GetInternalKeySlot());
+  ASSERT_TRUE(slot);
+  EXPECT_EQ(SECSuccess, PK11_InitPin(slot.get(), nullptr, nullptr));
+  EXPECT_EQ(
+      SECSuccess,
+      PK11_ChangePW(slot.get(), "",
+                    "rUIFIFr2bxKnbJbitsfkyqttpk6vCJzlYMNxcxXcaN37gSZKbLk763X7iR"
+                    "yeVNWZHQ02lSF69HYjzTyPW3318ZD0DBFMMbALZ8ZPZP73CIo5uIQlaowV"
+                    "IbP8eOhRYtGUqoLGlcIFNEYogV8Q3GN58VeBMs0KxrIOvPQ9s8SnYYkqvt"
+                    "zzgntmAvCgvk64x6eQf0okHwegd5wi6m0WVJytEepWXkP9J629FSa5kNT8"
+                    "FvL3jvslkiImzTNuTvl32fQDXXMSc8vVk5Q3mH7trMZM0VDdwHWYERjHbz"
+                    "kGxFgp0VhediHx7p9kkz6H6ac4et9sW4UkTnN7xhYc1Zr17wRSk2heQtcX"
+                    "oZJGwuzhiKm8A8wkuVxms6zO56P4JORIk8oaUW6lyNTLo2kWWnTA"));
+  EXPECT_EQ(SECSuccess, PK11_Logout(slot.get()));
+  ScopedPK11GenericObject obj(PK11_CreateGenericObject(
+      slot.get(), attributes, PR_ARRAY_SIZE(attributes), true));
+  EXPECT_EQ(nullptr, obj);
+}
+
 TEST_F(SoftokenTest, CreateObjectChangeToEmptyPassword) {
   ScopedPK11SlotInfo slot(PK11_GetInternalKeySlot());
   ASSERT_TRUE(slot);
   EXPECT_EQ(SECSuccess, PK11_InitPin(slot.get(), nullptr, "password"));
   EXPECT_EQ(SECSuccess, PK11_ChangePW(slot.get(), "password", ""));
   // PK11_Logout returnes an error and SEC_ERROR_TOKEN_NOT_LOGGED_IN if the user
   // is not "logged in".
   EXPECT_EQ(SECFailure, PK11_Logout(slot.get()));
@@ -260,15 +282,109 @@ TEST_F(SoftokenNoDBTest, NeedUserInitNoD
   ASSERT_TRUE(slot);
   EXPECT_EQ(PR_FALSE, PK11_NeedUserInit(slot.get()));
 
   // When shutting down in here we have to release the slot first.
   slot = nullptr;
   ASSERT_EQ(SECSuccess, NSS_Shutdown());
 }
 
+#ifndef NSS_FIPS_DISABLED
+
+class SoftokenFipsTest : public SoftokenTest {
+ protected:
+  SoftokenFipsTest() : SoftokenTest("SoftokenFipsTest.d-") {}
+
+  virtual void SetUp() {
+    SoftokenTest::SetUp();
+
+    // Turn on FIPS mode (code borrowed from FipsMode in modutil/pk11.c)
+    char *internal_name;
+    ASSERT_FALSE(PK11_IsFIPS());
+    internal_name = PR_smprintf("%s", SECMOD_GetInternalModule()->commonName);
+    ASSERT_EQ(SECSuccess, SECMOD_DeleteInternalModule(internal_name));
+    PR_smprintf_free(internal_name);
+    ASSERT_TRUE(PK11_IsFIPS());
+  }
+};
+
+const std::vector<std::string> kFipsPasswordCases[] = {
+    // FIPS level1 -> level1 -> level1
+    {"", "", ""},
+    // FIPS level1 -> level1 -> level2
+    {"", "", "strong-_123"},
+    // FIXME: this should work: FIPS level1 -> level2 -> level2
+    // {"", "strong-_123", "strong-_456"},
+    // FIPS level2 -> level2 -> level2
+    {"strong-_123", "strong-_456", "strong-_123"}};
+
+const std::vector<std::string> kFipsPasswordBadCases[] = {
+    // FIPS level1 -> level2 -> level1
+    {"", "strong-_123", ""},
+    // FIPS level2 -> level1 -> level1
+    {"strong-_123", ""},
+    // FIPS level2 -> level2 -> level1
+    {"strong-_123", "strong-_456", ""},
+    // initialize with a weak password
+    {"weak"},
+    // FIPS level1 -> weak password
+    {"", "weak"},
+    // FIPS level2 -> weak password
+    {"strong-_123", "weak"}};
+
+class SoftokenFipsPasswordTest
+    : public SoftokenFipsTest,
+      public ::testing::WithParamInterface<std::vector<std::string>> {};
+
+class SoftokenFipsBadPasswordTest
+    : public SoftokenFipsTest,
+      public ::testing::WithParamInterface<std::vector<std::string>> {};
+
+TEST_P(SoftokenFipsPasswordTest, SetPassword) {
+  const std::vector<std::string> &passwords = GetParam();
+  ScopedPK11SlotInfo slot(PK11_GetInternalKeySlot());
+  ASSERT_TRUE(slot);
+
+  auto it = passwords.begin();
+  auto prev_it = it;
+  EXPECT_EQ(SECSuccess, PK11_InitPin(slot.get(), nullptr, (*it).c_str()));
+  for (it++; it != passwords.end(); it++, prev_it++) {
+    EXPECT_EQ(SECSuccess,
+              PK11_ChangePW(slot.get(), (*prev_it).c_str(), (*it).c_str()));
+  }
+}
+
+TEST_P(SoftokenFipsBadPasswordTest, SetBadPassword) {
+  const std::vector<std::string> &passwords = GetParam();
+  ScopedPK11SlotInfo slot(PK11_GetInternalKeySlot());
+  ASSERT_TRUE(slot);
+
+  auto it = passwords.begin();
+  auto prev_it = it;
+  SECStatus rv = PK11_InitPin(slot.get(), nullptr, (*it).c_str());
+  if (it + 1 == passwords.end())
+    EXPECT_EQ(SECFailure, rv);
+  else
+    EXPECT_EQ(SECSuccess, rv);
+  for (it++; it != passwords.end(); it++, prev_it++) {
+    rv = PK11_ChangePW(slot.get(), (*prev_it).c_str(), (*it).c_str());
+    if (it + 1 == passwords.end())
+      EXPECT_EQ(SECFailure, rv);
+    else
+      EXPECT_EQ(SECSuccess, rv);
+  }
+}
+
+INSTANTIATE_TEST_CASE_P(FipsPasswordCases, SoftokenFipsPasswordTest,
+                        ::testing::ValuesIn(kFipsPasswordCases));
+
+INSTANTIATE_TEST_CASE_P(BadFipsPasswordCases, SoftokenFipsBadPasswordTest,
+                        ::testing::ValuesIn(kFipsPasswordBadCases));
+
+#endif
+
 }  // namespace nss_test
 
 int main(int argc, char **argv) {
   ::testing::InitGoogleTest(&argc, argv);
 
   return RUN_ALL_TESTS();
 }
--- a/security/nss/lib/freebl/pqg.c
+++ b/security/nss/lib/freebl/pqg.c
@@ -885,17 +885,17 @@ findQfromSeed(
     const SECItem *seed,        /* input.  */
     mp_int *Q,                  /* input. */
     mp_int *Q_,                 /* output. */
     unsigned int *qseed_len,    /* output */
     HASH_HashType *hashtypePtr, /* output. Hash uses */
     pqgGenType *typePtr,        /* output. Generation Type used */
     unsigned int *qgen_counter) /* output. q_counter */
 {
-    HASH_HashType hashtype;
+    HASH_HashType hashtype = HASH_AlgNULL;
     SECItem firstseed = { 0, 0, 0 };
     SECItem qseed = { 0, 0, 0 };
     SECStatus rv;
 
     *qseed_len = 0; /* only set if FIPS186_3_ST_TYPE */
 
     /* handle legacy small DSA first can only be FIPS186_1_TYPE */
     if (L < 1024) {
@@ -1234,17 +1234,17 @@ pqg_ParamGen(unsigned int L, unsigned in
              unsigned int seedBytes, PQGParams **pParams, PQGVerify **pVfy)
 {
     unsigned int n;       /* Per FIPS 186, app 2.2. 186-3 app A.1.1.2 */
     unsigned int seedlen; /* Per FIPS 186-3 app A.1.1.2  (was 'g' 186-1)*/
     unsigned int counter; /* Per FIPS 186, app 2.2. 186-3 app A.1.1.2 */
     unsigned int offset;  /* Per FIPS 186, app 2.2. 186-3 app A.1.1.2 */
     unsigned int outlen;  /* Per FIPS 186-3, appendix A.1.1.2. */
     unsigned int maxCount;
-    HASH_HashType hashtype;
+    HASH_HashType hashtype = HASH_AlgNULL;
     SECItem *seed; /* Per FIPS 186, app 2.2. 186-3 app A.1.1.2 */
     PLArenaPool *arena = NULL;
     PQGParams *params = NULL;
     PQGVerify *verify = NULL;
     PRBool passed;
     SECItem hit = { 0, 0, 0 };
     SECItem firstseed = { 0, 0, 0 };
     SECItem qseed = { 0, 0, 0 };
@@ -1625,18 +1625,18 @@ PQG_VerifyParams(const PQGParams *params
     unsigned int g, n, L, N, offset, outlen;
     mp_int p0, P, Q, G, P_, Q_, G_, r, h;
     mp_err err = MP_OKAY;
     int j;
     unsigned int counter_max = 0; /* handle legacy L < 1024 */
     unsigned int qseed_len;
     unsigned int qgen_counter_ = 0;
     SECItem pseed_ = { 0, 0, 0 };
-    HASH_HashType hashtype;
-    pqgGenType type;
+    HASH_HashType hashtype = HASH_AlgNULL;
+    pqgGenType type = FIPS186_1_TYPE;
 
 #define CHECKPARAM(cond)      \
     if (!(cond)) {            \
         *result = SECFailure; \
         goto cleanup;         \
     }
     if (!params || !vfy || !result) {
         PORT_SetError(SEC_ERROR_INVALID_ARGS);
--- a/security/nss/lib/softoken/fipstokn.c
+++ b/security/nss/lib/softoken/fipstokn.c
@@ -640,27 +640,47 @@ FC_InitPIN(CK_SESSION_HANDLE hSession,
 CK_RV
 FC_SetPIN(CK_SESSION_HANDLE hSession, CK_CHAR_PTR pOldPin,
           CK_ULONG usOldLen, CK_CHAR_PTR pNewPin, CK_ULONG usNewLen)
 {
     CK_RV rv;
 
     CHECK_FORK();
 
-    if ((rv = sftk_fipsCheck()) == CKR_OK &&
-        (rv = sftk_newPinCheck(pNewPin, usNewLen)) == CKR_OK) {
+    rv = sftk_fipsCheck();
+    if (rv != CKR_OK) {
+        goto loser;
+    }
+
+    if (isLevel2 || usNewLen > 0) {
+        rv = sftk_newPinCheck(pNewPin, usNewLen);
+        if (rv != CKR_OK) {
+            goto loser;
+        }
         rv = NSC_SetPIN(hSession, pOldPin, usOldLen, pNewPin, usNewLen);
-        if ((rv == CKR_OK) &&
-            (sftk_SlotIDFromSessionHandle(hSession) == FIPS_SLOT_ID)) {
+        if (rv != CKR_OK) {
+            goto loser;
+        }
+        if (sftk_SlotIDFromSessionHandle(hSession) == FIPS_SLOT_ID) {
             /* if we set the password in level1 we now go
              * to level2. NOTE: we don't allow the user to
              * go from level2 to level1 */
             isLevel2 = PR_TRUE;
         }
+    } else {
+        /* here both old and new passwords are empty, but we need to
+         * call NSC_SetPIN to force rekey the database entries */
+        PORT_Assert(usNewLen == 0);
+        rv = NSC_SetPIN(hSession, pOldPin, usOldLen, pNewPin, usNewLen);
+        if (rv != CKR_OK) {
+            goto loser;
+        }
     }
+
+loser:
     if (sftk_audit_enabled) {
         char msg[128];
         NSSAuditSeverity severity = (rv == CKR_OK) ? NSS_AUDIT_INFO : NSS_AUDIT_ERROR;
         PR_snprintf(msg, sizeof msg,
                     "C_SetPIN(hSession=0x%08lX)=0x%08lX",
                     (PRUint32)hSession, (PRUint32)rv);
         sftk_LogAuditMessage(severity, NSS_AUDIT_SET_PIN, msg);
     }
--- a/security/nss/lib/softoken/pkcs11.c
+++ b/security/nss/lib/softoken/pkcs11.c
@@ -3895,17 +3895,20 @@ NSC_SetPIN(CK_SESSION_HANDLE hSession, C
     sftk_FreeSession(sp);
     sp = NULL;
 
     /* make sure the pins aren't too long */
     if ((ulNewLen > SFTK_MAX_PIN) || (ulOldLen > SFTK_MAX_PIN)) {
         crv = CKR_PIN_LEN_RANGE;
         goto loser;
     }
-    if (ulNewLen < (CK_ULONG)slot->minimumPinLen) {
+    /* check the length of new pin, unless both old and new passwords
+     * are empty */
+    if ((ulNewLen != 0 || ulOldLen != 0) &&
+        ulNewLen < (CK_ULONG)slot->minimumPinLen) {
         crv = CKR_PIN_LEN_RANGE;
         goto loser;
     }
 
     /* convert to null terminated string */
     PORT_Memcpy(newPinStr, pNewPin, ulNewLen);
     newPinStr[ulNewLen] = 0;
     PORT_Memcpy(oldPinStr, pOldPin, ulOldLen);
--- a/security/nss/lib/softoken/pkcs11i.h
+++ b/security/nss/lib/softoken/pkcs11i.h
@@ -454,17 +454,17 @@ struct SFTKItemTemplateStr {
 /* certdb (high bit == 1) */
 #define SFTK_TOKEN_TYPE_TRUST 0x40000000L
 #define SFTK_TOKEN_TYPE_CRL 0x50000000L
 #define SFTK_TOKEN_TYPE_SMIME 0x60000000L
 #define SFTK_TOKEN_TYPE_CERT 0x70000000L
 
 #define SFTK_TOKEN_KRL_HANDLE (SFTK_TOKEN_MAGIC | SFTK_TOKEN_TYPE_CRL | 1)
 /* how big (in bytes) a password/pin we can deal with */
-#define SFTK_MAX_PIN 255
+#define SFTK_MAX_PIN 500
 /* minimum password/pin length (in Unicode characters) in FIPS mode */
 #define FIPS_MIN_PIN 7
 
 /* slot ID's */
 #define NETSCAPE_SLOT_ID 1
 #define PRIVATE_KEY_SLOT_ID 2
 #define FIPS_SLOT_ID 3
 
--- a/security/nss/mach
+++ b/security/nss/mach
@@ -192,16 +192,23 @@ class coverityAction(argparse.Action):
 
     def cov_is_file_in_source(self, abs_path):
         if os.path.islink(abs_path):
             abs_path = os.path.realpath(abs_path)
         return abs_path
 
     def dump_cov_artifact(self, cov_results, source, output):
         import json
+
+        def relpath(path):
+            '''Build path relative to repository root'''
+            if path.startswith(cwd):
+                return os.path.relpath(path, cwd)
+            return path
+
         # Parse Coverity json into structured issues
         with open(cov_results) as f:
             result = json.load(f)
 
             # Parse the issues to a standard json format
             issues_dict = {'files': {}}
 
             files_list = issues_dict['files']
@@ -218,30 +225,31 @@ class coverityAction(argparse.Action):
                         'category': issue['checkerProperties']['category'],
                         'stateOnServer': issue['stateOnServer'],
                         'stack': []
                     }
                 }
 
                 # Embed all events into extra message
                 for event in issue['events']:
-                    dict_issue['extra']['stack'].append({'file_path': event['strippedFilePathname'],
+                    dict_issue['extra']['stack'].append({'file_path': relpath(event['strippedFilePathname']),
                                                          'line_number': event['lineNumber'],
                                                          'path_type': event['eventTag'],
                                                          'description': event['eventDescription']})
 
                 return dict_issue
 
             for issue in result['issues']:
                 path = self.cov_is_file_in_source(issue['strippedMainEventFilePathname'])
                 if path is None:
                     # Since we skip a result we should log it
                     print('Skipping CID: {0} from file: {1} since it\'s not related with the current patch.'.format(
                         issue['stateOnServer']['cid'], issue['strippedMainEventFilePathname']))
                     continue
+                path = relpath(path)
                 if path in files_list:
                     files_list[path]['warnings'].append(build_element(issue))
                 else:
                     files_list[path] = {'warnings': [build_element(issue)]}
 
             with open(output, 'w') as f:
                 json.dump(issues_dict, f)
 
--- a/security/nss/tests/fips/cavs_scripts/aes.sh
+++ b/security/nss/tests/fips/cavs_scripts/aes.sh
@@ -78,16 +78,18 @@ if [ ${COMMAND} = "verify" ]; then
     for request in $cbc_kat_requests $cbc_mct_requests $cbc_mmt_requests $ecb_kat_requests $ecb_mct_requests $ecb_mmt_requests; do
 	sh ./validate1.sh ${TESTDIR} $request
 	last_result=$?
 	result=`expr $result + $last_result`
     done
     exit $result
 fi
 
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 for request in $cbc_kat_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
     fipstest aes kat cbc ${REQDIR}/$request > ${RSPDIR}/$response
 done
 for request in $cbc_mct_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
--- a/security/nss/tests/fips/cavs_scripts/aesgcm.sh
+++ b/security/nss/tests/fips/cavs_scripts/aesgcm.sh
@@ -51,16 +51,18 @@ if [ ${COMMAND} = "verify" ]; then
         fipstest aes gcm decrypt ${RSPDIR}/$name.rsp | grep FAIL
 	test 1 = $?
 	last_result=$?
 	result=`expr $result + $last_result`
     done
     exit $result
 fi
 
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 for request in $gcm_decrypt_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
     fipstest aes gcm decrypt ${REQDIR}/$request > ${RSPDIR}/$response
 done
 for request in $gcm_encrypt_intiv_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
--- a/security/nss/tests/fips/cavs_scripts/dsa.sh
+++ b/security/nss/tests/fips/cavs_scripts/dsa.sh
@@ -54,16 +54,18 @@ if [ ${COMMAND} = "verify" ]; then
     result=`expr $result + $last_result`
 # verify SigVer with known answer
     sh ./validate1.sh ${TESTDIR} SigVer.req ' ' '-e /^X.=/d -e /^Result.=.F/s;.(.*);;'
     last_result=$?
     result=`expr $result + $last_result`
     exit $result
 fi
 
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 request=KeyPair.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
 fipstest dsa keypair ${REQDIR}/$request > ${RSPDIR}/$response
 
 request=PQGGen.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
--- a/security/nss/tests/fips/cavs_scripts/ecdsa.sh
+++ b/security/nss/tests/fips/cavs_scripts/ecdsa.sh
@@ -45,16 +45,18 @@ if [ ${COMMAND} = "verify" ]; then
     result=`expr $result + $last_result`
 # verify SigVer with known answer
     sh ./validate1.sh ${TESTDIR} SigVer.req ' ' '-e /^X.=/d -e /^Result.=.F/s;.(.*);; -e /^Result.=.P/s;.(.*);;'
     last_result=$?
     result=`expr $result + $last_result`
     exit $result
 fi
 
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 request=KeyPair.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
 fipstest ecdsa keypair ${REQDIR}/$request > ${RSPDIR}/$response
 
 request=PKV.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
--- a/security/nss/tests/fips/cavs_scripts/hmac.sh
+++ b/security/nss/tests/fips/cavs_scripts/hmac.sh
@@ -26,14 +26,17 @@ if [ ${COMMAND} = "verify" ]; then
     result=0
     for request in $hmac_requests; do
 	sh ./validate1.sh ${TESTDIR} $request
 	last_result=$?
         result=`expr $result + $last_result`
     done
     exit $result
 fi
+
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 for request in $hmac_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
     fipstest hmac ${REQDIR}/$request > ${RSPDIR}/$response
 done
 exit 0
--- a/security/nss/tests/fips/cavs_scripts/ike.sh
+++ b/security/nss/tests/fips/cavs_scripts/ike.sh
@@ -28,16 +28,18 @@ if [ ${COMMAND} = "verify" ]; then
     for request in $ike_requests; do
 	sh ./validate1.sh ${TESTDIR} $request
 	last_result=$?
 	result=`expr $result + $last_result`
     done
     exit $result
 fi
 
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 request=ikev1_dsa.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
 fipstest ikev1 ${REQDIR}/$request > ${RSPDIR}/$response
 request=ikev1_psk.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
 fipstest ikev1-psk ${REQDIR}/$request > ${RSPDIR}/$response
--- a/security/nss/tests/fips/cavs_scripts/kas.sh
+++ b/security/nss/tests/fips/cavs_scripts/kas.sh
@@ -63,16 +63,18 @@ if [ ${COMMAND} = "verify" ]; then
     result=`expr $result + $last_result`
     # ecdh response verify
     sh ./validate1.sh ${TESTDIR} KASValidityTest_FFCEphem_NOKC_ZZOnly_resp.req ' ' '-e /^Result.=.F/s;.(.*);; -e /^Result.=.P/s;.(.*);;'
     last_result=$?
     result=`expr $result + $last_result`
     exit $result
 fi
 
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 request=KASFunctionTest_ECCEphemeralUnified_NOKC_ZZOnly_init.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
 fipstest ecdh init-func ${REQDIR}/$request > ${RSPDIR}/$response
 
 request=KASFunctionTest_ECCEphemeralUnified_NOKC_ZZOnly_resp.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
--- a/security/nss/tests/fips/cavs_scripts/rng.sh
+++ b/security/nss/tests/fips/cavs_scripts/rng.sh
@@ -25,14 +25,17 @@ if [ ${COMMAND} = "verify" ]; then
     result=0;
     for request in $drbg_requests; do
 	sh ./validate1.sh ${TESTDIR} $request
 	last_result=$?
 	result=`expr $result + $last_result`
     done
     exit $result
 fi
+
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 for request in $drbg_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
     fipstest drbg ${REQDIR}/$request > ${RSPDIR}/$response
 done
 exit 0
--- a/security/nss/tests/fips/cavs_scripts/rsa.sh
+++ b/security/nss/tests/fips/cavs_scripts/rsa.sh
@@ -33,16 +33,18 @@ if [ ${COMMAND} = "verify" ]; then
     last_result=$?
     result=`expr $result + $last_result`
 #
 # currently don't have a way to verify the RSA keygen
 #
     exit $result
 fi
 
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 request=SigGen15_186-3.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
 fipstest rsa siggen ${REQDIR}/$request > ${RSPDIR}/$response
 
 request=SigVer15_186-3.req
 response=`echo $request | sed -e "s/req/rsp/"`
 echo $request $response
--- a/security/nss/tests/fips/cavs_scripts/sha.sh
+++ b/security/nss/tests/fips/cavs_scripts/sha.sh
@@ -46,16 +46,18 @@ if [ ${COMMAND} = "verify" ]; then
     for request in $sha_ShortMsg_requests $sha_LongMsg_requests $sha_Monte_requests; do
 	sh ./validate1.sh ${TESTDIR} $request
 	last_result=$?
 	result=`expr $result + $last_result`
     done
     exit $result
 fi
 
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 for request in $sha_ShortMsg_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
     fipstest sha ${REQDIR}/$request > ${RSPDIR}/$response
 done
 for request in $sha_LongMsg_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
--- a/security/nss/tests/fips/cavs_scripts/tdea.sh
+++ b/security/nss/tests/fips/cavs_scripts/tdea.sh
@@ -72,16 +72,18 @@ if [ ${COMMAND} = "verify" ]; then
     do
 	sh ./validate1.sh ${TESTDIR} $request "-e /^NumKeys/d"
 	last_result=$?
 	result=`expr $result + $last_result`
     done
     exit $result
 fi
 
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 for request in $cbc_kat_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
     fipstest tdea kat cbc ${REQDIR}/$request > ${RSPDIR}/$response
 done
 for request in $cbc_mmt_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
--- a/security/nss/tests/fips/cavs_scripts/tls.sh
+++ b/security/nss/tests/fips/cavs_scripts/tls.sh
@@ -25,14 +25,17 @@ if [ ${COMMAND} = "verify" ]; then
     result=0
     for request in $tls_requests; do
 	sh ./validate1.sh ${TESTDIR} $request
 	last_result=$?
 	result=`expr $result + $last_result`
     done
     exit $result
 fi
+
+test -d "${RSPDIR}" || mkdir "${RSPDIR}"
+
 for request in $tls_requests; do
     response=`echo $request | sed -e "s/req/rsp/"`
     echo $request $response
     fipstest tls ${REQDIR}/$request > ${RSPDIR}/$response
 done
 exit 0
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/IndexedDB/structured-clone.any.js.ini
@@ -0,0 +1,9 @@
+[structured-clone.any.worker.html]
+  [Indexed DB and Structured Serializing/Deserializing]
+    expected: FAIL
+
+
+[structured-clone.any.html]
+  [Indexed DB and Structured Serializing/Deserializing]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/cookie-store/cookieStore_delete_insecure.tentative.https.window.js.ini
@@ -0,0 +1,7 @@
+[cookieStore_delete_insecure.tentative.https.window.html]
+  [cookieStore.delete(name) can delete an insecure cookie]
+    expected: FAIL
+
+  [cookieStore.delete(options) can delete an insecure cookie]
+    expected: FAIL
+
--- a/testing/web-platform/meta/credential-management/idlharness.https.window.js.ini
+++ b/testing/web-platform/meta/credential-management/idlharness.https.window.js.ini
@@ -96,8 +96,53 @@
     expected: FAIL
 
   [Credential interface: new FederatedCredential({\n        id: "id",\n        provider: "https://example.com",\n        iconURL: "https://example.com/",\n        name: "name"\n      }) must inherit property "id" with the proper type]
     expected: FAIL
 
   [Credential interface: new FederatedCredential({\n        id: "id",\n        provider: "https://example.com",\n        iconURL: "https://example.com/",\n        name: "name"\n      }) must inherit property "type" with the proper type]
     expected: FAIL
 
+  [PasswordCredential interface: passwordCredential must inherit property "name" with the proper type]
+    expected: FAIL
+
+  [Stringification of passwordCredential]
+    expected: FAIL
+
+  [FederatedCredential interface: federatedCredential must inherit property "protocol" with the proper type]
+    expected: FAIL
+
+  [Credential interface: federatedCredential must inherit property "type" with the proper type]
+    expected: FAIL
+
+  [Stringification of federatedCredential]
+    expected: FAIL
+
+  [Credential interface: passwordCredential must inherit property "type" with the proper type]
+    expected: FAIL
+
+  [FederatedCredential interface: federatedCredential must inherit property "provider" with the proper type]
+    expected: FAIL
+
+  [PasswordCredential interface: passwordCredential must inherit property "password" with the proper type]
+    expected: FAIL
+
+  [PasswordCredential must be primary interface of passwordCredential]
+    expected: FAIL
+
+  [FederatedCredential must be primary interface of federatedCredential]
+    expected: FAIL
+
+  [PasswordCredential interface: passwordCredential must inherit property "iconURL" with the proper type]
+    expected: FAIL
+
+  [FederatedCredential interface: federatedCredential must inherit property "iconURL" with the proper type]
+    expected: FAIL
+
+  [FederatedCredential interface: federatedCredential must inherit property "name" with the proper type]
+    expected: FAIL
+
+  [Credential interface: federatedCredential must inherit property "id" with the proper type]
+    expected: FAIL
+
+  [Credential interface: passwordCredential must inherit property "id" with the proper type]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-inline/parsing/dominant-baseline-computed.html.ini
@@ -0,0 +1,7 @@
+[dominant-baseline-computed.html]
+  [Property dominant-baseline value 'text-bottom' computes to 'text-bottom']
+    expected: FAIL
+
+  [Property dominant-baseline value 'text-top' computes to 'text-top']
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-inline/parsing/dominant-baseline-valid.html.ini
@@ -0,0 +1,7 @@
+[dominant-baseline-valid.html]
+  [e.style['dominant-baseline'\] = "text-top" should set the property value]
+    expected: FAIL
+
+  [e.style['dominant-baseline'\] = "text-bottom" should set the property value]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-overflow/overflow-body-propagation-002.tentative.html.ini
@@ -0,0 +1,4 @@
+[overflow-body-propagation-002.tentative.html]
+  expected:
+    if os == "android": PASS
+    FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-overflow/overflow-body-propagation-003.tentative.html.ini
@@ -0,0 +1,4 @@
+[overflow-body-propagation-003.tentative.html]
+  expected:
+    if os == "android": PASS
+    FAIL
--- a/testing/web-platform/meta/css/css-properties-values-api/var-reference-registered-properties-cycles.html.ini
+++ b/testing/web-platform/meta/css/css-properties-values-api/var-reference-registered-properties-cycles.html.ini
@@ -6,8 +6,11 @@
     expected: FAIL
 
   [A var() cycle between a two unregistered properties is handled correctly.]
     expected: FAIL
 
   [A var() cycle between a syntax:'*' property and an unregistered property is handled correctly.]
     expected: FAIL
 
+  [Invalid at computed-value time triggers 'unset' behavior]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-transforms/perspective-transforms-equivalence.html.ini
@@ -0,0 +1,2 @@
+[perspective-transforms-equivalence.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-typed-om/set-var-reference-crash.html.ini
@@ -0,0 +1,4 @@
+[set-var-reference-crash.html]
+  [Do not crash when referencing a variable with CSSVariableReferenceValue]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-typed-om/the-stylepropertymap/computed/get-auto-min-size.html.ini
@@ -0,0 +1,19 @@
+[get-auto-min-size.html]
+  [An absolute grid-child computed StylePropertyMap.get reports the auto minimum size correctly.]
+    expected: FAIL
+
+  [An inflow grid-item computed StylePropertyMap.get reports the auto minimum size correctly.]
+    expected: FAIL
+
+  [An absolute flex-child computed StylePropertyMap.get reports the auto minimum size correctly.]
+    expected: FAIL
+
+  [An inflow flex-item computed StylePropertyMap.get reports the auto minimum size correctly.]
+    expected: FAIL
+
+  [An absolute block computed StylePropertyMap.get reports the auto minimum size correctly.]
+    expected: FAIL
+
+  [An inflow block computed StylePropertyMap.get reports the auto minimum size correctly.]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/tcy-white-space-processing-001.html.ini
@@ -0,0 +1,2 @@
+[tcy-white-space-processing-001.html]
+  expected: FAIL
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001i.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001i.html.ini
@@ -1,14 +1,15 @@
 [text-orientation-script-001i.html]
   [Default orientation for vo=R]
     expected:
-      if (os == "win"): PASS
+      if (os == "win") and debug and (processor == "x86_64"): PASS
+      if (os == "win") and not debug: PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if (os == "win"): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001m.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001m.html.ini
@@ -1,12 +1,13 @@
 [text-orientation-script-001m.html]
+  max-asserts: 2
   [Default orientation for vo=U]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if (os == "win"): PASS
+      if os == "win": PASS
       FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-001.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-001.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-002.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-002.html]
+  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-006.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[wm-propagation-body-006.xht]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-008.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[wm-propagation-body-008.xht]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-010.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[wm-propagation-body-010.xht]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-011.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[wm-propagation-body-011.xht]
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-015.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[wm-propagation-body-015.xht]
-  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-032.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-032.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-033.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-033.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-034.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-034.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-035.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-035.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-036.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-036.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-037.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-037.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-038.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-038.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-039.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-039.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-040.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-040.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-041.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-041.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-042.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-042.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-043.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-043.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-044.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-044.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-045.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-045.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-046.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-046.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-047.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-047.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-048.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-048.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-049.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-049.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-050.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-050.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-051.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-051.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-052.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-052.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-053.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-053.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-054.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-054.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/wm-propagation-body-055.html.ini
@@ -0,0 +1,2 @@
+[wm-propagation-body-055.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/cssom-view/scrollIntoView-sideways-lr-writing-mode-and-rtl-direction.html.ini
@@ -0,0 +1,23 @@
+[scrollIntoView-sideways-lr-writing-mode-and-rtl-direction.html]
+  [scrollIntoView({"block":"center","inline":"center"})]
+    expected:
+      if os == "android": FAIL
+
+  [scrollIntoView({"block":"end","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"start","inline":"center"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"center","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"end","inline":"center"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"start","inline":"end"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"center","inline":"end"})]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/cssom-view/scrollIntoView-sideways-lr-writing-mode.html.ini
@@ -0,0 +1,29 @@
+[scrollIntoView-sideways-lr-writing-mode.html]
+  [scrollIntoView({"block":"center","inline":"center"})]
+    expected:
+      if os == "android": FAIL
+
+  [scrollIntoView({"block":"end","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"start","inline":"center"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"center","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"start","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"end","inline":"center"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"end","inline":"end"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"start","inline":"end"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"center","inline":"end"})]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/cssom-view/scrollIntoView-sideways-rl-writing-mode-and-rtl-direction.html.ini
@@ -0,0 +1,23 @@
+[scrollIntoView-sideways-rl-writing-mode-and-rtl-direction.html]
+  [scrollIntoView({"block":"center","inline":"center"})]
+    expected:
+      if os == "android": FAIL
+
+  [scrollIntoView({"block":"start","inline":"center"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"center","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"start","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"end","inline":"center"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"end","inline":"end"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"center","inline":"end"})]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/cssom-view/scrollIntoView-sideways-rl-writing-mode.html.ini
@@ -0,0 +1,29 @@
+[scrollIntoView-sideways-rl-writing-mode.html]
+  [scrollIntoView({"block":"center","inline":"center"})]
+    expected:
+      if os == "android": FAIL
+
+  [scrollIntoView({"block":"end","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"start","inline":"center"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"center","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"start","inline":"start"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"end","inline":"center"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"end","inline":"end"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"start","inline":"end"})]
+    expected: FAIL
+
+  [scrollIntoView({"block":"center","inline":"end"})]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/element-timing/element-only-when-fully-active.html.ini
@@ -0,0 +1,5 @@
+[element-only-when-fully-active.html]
+  expected: TIMEOUT
+  [Only expose element attribute for fully active documents]
+    expected: NOTRUN
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/element-timing/fixed-id-identifier.html.ini
@@ -0,0 +1,4 @@
+[fixed-id-identifier.html]
+  [PerformanceElementTiming id and identifier do not change when Element changes.]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/element-timing/idlharness.window.js.ini
@@ -0,0 +1,49 @@
+[idlharness.window.html]
+  [PerformanceElementTiming interface: attribute intersectionRect]
+    expected: FAIL
+
+  [PerformanceElementTiming interface object length]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: attribute identifier]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: attribute loadTime]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: existence and properties of interface object]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: attribute naturalWidth]
+    expected: FAIL
+
+  [PerformanceElementTiming interface object name]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: attribute id]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: attribute element]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: attribute naturalHeight]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: attribute url]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: attribute renderTime]
+    expected: FAIL
+
+  [Element interface: attribute elementTiming]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [PerformanceElementTiming interface: existence and properties of interface prototype object]
+    expected: FAIL
+
--- a/testing/web-platform/meta/encrypted-media/__dir__.ini
+++ b/testing/web-platform/meta/encrypted-media/__dir__.ini
@@ -1,4 +1,3 @@
 prefs: [dom.security.featurePolicy.enabled:true, dom.security.featurePolicy.header.enabled:true, dom.security.featurePolicy.webidl.enabled:true]
 lsan-allowed: [Alloc, CreateCDMProxy, MakeUnique, Malloc, NewPage, Realloc, mozilla::EMEDecryptor::EMEDecryptor, mozilla::SchedulerGroup::CreateEventTargetFor, mozilla::dom::MediaKeys::CreateCDMProxy, mozilla::dom::ContentChild::GetConstructedEventTarget]
 leak-threshold: [default:51200]
-
--- a/testing/web-platform/meta/fetch/sec-metadata/redirect/__dir__.ini
+++ b/testing/web-platform/meta/fetch/sec-metadata/redirect/__dir__.ini
@@ -1,2 +1,2 @@
-lsan-allowed: [Alloc, Create, Malloc, Realloc, mozilla::BasePrincipal::CreateContentPrincipal, mozilla::SchedulerGroup::CreateEventTargetFor, mozilla::WeakPtr, mozilla::net::CookieSettings::Create, mozilla::net::nsStandardURL::TemplatedMutator, nsNodeSupportsWeakRefTearoff::GetWeakReference, nsPrefetchService::EnqueueURI]
+lsan-allowed: [Alloc, Create, Malloc, Realloc, mozilla::BasePrincipal::CreateContentPrincipal, mozilla::SchedulerGroup::CreateEventTargetFor, mozilla::WeakPtr, mozilla::dom::Link::TryDNSPrefetchOrPreconnectOrPrefetchOrPreloadOrPrerender, mozilla::net::CookieSettings::Create, mozilla::net::nsStandardURL::TemplatedMutator, nsNodeSupportsWeakRefTearoff::GetWeakReference, nsPrefetchService::EnqueueURI]
 leak-threshold: [tab:51200]
--- a/testing/web-platform/meta/fetch/sec-metadata/redirect/redirect-https-downgrade.tentative.sub.html.ini
+++ b/testing/web-platform/meta/fetch/sec-metadata/redirect/redirect-https-downgrade.tentative.sub.html.ini
@@ -2,19 +2,20 @@
   expected: TIMEOUT
   [Https downgrade track => No headers]
     expected: NOTRUN
 
   [Https downgrade font => No headers]
     expected: NOTRUN
 
   [Https downgrade prefetch => No headers]
+    bug: [https://bugzilla.mozilla.org/show_bug.cgi?id=1568717, https://bugzilla.mozilla.org/show_bug.cgi?id=1569098]
     expected:
       if os == "android": PASS
-      [FAIL, TIMEOUT, PASS]
-    bug: [https://bugzilla.mozilla.org/show_bug.cgi?id=1568717, https://bugzilla.mozilla.org/show_bug.cgi?id=1569098]
+      if (os == "linux") and debug and webrender: TIMEOUT
+      FAIL
 
   [Https downgrade stylesheet => No headers]
     expected: TIMEOUT
 
   [Https downgrade image => No headers]
     expected: NOTRUN
 
--- a/testing/web-platform/meta/html/cross-origin-opener/new_window_same_origin.tentative.html.ini
+++ b/testing/web-platform/meta/html/cross-origin-opener/new_window_same_origin.tentative.html.ini
@@ -1,12 +1,12 @@
 [new_window_same_origin.tentative.html]
   expected:
-    if (os == "mac") and debug: ["OK", "ERROR"]
-    if (os == "linux") and sw-e10s: ["OK", "TIMEOUT"]
+    if (os == "mac") and debug: [OK, ERROR]
+    if (os == "linux") and sw-e10s: [OK, TIMEOUT]
   [same-origin document opening popup to http://www1.web-platform.test:8000 with COOP: "same-site unsafe-allow-outgoing"]
     expected:
       if os == "android": FAIL
 
   [same-origin document opening popup to http://web-platform.test:8000 with COOP: "same-origin unsafe-allow-outgoing"]
     expected:
       if os == "android": FAIL
 
--- a/testing/web-platform/meta/html/dom/interfaces.https.html.ini
+++ b/testing/web-platform/meta/html/dom/interfaces.https.html.ini
@@ -102,16 +102,28 @@ prefs: [dom.security.featurePolicy.enabl
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "onformdata" with the proper type]
     expected: FAIL
 
   [Document interface: attribute onformdata]
     expected: FAIL
 
+  [Document interface: documentWithHandlers must inherit property "onsecuritypolicyviolation" with the proper type]
+    expected: FAIL
+
+  [Document interface: documentWithHandlers must inherit property "onformdata" with the proper type]
+    expected: FAIL
+
+  [Document interface: documentWithHandlers must inherit property "all" with the proper type]
+    expected: FAIL
+
+  [Document interface: documentWithHandlers must inherit property "oncancel" with the proper type]
+    expected: FAIL
+
 
 [interfaces.https.html?include=HTML.*]
   [HTMLAllCollection must be primary interface of document.all]
     expected: FAIL
 
   [Stringification of document.all]
     expected: FAIL
 
@@ -272,19 +284,16 @@ prefs: [dom.security.featurePolicy.enabl
     expected: FAIL
 
   [HTMLInputElement interface: createInput("radio") must inherit property "dirName" with the proper type]
     expected: FAIL
 
   [HTMLInputElement interface: createInput("file") must inherit property "dirName" with the proper type]
     expected: FAIL
 
-  [HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type]
-    expected: FAIL
-
   [HTMLInputElement interface: createInput("submit") must inherit property "dirName" with the proper type]
     expected: FAIL
 
   [HTMLInputElement interface: createInput("image") must inherit property "dirName" with the proper type]
     expected: FAIL
 
   [HTMLInputElement interface: createInput("reset") must inherit property "dirName" with the proper type]
     expected: FAIL
@@ -1156,17 +1165,17 @@ prefs: [dom.security.featurePolicy.enabl
     expected: FAIL
 
   [SVGSVGElement interface: attribute onunload]
     expected: FAIL
 
   [SVGAElement interface: attribute port]
     expected: FAIL
 
-  [SVGSVGElement interface: attribute onpopstate]
+  [SVGSVGElement interface: attribute onbeforeunload]
     expected: FAIL
 
   [SVGSVGElement interface: attribute onmessageerror]
     expected: FAIL
 
   [SVGSVGElement interface: attribute onmessage]
     expected: FAIL
 
@@ -1189,31 +1198,31 @@ prefs: [dom.security.featurePolicy.enabl
     expected: FAIL
 
   [SVGSVGElement interface: attribute onhashchange]
     expected: FAIL
 
   [SVGAElement interface: attribute origin]
     expected: FAIL
 
-  [SVGSVGElement interface: attribute onbeforeunload]
+  [SVGSVGElement interface: attribute onpopstate]
+    expected: FAIL
+
+  [SVGSVGElement interface: attribute onpagehide]
     expected: FAIL
 
   [SVGSVGElement interface: attribute onafterprint]
     expected: FAIL
 
   [SVGSVGElement interface: attribute ononline]
     expected: FAIL
 
   [SVGAElement interface: attribute href]
     expected: FAIL
 
-  [SVGSVGElement interface: attribute onpagehide]
-    expected: FAIL
-
   [SVGAElement interface: attribute password]
     expected: FAIL
 
   [SVGAElement interface: attribute username]
     expected: FAIL
 
   [SVGElement interface: attribute onformdata]
     expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/largest-contentful-paint/element-only-when-fully-active.html.ini
@@ -0,0 +1,5 @@
+[element-only-when-fully-active.html]
+  expected: TIMEOUT
+  [Only expose element attribute for fully active documents]
+    expected: NOTRUN
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/largest-contentful-paint/idlharness.html.ini
@@ -0,0 +1,64 @@
+[idlharness.html]
+  [LargestContentfulPaint interface: lcp must inherit property "loadTime" with the proper type]
+    expected: FAIL
+
+  [LargestContentfulPaint interface object length]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: lcp must inherit property "id" with the proper type]
+    expected: FAIL
+
+  [idl_test setup]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: attribute size]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: lcp must inherit property "size" with the proper type]
+    expected: FAIL
+
+  [LargestContentfulPaint must be primary interface of lcp]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: existence and properties of interface object]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: attribute renderTime]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: attribute url]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: attribute id]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: lcp must inherit property "renderTime" with the proper type]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: lcp must inherit property "url" with the proper type]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: lcp must inherit property "element" with the proper type]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [LargestContentfulPaint interface object name]
+    expected: FAIL
+
+  [Stringification of lcp]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: attribute loadTime]
+    expected: FAIL
+
+  [LargestContentfulPaint interface: attribute element]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/largest-contentful-paint/image-TAO.sub.html.ini
@@ -0,0 +1,4 @@
+[image-TAO.sub.html]
+  [Cross-origin elements with valid TAO have correct renderTime, with invalid TAO have renderTime set to 0.]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/largest-contentful-paint/observe-after-untrusted-scroll.html.ini
@@ -0,0 +1,7 @@
+[observe-after-untrusted-scroll.html]
+  [Same-origin image is observable.]
+    expected: FAIL
+
+  [Same-origin image after a JS initiated scroll event is observable.]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/layout-instability/idlharness.window.js.ini
@@ -0,0 +1,28 @@
+[idlharness.window.html]
+  [LayoutShift interface object name]
+    expected: FAIL
+
+  [LayoutShift interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [LayoutShift interface: attribute value]
+    expected: FAIL
+
+  [LayoutShift interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [LayoutShift interface: existence and properties of interface object]
+    expected: FAIL
+
+  [LayoutShift interface: attribute lastInputTime]
+    expected: FAIL
+
+  [LayoutShift interface object length]
+    expected: FAIL
+
+  [LayoutShift interface: attribute hadRecentInput]
+    expected: FAIL
+
+  [LayoutShift interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
--- a/testing/web-platform/meta/longtask-timing/idlharness.window.js.ini
+++ b/testing/web-platform/meta/longtask-timing/idlharness.window.js.ini
@@ -54,11 +54,14 @@
     expected: FAIL
 
   [TaskAttributionTiming interface: operation toJSON()]
     expected: FAIL
 
   [idl_test setup]
     expected: FAIL
 
+  [TaskAttributionTiming interface: operation toJSON()]
+    expected: FAIL
+
   [PerformanceLongTaskTiming interface: operation toJSON()]
     expected: FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/presentation-markup/fractions/frac-numalign-denomalign-001.html.ini
@@ -0,0 +1,2 @@
+[frac-numalign-denomalign-001.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/presentation-markup/operators/embellished-operator-001.html.ini
@@ -0,0 +1,25 @@
+[embellished-operator-001.html]
+  [mphantom (not embellished operator)]
+    expected: FAIL
+
+  [mpadded (embellished operator)]
+    expected: FAIL
+
+  [mstyle (not embellished operator)]
+    expected: FAIL
+
+  [mstyle (embellished operator)]
+    expected: FAIL
+
+  [mrow (not embellished operator)]
+    expected: FAIL
+
+  [mrow (embellished operator)]
+    expected: FAIL
+
+  [mpadded (not embellished operator)]
+    expected: FAIL
+
+  [mphantom (embellished operator)]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/presentation-markup/operators/embellished-operator-002.html.ini
@@ -0,0 +1,31 @@
+[embellished-operator-002.html]
+  [mmultiscripts (embellished operator)]
+    expected: FAIL
+
+  [munderover (embellished operator)]
+    expected: FAIL
+
+  [msub (embellished operator)]
+    expected: FAIL
+
+  [munder (embellished operator)]
+    expected: FAIL
+
+  [mover (embellished operator)]
+    expected: FAIL
+
+  [msubsup (embellished operator)]
+    expected: FAIL
+
+  [mfrac (embellished operator)]
+    expected: FAIL
+
+  [maction (embellished operator)]
+    expected: FAIL
+
+  [msup (embellished operator)]
+    expected: FAIL
+
+  [semantics (embellished operator)]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/mathml/presentation-markup/operators/mo-movablelimits.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[mo-movablelimits.html]
-  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/presentation-markup/spaces/space-like-003.html.ini
@@ -0,0 +1,8 @@
+[space-like-003.html]
+  [mi is not space-like]
+    expected:
+      if os == "android": FAIL
+
+  [merror is not space-like]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/attribute-mapping-001.html.ini
@@ -0,0 +1,220 @@
+[attribute-mapping-001.html]
+  [mathsize on the msub element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the msup element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the mstyle element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the math element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the munder element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the munderover element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the maction element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mi element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathcolor on the mmultiscripts element is mapped to CSS color]
+    expected: FAIL
+
+  [dir on the mover element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the mtable element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mn element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the msqrt element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mtr element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the msqrt element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mrow element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mfrac element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the munder element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mtr element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the annotation-xml element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the none element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the merror element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathcolor on the annotation element is mapped to CSS color]
+    expected: FAIL
+
+  [dir on the mfrac element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the menclose element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mroot element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the munderover element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathcolor on the merror element is mapped to CSS color]
+    expected: FAIL
+
+  [mathsize on the msubsup element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the mtd element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the mprescripts element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the maction element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the annotation-xml element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the ms element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the mstyle element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mtext element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mspace element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mphantom element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathbackground on the annotation element is mapped to CSS background-color]
+    expected: FAIL
+
+  [dir on the annotation element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the none element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mrow element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the menclose element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the mspace element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the mroot element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mo element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mprescripts element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the math element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mover element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mtd element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the merror element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathbackground on the mmultiscripts element is mapped to CSS background-color]
+    expected: FAIL
+
+  [dir on the msub element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathbackground on the annotation-xml element is mapped to CSS background-color]
+    expected: FAIL
+
+  [mathsize on the mmultiscripts element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the mmultiscripts element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mi element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mn element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the msup element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mphantom element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathcolor on the annotation-xml element is mapped to CSS color]
+    expected: FAIL
+
+  [mathsize on the mo element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the msubsup element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the mtext element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the ms element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the mpadded element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathsize on the annotation element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathsize on the mpadded element is mapped to CSS font-size]
+    expected: FAIL
+
+  [dir on the mtable element is mapped to CSS direction]
+    expected: FAIL
+
+  [dir on the semantics element is mapped to CSS direction]
+    expected: FAIL
+
+  [mathcolor on the semantics element is mapped to CSS color]
+    expected: FAIL
+
+  [mathsize on the semantics element is mapped to CSS font-size]
+    expected: FAIL
+
+  [mathbackground on the semantics element is mapped to CSS background-color]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/attribute-mapping-002.html.ini
@@ -0,0 +1,289 @@
+[attribute-mapping-002.html]
+  [displaystyle on the mphantom element is mapped to CSS math-style]
+    expected: FAIL
+
+  [scriptlevel on the munder element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the menclose element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [displaystyle on the mspace element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the mtd element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the munderover element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the merror element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the maction element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the munderover element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the msup element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the msub element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the munder element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the mrow element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the msqrt element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the mo element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the ms element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the mtr element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the munderover element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [displaystyle on the mtr element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the annotation element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the mtd element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the mo element is mapped to CSS math-style]
+    expected: FAIL
+
+  [scriptlevel on the mtable element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [displaystyle on the maction element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the mpadded element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the msqrt element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the mstyle element is mapped to CSS math-style]
+    expected: FAIL
+
+  [scriptlevel on the mn element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the mprescripts element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the mo element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the annotation element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the menclose element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the merror element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the menclose element is mapped to CSS math-style]
+    expected: FAIL
+
+  [scriptlevel on the ms element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the mspace element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the mover element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the msup element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the mphantom element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the mover element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the mi element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the mtext element is mapped to CSS math-style]
+    expected: FAIL
+
+  [scriptlevel on the mmultiscripts element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the msubsup element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the merror element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the msubsup element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [displaystyle on the munder element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the msub element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the mtd element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the mtable element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the mfrac element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the none element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the mmultiscripts element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the mn element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the mi element is mapped to CSS math-style]
+    expected: FAIL
+
+  [scriptlevel on the mroot element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the mtext element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the mtr element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the mprescripts element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [displaystyle on the math element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the mmultiscripts element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the annotation-xml element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the mstyle element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the mtext element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the mphantom element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the mfrac element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the mpadded element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [displaystyle on the mfrac element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the msubsup element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the mrow element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the mtable element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the annotation-xml element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the none element is mapped to CSS math-style]
+    expected: FAIL
+
+  [scriptlevel on the msub element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the mrow element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the none element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the mroot element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the math element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the math element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [displaystyle on the mover element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the mspace element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the msqrt element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the mroot element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the mprescripts element is mapped to CSS math-style]
+    expected: FAIL
+
+  [scriptlevel on the maction element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [mathvariant on the mn element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [mathvariant on the msup element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the mpadded element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the ms element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [displaystyle on the annotation-xml element is mapped to CSS math-style]
+    expected: FAIL
+
+  [displaystyle on the annotation element is mapped to CSS math-style]
+    expected: FAIL
+
+  [scriptlevel on the mstyle element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [scriptlevel on the mi element is mapped to CSS math-script-level]
+    expected: FAIL
+
+  [displaystyle on the semantics element is mapped to CSS math-style]
+    expected: FAIL
+
+  [mathvariant on the semantics element is mapped to CSS text-transform]
+    expected: FAIL
+
+  [scriptlevel on the semantics element is mapped to CSS math-script-level]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/color-001.html.ini
@@ -0,0 +1,3 @@
+[color-001.html]
+  expected:
+    if webrender and (os == "win"): FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/color-002.html.ini
@@ -0,0 +1,3 @@
+[color-002.html]
+  expected:
+    if webrender and (os == "win"): FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/color-003.html.ini
@@ -0,0 +1,3 @@
+[color-003.html]
+  expected:
+    if webrender and (os == "win"): FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/color-004.html.ini
@@ -0,0 +1,5 @@
+[color-004.html]
+  expected:
+    if (os == "win") and not webrender: PASS
+    if os == "android": PASS
+    FAIL
deleted file mode 100644
--- a/testing/web-platform/meta/mathml/relations/css-styling/color-1.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[color-1.html]
-  expected:
-    if (os == "linux") and not debug and webrender: "FAIL"
-    if (os == "linux") and debug and webrender: "FAIL"
-    if os == "win": "FAIL"
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/displaystyle-2.html.ini
@@ -0,0 +1,22 @@
+[displaystyle-2.html]
+  [msubsup element]
+    expected: FAIL
+
+  [munderover element]
+    expected: FAIL
+
+  [munder element]
+    expected: FAIL
+
+  [msup element]
+    expected: FAIL
+
+  [msub element]
+    expected: FAIL
+
+  [mroot element]
+    expected: FAIL
+
+  [mover element]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/mathsize-attribute-legacy-values.html.ini
@@ -0,0 +1,2 @@
+[mathsize-attribute-legacy-values.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/padding-border-margin/border-001.html.ini
@@ -0,0 +1,19 @@
+[border-001.html]
+  [Border properties on mrow (logical, shorthand)]
+    expected: FAIL
+
+  [Border properties on mrow (shorthand)]
+    expected: FAIL
+
+  [Border properties on mrow (logical)]
+    expected: FAIL
+
+  [Border properties on mrow]
+    expected: FAIL
+
+  [Border properties on mrow (logical, rtl)]
+    expected: FAIL
+
+  [Border properties on mrow (rtl)]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/padding-border-margin/border-002.html.ini
@@ -0,0 +1,148 @@
+[border-002.html]
+  [Border properties on mspace]
+    expected: FAIL
+
+  [Border properties on mmultiscripts]
+    expected: FAIL
+
+  [Border properties on mn]
+    expected: FAIL
+
+  [Border properties on msup]
+    expected: FAIL
+
+  [Border properties on msubsup]
+    expected: FAIL
+
+  [Border properties on msub]
+    expected: FAIL
+
+  [Border properties on merror]
+    expected: FAIL
+
+  [Border properties on menclose]
+    expected: FAIL
+
+  [Border properties on msqrt]
+    expected: FAIL
+
+  [Border properties on mstyle]
+    expected: FAIL
+
+  [Border properties on maction]
+    expected: FAIL
+
+  [Border properties on munder]
+    expected: FAIL
+
+  [Border properties on mpadded]
+    expected: FAIL
+
+  [Border properties on mroot]
+    expected: FAIL
+
+  [Border properties on mi]
+    expected: FAIL
+
+  [Border properties on mphantom]
+    expected: FAIL
+
+  [Border properties on mrow]
+    expected: FAIL
+
+  [Border properties on mo]
+    expected: FAIL
+
+  [Border properties on ms]
+    expected: FAIL
+
+  [Border properties on munderover]
+    expected: FAIL
+
+  [Border properties on mtable]
+    expected: FAIL
+
+  [Border properties on semantics]
+    expected: FAIL
+
+  [Border properties on mtext]
+    expected: FAIL
+
+  [Border properties on mfrac]
+    expected: FAIL
+
+  [Border properties on mover]
+    expected: FAIL
+
+  [Border properties on msup (rtl)]
+    expected: FAIL
+
+  [Border properties on msub (rtl)]
+    expected: FAIL
+
+  [Border properties on mmultiscripts (rtl)]
+    expected: FAIL
+
+  [Border properties on mover (rtl)]
+    expected: FAIL
+
+  [Border properties on munderover (rtl)]
+    expected: FAIL
+
+  [Border properties on munder (rtl)]
+    expected: FAIL
+
+  [Border properties on msqrt (rtl)]
+    expected: FAIL
+
+  [Border properties on mrow (rtl)]
+    expected: FAIL
+
+  [Border properties on ms (rtl)]
+    expected: FAIL
+
+  [Border properties on mi (rtl)]
+    expected: FAIL
+
+  [Border properties on mfrac (rtl)]
+    expected: FAIL
+
+  [Border properties on mo (rtl)]
+    expected: FAIL
+
+  [Border properties on mroot (rtl)]
+    expected: FAIL
+
+  [Border properties on mphantom (rtl)]
+    expected: FAIL
+
+  [Border properties on maction (rtl)]
+    expected: FAIL
+
+  [Border properties on mtext (rtl)]
+    expected: FAIL
+
+  [Border properties on semantics (rtl)]
+    expected: FAIL
+
+  [Border properties on mtable (rtl)]
+    expected: FAIL
+
+  [Border properties on menclose (rtl)]
+    expected: FAIL
+
+  [Border properties on mstyle (rtl)]
+    expected: FAIL
+
+  [Border properties on msubsup (rtl)]
+    expected: FAIL
+
+  [Border properties on mpadded (rtl)]
+    expected: FAIL
+
+  [Border properties on mn (rtl)]
+    expected: FAIL
+
+  [Border properties on merror (rtl)]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/padding-border-margin/margin-001.html.ini
@@ -0,0 +1,19 @@
+[margin-001.html]
+  [Margin properties on mrow (logical, shorthand)]
+    expected: FAIL
+
+  [Margin properties on mrow (shorthand)]
+    expected: FAIL
+
+  [Margin properties on mrow (logical)]
+    expected: FAIL
+
+  [Margin properties on mrow]
+    expected: FAIL
+
+  [Margin properties on mrow (logical, rtl)]
+    expected: FAIL
+
+  [Margin properties on mrow (rtl)]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/padding-border-margin/margin-002.html.ini
@@ -0,0 +1,220 @@
+[margin-002.html]
+  [Margin properties on msup]
+    expected: FAIL
+
+  [Margin properties on msubsup]
+    expected: FAIL
+
+  [Margin properties on msub]
+    expected: FAIL
+
+  [Margin properties on merror]
+    expected: FAIL
+
+  [Margin properties on menclose]
+    expected: FAIL
+
+  [Margin properties on msqrt]
+    expected: FAIL
+
+  [Margin properties on mstyle]
+    expected: FAIL
+
+  [Margin properties on mmultiscripts]
+    expected: FAIL
+
+  [Margin properties on maction]
+    expected: FAIL
+
+  [Margin properties on munder]
+    expected: FAIL
+
+  [Margin properties on mpadded]
+    expected: FAIL
+
+  [Margin properties on mroot]
+    expected: FAIL
+
+  [Margin properties on mi]
+    expected: FAIL
+
+  [Margin properties on mphantom]
+    expected: FAIL
+
+  [Margin properties on mrow]
+    expected: FAIL
+
+  [Margin properties on mo]
+    expected: FAIL
+
+  [Margin properties on ms]
+    expected: FAIL
+
+  [Margin properties on munderover]
+    expected: FAIL
+
+  [Margin properties on mn]
+    expected: FAIL
+
+  [Margin properties on mtable]
+    expected: FAIL
+
+  [Margin properties on semantics]
+    expected: FAIL
+
+  [Margin properties on mtext]
+    expected: FAIL
+
+  [Margin properties on mfrac]
+    expected: FAIL
+
+  [Margin properties on mspace]
+    expected: FAIL
+
+  [Margin properties on mover]
+    expected: FAIL
+
+  [Margin properties on menclose (rtl)]
+    expected: FAIL
+
+  [Margin properties on mo (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mi (rtl)]
+    expected: FAIL
+
+  [Margin properties on maction (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on msubsup (rtl)]
+    expected: FAIL
+
+  [Margin properties on mtable (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on msubsup (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mphantom (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on munder (rtl)]
+    expected: FAIL
+
+  [Margin properties on mo (rtl)]
+    expected: FAIL
+
+  [Margin properties on semantics (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on merror (rtl)]
+    expected: FAIL
+
+  [Margin properties on mtext (rtl)]
+    expected: FAIL
+
+  [Margin properties on msqrt (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mtext (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mmultiscripts (rtl)]
+    expected: FAIL
+
+  [Margin properties on ms (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mover (rtl)]
+    expected: FAIL
+
+  [Margin properties on msqrt (rtl)]
+    expected: FAIL
+
+  [Margin properties on menclose (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mpadded (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on merror (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on msup (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on munderover (rtl)]
+    expected: FAIL
+
+  [Margin properties on mfrac (rtl)]
+    expected: FAIL
+
+  [Margin properties on mover (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mstyle (rtl)]
+    expected: FAIL
+
+  [Margin properties on munderover (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mpadded (rtl)]
+    expected: FAIL
+
+  [Margin properties on mn (rtl)]
+    expected: FAIL
+
+  [Margin properties on mmultiscripts (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mrow (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on msub (rtl)]
+    expected: FAIL
+
+  [Margin properties on msup (rtl)]
+    expected: FAIL
+
+  [Margin properties on mroot (rtl)]
+    expected: FAIL
+
+  [Margin properties on mphantom (rtl)]
+    expected: FAIL
+
+  [Margin properties on mroot (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on maction (rtl)]
+    expected: FAIL
+
+  [Margin properties on mstyle (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on semantics (rtl)]
+    expected: FAIL
+
+  [Margin properties on mtable (rtl)]
+    expected: FAIL
+
+  [Margin properties on mn (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on munder (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mfrac (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on mrow (rtl)]
+    expected: FAIL
+
+  [Margin properties on msub (no margin-collapsing)]
+    expected: FAIL
+
+  [Margin properties on ms (rtl)]
+    expected: FAIL
+
+  [Margin properties on mi (no margin-collapsing)]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/padding-border-margin/padding-001.html.ini
@@ -0,0 +1,19 @@
+[padding-001.html]
+  [Padding properties on mrow (shorthand)]
+    expected: FAIL
+
+  [Padding properties on mrow (logical, shorthand)]
+    expected: FAIL
+
+  [Padding properties on mrow]
+    expected: FAIL
+
+  [Padding properties on mrow (logical)]
+    expected: FAIL
+
+  [Padding properties on mrow (rtl)]
+    expected: FAIL
+
+  [Padding properties on mrow (logical, rtl)]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/padding-border-margin/padding-002.html.ini
@@ -0,0 +1,148 @@
+[padding-002.html]
+  [Padding properties on mphantom]
+    expected: FAIL
+
+  [Padding properties on mspace]
+    expected: FAIL
+
+  [Padding properties on mtext]
+    expected: FAIL
+
+  [Padding properties on ms]
+    expected: FAIL
+
+  [Padding properties on msqrt]
+    expected: FAIL
+
+  [Padding properties on menclose]
+    expected: FAIL
+
+  [Padding properties on merror]
+    expected: FAIL
+
+  [Padding properties on mstyle]
+    expected: FAIL
+
+  [Padding properties on semantics]
+    expected: FAIL
+
+  [Padding properties on mn]
+    expected: FAIL
+
+  [Padding properties on mo]
+    expected: FAIL
+
+  [Padding properties on mi]
+    expected: FAIL
+
+  [Padding properties on mroot]
+    expected: FAIL
+
+  [Padding properties on munder]
+    expected: FAIL
+
+  [Padding properties on maction]
+    expected: FAIL
+
+  [Padding properties on munderover]
+    expected: FAIL
+
+  [Padding properties on msubsup]
+    expected: FAIL
+
+  [Padding properties on mtable]
+    expected: FAIL
+
+  [Padding properties on msub]
+    expected: FAIL
+
+  [Padding properties on mfrac]
+    expected: FAIL
+
+  [Padding properties on mrow]
+    expected: FAIL
+
+  [Padding properties on mmultiscripts]
+    expected: FAIL
+
+  [Padding properties on msup]
+    expected: FAIL
+
+  [Padding properties on mover]
+    expected: FAIL
+
+  [Padding properties on mpadded]
+    expected: FAIL
+
+  [Padding properties on mtext (rtl)]
+    expected: FAIL
+
+  [Padding properties on semantics (rtl)]
+    expected: FAIL
+
+  [Padding properties on munder (rtl)]
+    expected: FAIL
+
+  [Padding properties on mo (rtl)]
+    expected: FAIL
+
+  [Padding properties on mroot (rtl)]
+    expected: FAIL
+
+  [Padding properties on mn (rtl)]
+    expected: FAIL
+
+  [Padding properties on mstyle (rtl)]
+    expected: FAIL
+
+  [Padding properties on merror (rtl)]
+    expected: FAIL
+
+  [Padding properties on msub (rtl)]
+    expected: FAIL
+
+  [Padding properties on mmultiscripts (rtl)]
+    expected: FAIL
+
+  [Padding properties on menclose (rtl)]
+    expected: FAIL
+
+  [Padding properties on msubsup (rtl)]
+    expected: FAIL
+
+  [Padding properties on msup (rtl)]
+    expected: FAIL
+
+  [Padding properties on mover (rtl)]
+    expected: FAIL
+
+  [Padding properties on mpadded (rtl)]
+    expected: FAIL
+
+  [Padding properties on mi (rtl)]
+    expected: FAIL
+
+  [Padding properties on maction (rtl)]
+    expected: FAIL
+
+  [Padding properties on ms (rtl)]
+    expected: FAIL
+
+  [Padding properties on mrow (rtl)]
+    expected: FAIL
+
+  [Padding properties on mphantom (rtl)]
+    expected: FAIL
+
+  [Padding properties on mtable (rtl)]
+    expected: FAIL
+
+  [Padding properties on mfrac (rtl)]
+    expected: FAIL
+
+  [Padding properties on msqrt (rtl)]
+    expected: FAIL
+
+  [Padding properties on munderover (rtl)]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/padding-border-margin/padding-border-margin-001.html.ini
@@ -0,0 +1,2 @@
+[padding-border-margin-001.html]
+  expected: FAIL
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/width-height-001.html.ini
@@ -0,0 +1,7 @@
+[width-height-001.html]
+  [inline-size and block-size properties on merror]
+    expected: FAIL
+
+  [width and height properties on merror]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/writing-mode/writing-mode-001.html.ini
@@ -0,0 +1,19 @@
+[writing-mode-001.html]
+  [Inheritance of CSS writing-mode and direction (id='vertical-rl_ltr')]
+    expected: FAIL
+
+  [Layout of mrow (id='vertical-lr_ltr')]
+    expected: FAIL
+
+  [Inheritance of CSS writing-mode and direction (id='vertical-lr_ltr')]
+    expected: FAIL
+
+  [Inheritance of CSS writing-mode and direction (id='vertical-lr_rtl')]
+    expected: FAIL
+
+  [Inheritance of CSS writing-mode and direction (id='vertical-rl_rtl')]
+    expected: FAIL
+
+  [Layout of mrow (id='vertical-rl_ltr')]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/css-styling/writing-mode/writing-mode-002.html.ini
@@ -0,0 +1,373 @@
+[writing-mode-002.html]
+  [Layout of mmultiscripts (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of merror (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of msubsup (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of merror (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mroot (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of munder (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mover (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mspace (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of msup (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mo (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msup (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mi (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of none (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of semantics (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtext (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mrow (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of ms (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mn (writing-mode: horizontal-tb; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of msqrt (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of munderover (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mpadded (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of merror (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mrow (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of ms (writing-mode: horizontal-tb; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mo (writing-mode: horizontal-tb; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mtext (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mtd (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mrow (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of maction (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mn (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of munderover (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msubsup (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtd (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mi (writing-mode: horizontal-tb; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mi (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msub (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mstyle (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mover (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of ms (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of menclose (writing-mode: horizontal-tb; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mspace (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mfrac (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mo (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mphantom (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of ms (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msqrt (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of maction (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mroot (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of semantics (writing-mode: horizontal-tb; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of maction (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msub (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mstyle (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mover (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of msqrt (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtext (writing-mode: horizontal-tb; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mmultiscripts (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtr (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of munder (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of none (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of none (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of semantics (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mstyle (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mmultiscripts (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mtable (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mstyle (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of menclose (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtext (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtd (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mpadded (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of merror (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mroot (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtr (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of munder (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mprescripts (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mspace (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mfrac (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mi (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mi (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of semantics (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mpadded (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtable (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mrow (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of munderover (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of maction (writing-mode: horizontal-tb; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of menclose (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mpadded (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mn (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mover (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msub (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of munderover (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mphantom (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mprescripts (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mo (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtable (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mphantom (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of msubsup (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mtd (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mo (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mn (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mmultiscripts (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mtr (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of munder (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mspace (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msup (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mfrac (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mphantom (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of menclose (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mtable (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msub (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mprescripts (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mprescripts (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of maction (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mroot (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mtext (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of ms (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mtr (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msqrt (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of msup (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of mn (writing-mode: vertical-rl; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of mfrac (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of msubsup (writing-mode: vertical-rl; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of menclose (writing-mode: vertical-lr; direction: ltr;)]
+    expected: FAIL
+
+  [Layout of none (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
+  [Layout of semantics (writing-mode: vertical-lr; direction: rtl;)]
+    expected: FAIL
+
--- a/testing/web-platform/meta/mediacapture-image/MediaStreamTrack-getConstraints-fast.html.ini
+++ b/testing/web-platform/meta/mediacapture-image/MediaStreamTrack-getConstraints-fast.html.ini
@@ -37,8 +37,14 @@
     expected: TIMEOUT
 
   [MediaStreamTrack-getConstraints-fast 12]
     expected: TIMEOUT
 
   [MediaStreamTrack-getConstraints-fast 13]
     expected: TIMEOUT
 
+  [MediaStreamTrack-getConstraints-fast 15]
+    expected: TIMEOUT
+
+  [MediaStreamTrack-getConstraints-fast 14]
+    expected: TIMEOUT
+
--- a/testing/web-platform/meta/mozilla-sync
+++ b/testing/web-platform/meta/mozilla-sync
@@ -1,2 +1,2 @@
-local: 350c9eedae9cde55812d238fca4307ac9a98a066
-upstream: 7896f18d8a953f518536307b4c05dae63dccf87e
+local: e6557bab79b19d41ebd1a831eb5d407a2de2e368
+upstream: 267642fb2bb4fb91b5c6c8c5f53dcfb3a3e761cd
--- a/testing/web-platform/meta/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js.ini
+++ b/testing/web-platform/meta/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js.ini
@@ -1,40 +1,40 @@
 [FileSystemBaseHandle-remove.tentative.https.window.html]
-  [Cleanup to setup test environment]
-    expected: FAIL
-
-  [remove() on an already removed file should fail]
-    expected: FAIL
-
-  [remove() to remove a file]
-    expected: FAIL
-
-  [remove() on a non-empty directory should fail]
-    expected: FAIL
-
-  [remove() to remove an empty directory]
-    expected: FAIL
-
   [removeEntry() on a non-empty directory should fail]
     expected: FAIL
 
   [removeEntry() with "." name should fail]
     expected: FAIL
 
   [removeEntry() on an already removed file should fail]
     expected: FAIL
 
   [removeEntry() with empty name should fail]
     expected: FAIL
 
+  [remove() on an already removed file should fail]
+    expected: FAIL
+
   [removeEntry() with a path separator should fail.]
     expected: FAIL
 
   [removeEntry() with ".." name should fail]
     expected: FAIL
 
+  [remove() to remove a file]
+    expected: FAIL
+
+  [Cleanup to setup test environment]
+    expected: FAIL
+
+  [remove() on a non-empty directory should fail]
+    expected: FAIL
+
   [removeEntry() to remove an empty directory]
     expected: FAIL
 
+  [remove() to remove an empty directory]
+    expected: FAIL
+
   [removeEntry() to remove a file]
     expected: FAIL
 
--- a/testing/web-platform/meta/native-file-system/FileSystemWriter.tentative.https.window.js.ini
+++ b/testing/web-platform/meta/native-file-system/FileSystemWriter.tentative.https.window.js.ini
@@ -1,40 +1,76 @@
 [FileSystemWriter.tentative.https.window.html]
+  [write() called with a blob and a valid offset]
+    expected: FAIL
+
+  [atomic writes: only one close() operation may succeed]
+    expected: FAIL
+
+  [atomic writes: close() fails when parent directory is removed]
+    expected: FAIL
+
+  [write() with a valid typed array buffer]
+    expected: FAIL
+
+  [write() with a valid utf-8 string]
+    expected: FAIL
+
+  [truncate() to grow a file]
+    expected: FAIL
+
   [write() with an empty blob to an empty file]
     expected: FAIL
 
   [write() with an empty array buffer to an empty file]
     expected: FAIL
 
-  [write() called with a blob and a valid offset]
+  [createWriter() fails when parent directory is removed]
+    expected: FAIL
+
+  [createWriter({keepExistingData: true}): atomic writer initialized with source contents]
+    expected: FAIL
+
+  [truncate() to shrink a file]
+    expected: FAIL
+
+  [atomic writes: close() after close() fails]
+    expected: FAIL
+
+  [atomic writes: writers make atomic changes on close]
+    expected: FAIL
+
+  [truncate() fails when parent directory is removed]
+    expected: FAIL
+
+  [write() a blob to an empty file]
+    expected: FAIL
+
+  [write() called with an invalid offset]
+    expected: FAIL
+
+  [atomic writes: truncate() after close() fails]
+    expected: FAIL
+
+  [createWriter({keepExistingData: false}): atomic writer initialized with empty file]
+    expected: FAIL
+
+  [write() fails when parent directory is removed]
     expected: FAIL
 
   [write() with an empty string to an empty file]
     expected: FAIL
 
+  [atomic writes: writer persists file on close, even if file is removed]
+    expected: FAIL
+
   [write() with a string with windows line ending preserved]
     expected: FAIL
 
-  [truncate() to shrink a file]
-    expected: FAIL
-
-  [write() a blob to an empty file]
-    expected: FAIL
-
-  [write() with a valid utf-8 string]
-    expected: FAIL
-
-  [write() called with an invalid offset]
+  [atomic writes: write() after close() fails]
     expected: FAIL
 
   [Cleanup to setup test environment]
     expected: FAIL
 
   [write() with a string with unix line ending preserved]
     expected: FAIL
 
-  [truncate() to grow a file]
-    expected: FAIL
-
-  [write() with a valid typed array buffer]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.js.ini
+++ /dev/null
@@ -1,40 +0,0 @@
-[NativeFileSystemWritableFileStream.tentative.https.window.html]
-  [write() with an empty blob to an empty file]
-    expected: FAIL
-
-  [write() with an empty array buffer to an empty file]
-    expected: FAIL
-
-  [write() called with a blob and a valid offset]
-    expected: FAIL
-
-  [write() with an empty string to an empty file]
-    expected: FAIL
-
-  [write() with a string with windows line ending preserved]
-    expected: FAIL
-
-  [truncate() to shrink a file]
-    expected: FAIL
-
-  [write() a blob to an empty file]
-    expected: FAIL
-
-  [write() with a valid utf-8 string]
-    expected: FAIL
-
-  [write() called with an invalid offset]
-    expected: FAIL
-
-  [Cleanup to setup test environment]
-    expected: FAIL
-
-  [write() with a string with unix line ending preserved]
-    expected: FAIL
-
-  [truncate() to grow a file]
-    expected: FAIL
-
-  [write() with a valid typed array buffer]
-    expected: FAIL
-
--- a/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy_with_pointerlock.html.ini
+++ b/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_movementxy_with_pointerlock.html.ini
@@ -1,5 +1,6 @@
 [pointerevent_movementxy_with_pointerlock.html]
   [mouse pointerevent movementX/Y with pointerlock test]
     expected:
       if (os == "android") and not e10s: FAIL
-      [PASS, FAIL]
+      if webrender and debug: FAIL
+
--- a/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_pointermove_in_pointerlock.html.ini
+++ b/testing/web-platform/meta/pointerevents/pointerlock/pointerevent_pointermove_in_pointerlock.html.ini
@@ -1,2 +1,5 @@
 [pointerevent_pointermove_in_pointerlock.html]
   expected: ERROR
+  [pointermove event received]
+    expected: NOTRUN
+
--- a/testing/web-platform/meta/secure-contexts/idlharness.any.js.ini
+++ b/testing/web-platform/meta/secure-contexts/idlharness.any.js.ini
@@ -2,12 +2,14 @@
   expected: TIMEOUT
 
 [idlharness.any.html]
   [WindowOrWorkerGlobalScope interface: self must inherit property "isSecureContext" with the proper type]
     expected: FAIL
 
 
 [idlharness.any.serviceworker.html]
+  expected:
+    if webrender and not debug: ["OK", "TIMEOUT"]
 
 [idlharness.any.sharedworker.html]
 
 [idlharness.any.worker.html]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/service-workers/service-worker/update-import-scripts.https.html.ini
@@ -0,0 +1,4 @@
+[update-import-scripts.https.html]
+  [update() should find an update in an imported script but update() should result in failure due to missing the other imported script.]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detected-boundingBox-read-only.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[detected-boundingBox-read-only.html]
-  [Barcode - detectedBarcode.boundingBox should be DOMRectReadOnly]
-    expected: FAIL
-
-  [Face - detectedFace.boundingBox should be DOMRectReadOnly]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detected-boundingBox-read-only.https.html.ini
@@ -0,0 +1,7 @@
+[detected-boundingBox-read-only.https.html]
+  [Barcode - detectedBarcode.boundingBox should be DOMRectReadOnly]
+    expected: FAIL
+
+  [Face - detectedFace.boundingBox should be DOMRectReadOnly]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-HTMLCanvasElement.html.ini
+++ /dev/null
@@ -1,13 +0,0 @@
-[detection-HTMLCanvasElement.html]
-  [Face - detect(HTMLCanvasElement)]
-    expected: FAIL
-
-  [Barcode - detect(OffscreenCanvas)]
-    expected: FAIL
-
-  [Barcode - detect(HTMLCanvasElement)]
-    expected: FAIL
-
-  [Face - detect(OffscreenCanvas)]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-HTMLCanvasElement.https.html.ini
@@ -0,0 +1,13 @@
+[detection-HTMLCanvasElement.https.html]
+  [Face - detect(HTMLCanvasElement)]
+    expected: FAIL
+
+  [Barcode - detect(OffscreenCanvas)]
+    expected: FAIL
+
+  [Barcode - detect(HTMLCanvasElement)]
+    expected: FAIL
+
+  [Face - detect(OffscreenCanvas)]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-HTMLImageElement.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[detection-HTMLImageElement.html]
-  [Face - detect(HTMLImageElement)]
-    expected: FAIL
-
-  [Barcode - detect(HTMLImageElement)]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-HTMLImageElement.https.html.ini
@@ -0,0 +1,7 @@
+[detection-HTMLImageElement.https.html]
+  [Face - detect(HTMLImageElement)]
+    expected: FAIL
+
+  [Barcode - detect(HTMLImageElement)]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-HTMLVideoElement.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[detection-HTMLVideoElement.html]
-  [Face - detect(HTMLVideoElement)]
-    expected: FAIL
-
-  [Barcode - detect(HTMLVideoElement)]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-HTMLVideoElement.https.html.ini
@@ -0,0 +1,7 @@
+[detection-HTMLVideoElement.https.html]
+  [Face - detect(HTMLVideoElement)]
+    expected: FAIL
+
+  [Barcode - detect(HTMLVideoElement)]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-ImageBitmap.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[detection-ImageBitmap.html]
-  [Face - detect(ImageBitmap)]
-    expected: FAIL
-
-  [Barcode - detect(ImageBitmap)]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-ImageBitmap.https.html.ini
@@ -0,0 +1,7 @@
+[detection-ImageBitmap.https.html]
+  [Face - detect(ImageBitmap)]
+    expected: FAIL
+
+  [Barcode - detect(ImageBitmap)]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-ImageData-detached.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[detection-ImageData-detached.html]
-  [BarcodeDetector.detect() rejects on a detached buffer]
-    expected: FAIL
-
-  [FaceDetector.detect() rejects on a detached buffer]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-ImageData-detached.https.html.ini
@@ -0,0 +1,7 @@
+[detection-ImageData-detached.https.html]
+  [BarcodeDetector.detect() rejects on a detached buffer]
+    expected: FAIL
+
+  [FaceDetector.detect() rejects on a detached buffer]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-ImageData.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[detection-ImageData.html]
-  [Face - detect(ImageData)]
-    expected: FAIL
-
-  [Barcode - detect(ImageData)]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-ImageData.https.html.ini
@@ -0,0 +1,7 @@
+[detection-ImageData.https.html]
+  [Face - detect(ImageData)]
+    expected: FAIL
+
+  [Barcode - detect(ImageData)]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-getSupportedFormats.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[detection-getSupportedFormats.html]
-  [get supported barcode formats]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-getSupportedFormats.https.html.ini
@@ -0,0 +1,4 @@
+[detection-getSupportedFormats.https.html]
+  [get supported barcode formats]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-on-worker.https.worker.js.ini
@@ -0,0 +1,7 @@
+[detection-on-worker.https.worker.html]
+  [Barcode Detector detect(ImageBitmap) on worker]
+    expected: FAIL
+
+  [Face Detector detect(ImageBitmap) on worker]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-on-worker.worker.js.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[detection-on-worker.worker.html]
-  [Barcode Detector detect(ImageBitmap) on worker]
-    expected: FAIL
-
-  [Face Detector detect(ImageBitmap) on worker]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-options.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[detection-options.html]
-  [Test that FaceDetectionOptions are correctly propagated]
-    expected: FAIL
-
-  [Test that BarcodeDetectorOptions are correctly propagated]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-options.https.html.ini
@@ -0,0 +1,7 @@
+[detection-options.https.html]
+  [Test that FaceDetectionOptions are correctly propagated]
+    expected: FAIL
+
+  [Test that BarcodeDetectorOptions are correctly propagated]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detection-security-test.html.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[detection-security-test.html]
-  expected: ERROR
-  [Barcode - detect(broken video)]
-    expected: NOTRUN
-
-  [Face - detect(broken image)]
-    expected: TIMEOUT
-
-  [Face - detect(broken video)]
-    expected: NOTRUN
-
-  [Barcode - detect(broken image)]
-    expected: NOTRUN
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detection-security-test.https.html.ini
@@ -0,0 +1,14 @@
+[detection-security-test.https.html]
+  expected: ERROR
+  [Barcode - detect(broken video)]
+    expected: NOTRUN
+
+  [Face - detect(broken image)]
+    expected: TIMEOUT
+
+  [Face - detect(broken video)]
+    expected: NOTRUN
+
+  [Barcode - detect(broken image)]
+    expected: NOTRUN
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/detector-same-object.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[detector-same-object.html]
-  [Face - detect(ImageData), [SameObject\]]
-    expected: FAIL
-
-  [Barcode - detect(ImageData), [SameObject\]]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/detector-same-object.https.html.ini
@@ -0,0 +1,7 @@
+[detector-same-object.https.html]
+  [Face - detect(ImageData), [SameObject\]]
+    expected: FAIL
+
+  [Barcode - detect(ImageData), [SameObject\]]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/idlharness.any.js.ini
+++ /dev/null
@@ -1,159 +0,0 @@
-[idlharness.any.html]
-  [FaceDetector interface: existence and properties of interface object]
-    expected: FAIL
-
-  [FaceDetector interface object length]
-    expected: FAIL
-
-  [FaceDetector interface object name]
-    expected: FAIL
-
-  [FaceDetector interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [FaceDetector interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [FaceDetector interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [FaceDetector interface: operation detect(ImageBitmapSource)]
-    expected: FAIL
-
-  [DetectedFace interface: existence and properties of interface object]
-    expected: FAIL
-
-  [DetectedFace interface object length]
-    expected: FAIL
-
-  [DetectedFace interface object name]
-    expected: FAIL
-
-  [DetectedFace interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [DetectedFace interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [DetectedFace interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [DetectedFace interface: attribute boundingBox]
-    expected: FAIL
-
-  [DetectedFace interface: attribute landmarks]
-    expected: FAIL
-
-  [BarcodeDetector interface: existence and properties of interface object]
-    expected: FAIL
-
-  [BarcodeDetector interface object length]
-    expected: FAIL
-
-  [BarcodeDetector interface object name]
-    expected: FAIL
-
-  [BarcodeDetector interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [BarcodeDetector interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [BarcodeDetector interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [BarcodeDetector interface: attribute supportedFormats]
-    expected: FAIL
-
-  [BarcodeDetector interface: operation detect(ImageBitmapSource)]
-    expected: FAIL
-
-  [DetectedBarcode interface: existence and properties of interface object]
-    expected: FAIL
-
-  [DetectedBarcode interface object length]
-    expected: FAIL
-
-  [DetectedBarcode interface object name]
-    expected: FAIL
-
-  [DetectedBarcode interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [DetectedBarcode interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [DetectedBarcode interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [DetectedBarcode interface: attribute boundingBox]
-    expected: FAIL
-
-  [DetectedBarcode interface: attribute rawValue]
-    expected: FAIL
-
-  [DetectedBarcode interface: attribute format]
-    expected: FAIL
-
-  [DetectedBarcode interface: attribute cornerPoints]
-    expected: FAIL
-
-  [BarcodeDetector interface: operation getSupportedFormats()]
-    expected: FAIL
-
-  [idl_test setup]
-    expected: FAIL
-
-
-[idlharness.any.worker.html]
-  [FaceDetector interface: existence and properties of interface object]
-    expected: FAIL
-
-  [FaceDetector interface object length]
-    expected: FAIL
-
-  [FaceDetector interface object name]
-    expected: FAIL
-
-  [FaceDetector interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [FaceDetector interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [FaceDetector interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [FaceDetector interface: operation detect(ImageBitmapSource)]
-    expected: FAIL
-
-  [BarcodeDetector interface: existence and properties of interface object]
-    expected: FAIL
-
-  [BarcodeDetector interface object length]
-    expected: FAIL
-
-  [BarcodeDetector interface object name]
-    expected: FAIL
-
-  [BarcodeDetector interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [BarcodeDetector interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [BarcodeDetector interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [BarcodeDetector interface: attribute supportedFormats]
-    expected: FAIL
-
-  [BarcodeDetector interface: operation detect(ImageBitmapSource)]
-    expected: FAIL
-
-  [BarcodeDetector interface: operation getSupportedFormats()]
-    expected: FAIL
-
-  [idl_test setup]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/idlharness.https.any.js.ini
@@ -0,0 +1,631 @@
+[idlharness.https.any.html]
+  [BarcodeDetector interface: operation detect(ImageBitmapSource)]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [DetectedBarcode interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [FaceDetector interface object length]
+    expected: FAIL
+
+  [DetectedBarcode interface object length]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface object]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BarcodeDetector interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface: attribute landmarks]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface object]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface object]
+    expected: FAIL
+
+  [DetectedFace interface: attribute boundingBox]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface object length]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute rawValue]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute format]
+    expected: FAIL
+
+  [FaceDetector interface: operation detect(ImageBitmapSource)]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute cornerPoints]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute boundingBox]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface object]
+    expected: FAIL
+
+  [FaceDetector interface object name]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BarcodeDetector interface: operation getSupportedFormats()]
+    expected: FAIL
+
+  [BarcodeDetector interface object length]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BarcodeDetector must be primary interface of barcodeDetector]
+    expected: FAIL
+
+  [DetectedFace interface: detectedFace must inherit property "landmarks" with the proper type]
+    expected: FAIL
+
+  [Stringification of detectedBarcode]
+    expected: FAIL
+
+  [Stringification of detectedFace]
+    expected: FAIL
+
+  [BarcodeDetector interface: barcodeDetector must inherit property "detect(ImageBitmapSource)" with the proper type]
+    expected: FAIL
+
+  [FaceDetector interface: calling detect(ImageBitmapSource) on faceDetector with too few arguments must throw TypeError]
+    expected: FAIL
+
+  [FaceDetector interface: faceDetector must inherit property "detect(ImageBitmapSource)" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "boundingBox" with the proper type]
+    expected: FAIL
+
+  [BarcodeDetector interface: calling detect(ImageBitmapSource) on barcodeDetector with too few arguments must throw TypeError]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "cornerPoints" with the proper type]
+    expected: FAIL
+
+  [DetectedFace interface: detectedFace must inherit property "boundingBox" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "format" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode must be primary interface of detectedBarcode]
+    expected: FAIL
+
+  [FaceDetector must be primary interface of faceDetector]
+    expected: FAIL
+
+  [BarcodeDetector interface: barcodeDetector must inherit property "getSupportedFormats()" with the proper type]
+    expected: FAIL
+
+  [Stringification of faceDetector]
+    expected: FAIL
+
+  [Stringification of barcodeDetector]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "rawValue" with the proper type]
+    expected: FAIL
+
+  [DetectedFace must be primary interface of detectedFace]
+    expected: FAIL
+
+
+[idlharness.https.any.worker.html]
+  [BarcodeDetector interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface object]
+    expected: FAIL
+
+  [FaceDetector interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BarcodeDetector interface: operation getSupportedFormats()]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface object]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [FaceDetector interface object length]
+    expected: FAIL
+
+  [FaceDetector interface: operation detect(ImageBitmapSource)]
+    expected: FAIL
+
+  [BarcodeDetector interface: operation detect(ImageBitmapSource)]
+    expected: FAIL
+
+  [BarcodeDetector interface object length]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [BarcodeDetector must be primary interface of barcodeDetector]
+    expected: FAIL
+
+  [DetectedFace interface: detectedFace must inherit property "landmarks" with the proper type]
+    expected: FAIL
+
+  [Stringification of detectedBarcode]
+    expected: FAIL
+
+  [Stringification of detectedFace]
+    expected: FAIL
+
+  [BarcodeDetector interface: barcodeDetector must inherit property "detect(ImageBitmapSource)" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface object length]
+    expected: FAIL
+
+  [FaceDetector interface: calling detect(ImageBitmapSource) on faceDetector with too few arguments must throw TypeError]
+    expected: FAIL
+
+  [DetectedBarcode interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: faceDetector must inherit property "detect(ImageBitmapSource)" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "boundingBox" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface object]
+    expected: FAIL
+
+  [DetectedFace interface: attribute landmarks]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BarcodeDetector interface: calling detect(ImageBitmapSource) on barcodeDetector with too few arguments must throw TypeError]
+    expected: FAIL
+
+  [DetectedFace interface: attribute boundingBox]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "cornerPoints" with the proper type]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface object length]
+    expected: FAIL
+
+  [DetectedFace interface: detectedFace must inherit property "boundingBox" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "format" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute rawValue]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute format]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute cornerPoints]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute boundingBox]
+    expected: FAIL
+
+  [DetectedBarcode must be primary interface of detectedBarcode]
+    expected: FAIL
+
+  [DetectedFace interface object name]
+    expected: FAIL
+
+  [FaceDetector must be primary interface of faceDetector]
+    expected: FAIL
+
+  [BarcodeDetector interface: barcodeDetector must inherit property "getSupportedFormats()" with the proper type]
+    expected: FAIL
+
+  [Stringification of faceDetector]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface object]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [Stringification of barcodeDetector]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "rawValue" with the proper type]
+    expected: FAIL
+
+  [DetectedFace must be primary interface of detectedFace]
+    expected: FAIL
+
+
+[idlharness.https.any.serviceworker.html]
+  [BarcodeDetector interface: operation detect(ImageBitmapSource)]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface object]
+    expected: FAIL
+
+  [BarcodeDetector must be primary interface of barcodeDetector]
+    expected: FAIL
+
+  [DetectedFace interface: detectedFace must inherit property "landmarks" with the proper type]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [Stringification of detectedBarcode]
+    expected: FAIL
+
+  [Stringification of detectedFace]
+    expected: FAIL
+
+  [BarcodeDetector interface: barcodeDetector must inherit property "detect(ImageBitmapSource)" with the proper type]
+    expected: FAIL
+
+  [FaceDetector interface object length]
+    expected: FAIL
+
+  [DetectedBarcode interface object length]
+    expected: FAIL
+
+  [FaceDetector interface: calling detect(ImageBitmapSource) on faceDetector with too few arguments must throw TypeError]
+    expected: FAIL
+
+  [DetectedBarcode interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [FaceDetector interface: faceDetector must inherit property "detect(ImageBitmapSource)" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "boundingBox" with the proper type]
+    expected: FAIL
+
+  [BarcodeDetector interface object name]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface object]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface: attribute landmarks]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BarcodeDetector interface: calling detect(ImageBitmapSource) on barcodeDetector with too few arguments must throw TypeError]
+    expected: FAIL
+
+  [DetectedFace interface: attribute boundingBox]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "cornerPoints" with the proper type]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface object length]
+    expected: FAIL
+
+  [DetectedFace interface: detectedFace must inherit property "boundingBox" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "format" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute rawValue]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute format]
+    expected: FAIL
+
+  [FaceDetector interface: operation detect(ImageBitmapSource)]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute cornerPoints]
+    expected: FAIL
+
+  [BarcodeDetector interface object length]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute boundingBox]
+    expected: FAIL
+
+  [DetectedBarcode must be primary interface of detectedBarcode]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface object]
+    expected: FAIL
+
+  [FaceDetector interface object name]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BarcodeDetector interface: operation getSupportedFormats()]
+    expected: FAIL
+
+  [FaceDetector must be primary interface of faceDetector]
+    expected: FAIL
+
+  [BarcodeDetector interface: barcodeDetector must inherit property "getSupportedFormats()" with the proper type]
+    expected: FAIL
+
+  [Stringification of faceDetector]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface object]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [Stringification of barcodeDetector]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "rawValue" with the proper type]
+    expected: FAIL
+
+  [DetectedFace must be primary interface of detectedFace]
+    expected: FAIL
+
+
+[idlharness.https.any.sharedworker.html]
+  [BarcodeDetector interface: operation detect(ImageBitmapSource)]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface object]
+    expected: FAIL
+
+  [BarcodeDetector must be primary interface of barcodeDetector]
+    expected: FAIL
+
+  [DetectedFace interface: detectedFace must inherit property "landmarks" with the proper type]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [Stringification of detectedBarcode]
+    expected: FAIL
+
+  [Stringification of detectedFace]
+    expected: FAIL
+
+  [BarcodeDetector interface: barcodeDetector must inherit property "detect(ImageBitmapSource)" with the proper type]
+    expected: FAIL
+
+  [FaceDetector interface object length]
+    expected: FAIL
+
+  [DetectedBarcode interface object length]
+    expected: FAIL
+
+  [FaceDetector interface: calling detect(ImageBitmapSource) on faceDetector with too few arguments must throw TypeError]
+    expected: FAIL
+
+  [DetectedBarcode interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [FaceDetector interface: faceDetector must inherit property "detect(ImageBitmapSource)" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "boundingBox" with the proper type]
+    expected: FAIL
+
+  [BarcodeDetector interface object name]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface object]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface: attribute landmarks]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [BarcodeDetector interface: calling detect(ImageBitmapSource) on barcodeDetector with too few arguments must throw TypeError]
+    expected: FAIL
+
+  [DetectedFace interface: attribute boundingBox]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "cornerPoints" with the proper type]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface object length]
+    expected: FAIL
+
+  [DetectedFace interface: detectedFace must inherit property "boundingBox" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "format" with the proper type]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute rawValue]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute format]
+    expected: FAIL
+
+  [FaceDetector interface: operation detect(ImageBitmapSource)]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute cornerPoints]
+    expected: FAIL
+
+  [BarcodeDetector interface object length]
+    expected: FAIL
+
+  [DetectedBarcode interface: attribute boundingBox]
+    expected: FAIL
+
+  [DetectedBarcode must be primary interface of detectedBarcode]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [DetectedFace interface object name]
+    expected: FAIL
+
+  [FaceDetector interface: existence and properties of interface object]
+    expected: FAIL
+
+  [FaceDetector interface object name]
+    expected: FAIL
+
+  [BarcodeDetector interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [BarcodeDetector interface: operation getSupportedFormats()]
+    expected: FAIL
+
+  [FaceDetector must be primary interface of faceDetector]
+    expected: FAIL
+
+  [BarcodeDetector interface: barcodeDetector must inherit property "getSupportedFormats()" with the proper type]
+    expected: FAIL
+
+  [Stringification of faceDetector]
+    expected: FAIL
+
+  [DetectedFace interface: existence and properties of interface object]
+    expected: FAIL
+
+  [DetectedBarcode interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [Stringification of barcodeDetector]
+    expected: FAIL
+
+  [DetectedBarcode interface: detectedBarcode must inherit property "rawValue" with the proper type]
+    expected: FAIL
+
+  [DetectedFace must be primary interface of detectedFace]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/shapedetection-cross-origin.sub.html.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[shapedetection-cross-origin.sub.html]
-  [BarcodeDetector should reject cross-origin ImageBitmaps with a SecurityError.]
-    expected: FAIL
-
-  [BarcodeDetector should reject cross-origin HTMLImageElements with a SecurityError.]
-    expected: FAIL
-
-  [FaceDetector should reject cross-origin HTMLVideoElements with a SecurityError.]
-    expected: FAIL
-
-  [BarcodeDetector should reject cross-origin HTMLVideoElements with a SecurityError.]
-    expected: FAIL
-
-  [FaceDetector should reject cross-origin ImageBitmaps with a SecurityError.]
-    expected: FAIL
-
-  [FaceDetector should reject cross-origin HTMLImageElements with a SecurityError.]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/shapedetection-cross-origin.sub.https.html.ini
@@ -0,0 +1,19 @@
+[shapedetection-cross-origin.sub.https.html]
+  [BarcodeDetector should reject cross-origin ImageBitmaps with a SecurityError.]
+    expected: FAIL
+
+  [BarcodeDetector should reject cross-origin HTMLImageElements with a SecurityError.]
+    expected: FAIL
+
+  [FaceDetector should reject cross-origin HTMLVideoElements with a SecurityError.]
+    expected: FAIL
+
+  [BarcodeDetector should reject cross-origin HTMLVideoElements with a SecurityError.]
+    expected: FAIL
+
+  [FaceDetector should reject cross-origin ImageBitmaps with a SecurityError.]
+    expected: FAIL
+
+  [FaceDetector should reject cross-origin HTMLImageElements with a SecurityError.]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/shape-detection/shapedetection-empty-input.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[shapedetection-empty-input.html]
-  [Barcode - detect(empty)]
-    expected: FAIL
-
-  [Face - detect(empty)]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/shape-detection/shapedetection-empty-input.https.html.ini
@@ -0,0 +1,7 @@
+[shapedetection-empty-input.https.html]
+  [Barcode - detect(empty)]
+    expected: FAIL
+
+  [Face - detect(empty)]
+    expected: FAIL
+
--- a/testing/web-platform/meta/trusted-types/trusted-types-reporting.tentative.https.html.ini
+++ b/testing/web-platform/meta/trusted-types/trusted-types-reporting.tentative.https.html.ini
@@ -19,8 +19,29 @@
     expected: NOTRUN
 
   [Trusted Type violation report: assign string to html]
     expected: NOTRUN
 
   [Trusted Type violation report: assign string to url]
     expected: NOTRUN
 
+  [Trusted Type violation report: large values should be handled sanely.]
+    expected: NOTRUN
+
+  [Trusted Type violation report: sample for custom element assignment]
+    expected: NOTRUN
+
+  [Trusted Type violation report: sample for .href assignment]
+    expected: NOTRUN
+
+  [Trusted Type violation report: sample for .innerHTML assignment]
+    expected: NOTRUN
+
+  [Trusted Type violation report: sample for eval]
+    expected: NOTRUN
+
+  [Trusted Type violation report: sample for script innerText assignment]
+    expected: NOTRUN
+
+  [trusted-types-reporting]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/web-nfc/NFCReader.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[NFCReader.html]
-  [Test that NFCReader.start fails if NFCReaderOptions.url has wrong protocol.]
-    expected: FAIL
-
-  [Test that NFCReader.start fails if NFCReaderOptions.url is invalid.]
-    expected: FAIL
-
-  [Test that NFCReader.start fails if NFCReaderOptions.url is missing components.]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-nfc/NFCReader.https.html.ini
@@ -0,0 +1,10 @@
+[NFCReader.https.html]
+  [Test that NFCReader.start fails if NFCReaderOptions.url has wrong protocol.]
+    expected: FAIL
+
+  [Test that NFCReader.start fails if NFCReaderOptions.url is invalid.]
+    expected: FAIL
+
+  [Test that NFCReader.start fails if NFCReaderOptions.url is missing components.]
+    expected: FAIL
+
--- a/testing/web-platform/meta/web-nfc/idlharness.https.window.js.ini
+++ b/testing/web-platform/meta/web-nfc/idlharness.https.window.js.ini
@@ -216,14 +216,122 @@
     expected: FAIL
 
   [Stringification of new NFCReadingEvent("reading", { message: {"url":"/custom/path","records":[{"recordType":"text","data":"Hello World"}\]} })]
     expected: FAIL
 
   [NFCReader interface: new NFCReader(); must inherit property "onerror" with the proper type]
     expected: FAIL
 
-  [NFCReadingEvent interface: new NFCReadingEvent("reading", { message: {"url":"/custom/path","records":[{"recordType":"text","data":"Hello World"}\]} }) must inherit property "serialNumber" with the proper type]
+  [NDEFMessage interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [NDEFMessage interface: existence and properties of interface object]
+    expected: FAIL
+
+  [NDEFRecord interface: attribute recordType]
+    expected: FAIL
+
+  [NDEFRecord interface: operation data()]
+    expected: FAIL
+
+  [NDEFMessage interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [NDEFRecord interface: existence and properties of interface object]
+    expected: FAIL
+
+  [NDEFMessage interface object length]
+    expected: FAIL
+
+  [NDEFMessage interface object name]
+    expected: FAIL
+
+  [NDEFMessage interface: attribute records]
+    expected: FAIL
+
+  [NDEFRecord interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [NDEFRecord interface object name]
+    expected: FAIL
+
+  [NDEFRecord interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [NDEFRecord interface: attribute mediaType]
+    expected: FAIL
+
+  [NDEFRecord interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [NDEFRecord interface object length]
+    expected: FAIL
+
+  [NDEFMessage interface: attribute url]
+    expected: FAIL
+
+  [NDEFMessage interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [NDEFRecord interface: existence and properties of interface object]
+    expected: FAIL
+
+  [NDEFMessage interface object length]
+    expected: FAIL
+
+  [NDEFMessage interface: attribute url]
+    expected: FAIL
+
+  [NDEFRecord interface: operation toArrayBuffer()]
+    expected: FAIL
+
+  [NDEFRecord interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [NDEFMessage interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [NDEFMessage interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
+  [NDEFRecord interface: attribute recordType]
+    expected: FAIL
+
+  [NDEFMessage interface object name]
+    expected: FAIL
+
+  [NDEFRecord interface: operation toText()]
+    expected: FAIL
+
+  [NDEFMessage interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [NDEFRecord interface object length]
+    expected: FAIL
+
+  [NDEFRecord interface: operation toJSON()]
+    expected: FAIL
+
+  [NDEFMessage interface: attribute records]
+    expected: FAIL
+
+  [NDEFRecord interface: attribute mediaType]
+    expected: FAIL
+
+  [NDEFRecord interface: existence and properties of interface prototype object]
+    expected: FAIL
+
+  [NDEFMessage interface: existence and properties of interface object]
+    expected: FAIL
+
+  [NDEFRecord interface object name]
+    expected: FAIL
+
+  [NDEFRecord interface: existence and properties of interface prototype object's "constructor" property]
     expected: FAIL
 
   [NFCReadingEvent interface: attribute serialNumber]
     expected: FAIL
 
+  [NFCReadingEvent interface: new NFCReadingEvent("reading", { message: {"url":"/custom/path","records":[{"recordType":"text","data":"Hello World"}\]} }) must inherit property "serialNumber" with the proper type]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/web-share/idlharness.https.window.js.ini
@@ -0,0 +1,10 @@
+[idlharness.https.window.html]
+  [Navigator interface: operation share(ShareData)]
+    expected: FAIL
+
+  [Navigator interface: calling share(ShareData) on navigator with too few arguments must throw TypeError]
+    expected: FAIL
+
+  [Navigator interface: navigator must inherit property "share(ShareData)" with the proper type]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webaudio/the-audio-api/the-audiobuffer-interface/audiobuffer-copy-channel.html.ini
@@ -0,0 +1,16 @@
+[audiobuffer-copy-channel.html]
+  [X 4: buffer.copyToChannel(x, 0, -1) incorrectly threw IndexSizeError: "Index or size is negative or greater than the allowed amount".]
+    expected: FAIL
+
+  [# AUDIT TASK RUNNER FINISHED: 2 out of 5 tasks were failed.]
+    expected: FAIL
+
+  [X 5: buffer.copyFromChannel(x, 0, -1) incorrectly threw IndexSizeError: "Index or size is negative or greater than the allowed amount".]
+    expected: FAIL
+
+  [< [copyFrom-exceptions\] 1 out of 9 assertions were failed.]
+    expected: FAIL
+
+  [< [copyTo-exceptions\] 1 out of 8 assertions were failed.]
+    expected: FAIL
+
--- a/testing/web-platform/meta/webdriver/tests/new_session/create_firstMatch.py.ini
+++ b/testing/web-platform/meta/webdriver/tests/new_session/create_firstMatch.py.ini
@@ -1,4 +1,3 @@
-[create_firstMatch.py]
-  disabled:
-    if ccov and (os == "win") and (bits == 64) and (version == "10.0.17134"): https://bugzilla.mozilla.org/show_bug.cgi?id=1507121
-
+[create_firstMatch.py]
+  disabled:
+    if ccov and (os == "win") and (bits == 64) and (version == "10.0.17134"): https://bugzilla.mozilla.org/show_bug.cgi?id=1507121
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webrtc-svc/RTCRtpParameters-scalability.html.ini
@@ -0,0 +1,7 @@
+[RTCRtpParameters-scalability.html]
+  [Setting scalabilityMode to a legal value should be accepted]
+    expected: FAIL
+
+  [Sender capabilities should include at least some scalability modes]
+    expected: FAIL
+
--- a/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini
+++ b/testing/web-platform/meta/webrtc/idlharness.https.window.js.ini
@@ -90,19 +90,16 @@
     expected: FAIL
 
   [RTCIceCandidate interface: new RTCIceCandidate({ sdpMid: 1 }) must inherit property "port" with the proper type]
     expected: FAIL
 
   [RTCPeerConnection interface: new RTCPeerConnection() must inherit property "onstatsended" with the proper type]
     expected: FAIL
 
-  [RTCSessionDescription interface object length]
-    expected: FAIL
-
   [RTCSessionDescription interface: attribute sdp]
     expected: FAIL
 
   [RTCPeerConnection interface: attribute sctp]
     expected: FAIL
 
   [RTCIceCandidate interface: attribute sdpMid]
     expected: FAIL
@@ -579,8 +576,20 @@
     expected: FAIL
 
   [RTCDataChannel interface: new RTCPeerConnection().createDataChannel('') must inherit property "onclosing" with the proper type]
     expected: FAIL
 
   [RTCDataChannel interface: attribute onclosing]
     expected: FAIL
 
+  [RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)]
+    expected: FAIL
+
+  [RTCPeerConnection interface: operation setRemoteDescription(RTCSessionDescriptionInit)]
+    expected: FAIL
+
+  [RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit)]
+    expected: FAIL
+
+  [RTCPeerConnection interface: operation setLocalDescription(RTCSessionDescriptionInit, VoidFunction, RTCPeerConnectionErrorCallback)]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/exclusive_requestFrame_nolayer.https.html.ini
@@ -0,0 +1,11 @@
+[exclusive_requestFrame_nolayer.https.html]
+  expected: ERROR
+  [exclusive_requestFrame_nolayer]
+    expected: FAIL
+
+  [XRSession requestAnimationFrame must fail if the session has no baseLayer for immersive]
+    expected: FAIL
+
+  [XRSession requestAnimationFrame must fail if the session has no baseLayer for non immersive]
+    expected: NOTRUN
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/render_state_vertical_fov_immersive.https.html.ini
@@ -0,0 +1,8 @@
+[render_state_vertical_fov_immersive.https.html]
+  expected: ERROR
+  [render_state_vertical_fov_immersive]
+    expected: FAIL
+
+  [inlineVerticalFieldOfView is set appropriately on immersively sessions]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/render_state_vertical_fov_inline.https.html.ini
@@ -0,0 +1,8 @@
+[render_state_vertical_fov_inline.https.html]
+  expected: ERROR
+  [render_state_vertical_fov_inline]
+    expected: FAIL
+
+  [inlineVerticalFieldOfView is set appropriately on inline sessions]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini
@@ -0,0 +1,11 @@
+[xrSession_requestAnimationFrame_timestamp.https.html]
+  expected: ERROR
+  [xrSession_requestAnimationFrame_timestamp]
+    expected: FAIL
+
+  [XRFrame getViewerPose updates on the next frame for immersive]
+    expected: FAIL
+
+  [XRFrame getViewerPose updates on the next frame for non-immersive]
+    expected: NOTRUN
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrView_match.https.html.ini
@@ -0,0 +1,8 @@
+[xrView_match.https.html]
+  expected: ERROR
+  [xrView_match]
+    expected: FAIL
+
+  [XRFrame contains the expected views]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrView_oneframeupdate.https.html.ini
@@ -0,0 +1,8 @@
+[xrView_oneframeupdate.https.html]
+  expected: ERROR
+  [xrView_oneframeupdate]
+    expected: FAIL
+
+  [XRView projection matrices update near and far depths on the next frame]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrViewport_valid.https.html.ini
@@ -0,0 +1,8 @@
+[xrViewport_valid.https.html]
+  expected: ERROR
+  [xrViewport_valid]
+    expected: FAIL
+
+  [XRViewport attributes are valid]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrWebGLLayer_constructor.https.html.ini
@@ -0,0 +1,4 @@
+[xrWebGLLayer_constructor.https.html]
+  [Ensure that XRWebGLLayer's constructor throws appropriate errors]
+    expected: FAIL
+
deleted file mode 100644
--- a/testing/web-platform/meta/webxr/xrWebGLLayer_framebuffer.https.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[xrWebGLLayer_framebuffer.https.html]
-  expected: ERROR
-  [XRWebGLLayer reports a valid framebuffer for inline sessions]
-    expected: NOTRUN
-
-  [XRWebGLLayer reports a valid framebuffer for immersive sessions]
-    expected: FAIL
-
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini
@@ -0,0 +1,8 @@
+[xrWebGLLayer_framebuffer_draw.https.html]
+  expected: ERROR
+  [xrWebGLLayer_framebuffer_draw]
+    expected: FAIL
+
+  [Ensure a WebGL layer's framebuffer can only be drawn to inside a XR frame]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrWebGLLayer_framebuffer_scale.https.html.ini
@@ -0,0 +1,8 @@
+[xrWebGLLayer_framebuffer_scale.https.html]
+  expected: ERROR
+  [xrWebGLLayer_framebuffer_scale]
+    expected: FAIL
+
+  [Ensure framebuffer scaling works as expected.]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini
@@ -0,0 +1,8 @@
+[xrWebGLLayer_opaque_framebuffer.https.html]
+  expected: ERROR
+  [Ensure that the framebuffer given by the WebGL layer is opaque for immersive]
+    expected: FAIL
+
+  [Ensure that the framebuffer given by the WebGL layer is opaque for non-immersive]
+    expected: NOTRUN
+
--- a/testing/web-platform/tests/.taskcluster.yml
+++ b/testing/web-platform/tests/.taskcluster.yml
@@ -217,28 +217,30 @@ tasks:
           conditions:
             pull-request
         - name: tools/ unittests (Python 2)
           description: >-
             Unit tests for tools running under Python 2.7, excluding wptrunner
           script: >-
             export TOXENV=py27;
             export HYPOTHESIS_PROFILE=ci;
+            export PY_COLORS=0;
             ./tools/ci/run_tc.py \
               tools_unittest \
               tools/ci/ci_tools_unittest.sh
           conditions:
             push
             pull-request
         - name: tools/ unittests (Python 3)
           description: >-
             Unit tests for tools running under Python 3, excluding wptrunner
           script: >-
             export TOXENV=py36;
             export HYPOTHESIS_PROFILE=ci;
+            export PY_COLORS=0;
             sudo apt update -qqy;
             sudo apt install -qqy python3-pip;
             ./tools/ci/run_tc.py \
               tools_unittest \
               tools/ci/ci_tools_unittest.sh
           conditions:
             push
             pull-request
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/IndexedDB/structured-clone.any.js
@@ -0,0 +1,320 @@
+// META: script=support-promises.js
+// META: title=Indexed DB and Structured Serializing/Deserializing
+// META: timeout=long
+
+// Tests Indexed DB coverage of HTML's Safe "passing of structured data"
+// https://html.spec.whatwg.org/multipage/structured-data.html
+
+function describe(value) {
+  let type, str;
+  if (typeof value === 'object' && value) {
+    type = value.__proto__.constructor.name;
+    // Handle Number(-0), etc.
+    str = Object.is(value.valueOf(), -0) ? '-0' : String(value);
+  } else {
+    type = typeof value;
+    // Handle primitive -0.
+    str = Object.is(value, -0) ? '-0' : String(value);
+  }
+  return `${type}: ${str}`;
+}
+
+function cloneTest(value, verifyFunc) {
+  promise_test(async t => {
+    const db = await createDatabase(t, db => {
+      const store = db.createObjectStore('store');
+      // This index is not used, but evaluating key path on each put()
+      // call will exercise (de)serialization.
+      store.createIndex('index', 'dummyKeyPath');
+    });
+    t.add_cleanup(() => {
+      if (db) {
+        db.close();
+        indexedDB.deleteDatabase(db.name);
+      }
+    });
+    const tx = db.transaction('store', 'readwrite');
+    const store = tx.objectStore('store');
+    await promiseForRequest(t, store.put(value, 'key'));
+    const result = await promiseForRequest(t, store.get('key'));
+    await verifyFunc(value, result);
+    await promiseForTransaction(t, tx);
+  }, describe(value));
+}
+
+// Specialization of cloneTest() for objects, with common asserts.
+function cloneObjectTest(value, verifyFunc) {
+  cloneTest(value, async (orig, clone) => {
+    assert_not_equals(orig, clone);
+    assert_equals(typeof clone, 'object');
+    assert_equals(orig.__proto__, clone.__proto__);
+    await verifyFunc(orig, clone);
+  });
+}
+
+function cloneFailureTest(value) {
+  promise_test(async t => {
+    const db = await createDatabase(t, db => {
+      db.createObjectStore('store');
+    });
+    t.add_cleanup(() => {
+      if (db) {
+        db.close();
+        indexedDB.deleteDatabase(db.name);
+      }
+    });
+    const tx = db.transaction('store', 'readwrite');
+    const store = tx.objectStore('store');
+    assert_throws('DataCloneError', () => store.put(value, 'key'));
+  }, 'Not serializable: ' + describe(value));
+}
+
+//
+// ECMAScript types
+//
+
+// Primitive values: Undefined, Null, Boolean, Number, BigInt, String
+const booleans = [false, true];
+const numbers = [
+  NaN,
+  -Infinity,
+  -Number.MAX_VALUE,
+  -0xffffffff,
+  -0x80000000,
+  -0x7fffffff,
+  -1,
+  -Number.MIN_VALUE,
+  -0,
+  0,
+  1,
+  Number.MIN_VALUE,
+  0x7fffffff,
+  0x80000000,
+  0xffffffff,
+  Number.MAX_VALUE,
+  Infinity,
+];
+const bigints = [
+  -12345678901234567890n,
+  -1n,
+  0n,
+  1n,
+  12345678901234567890n,
+];
+const strings = [
+  '',
+  'this is a sample string',
+  'null(\0)',
+];
+
+[undefined, null].concat(booleans, numbers, bigints, strings)
+  .forEach(value => cloneTest(value, (orig, clone) => {
+    assert_equals(orig, clone);
+  }));
+
+// "Primitive" Objects (Boolean, Number, BigInt, String)
+[].concat(booleans, numbers, strings)
+  .forEach(value => cloneObjectTest(Object(value), (orig, clone) => {
+    assert_equals(orig.valueOf(), clone.valueOf());
+  }));
+
+// Dates
+[
+  new Date(-1e13),
+  new Date(-1e12),
+  new Date(-1e9),
+  new Date(-1e6),
+  new Date(-1e3),
+  new Date(0),
+  new Date(1e3),
+  new Date(1e6),
+  new Date(1e9),
+  new Date(1e12),
+  new Date(1e13)
+].forEach(value => cloneTest(value, (orig, clone) => {
+    assert_not_equals(orig, clone);
+    assert_equals(typeof clone, 'object');
+    assert_equals(orig.__proto__, clone.__proto__);
+    assert_equals(orig.valueOf(), clone.valueOf());
+  }));
+
+// Regular Expressions
+[
+  new RegExp(),
+  /abc/,
+  /abc/g,
+  /abc/i,
+  /abc/gi,
+  /abc/m,
+  /abc/mg,
+  /abc/mi,
+  /abc/mgi,
+  /abc/gimsuy,
+].forEach(value => cloneObjectTest(value, (orig, clone) => {
+  assert_equals(orig.toString(), clone.toString());
+}));
+
+// ArrayBuffer
+cloneObjectTest(new Uint8Array([0, 1, 254, 255]).buffer, (orig, clone) => {
+  assert_array_equals(new Uint8Array(orig), new Uint8Array(clone));
+});
+
+// TODO SharedArrayBuffer
+
+// Array Buffer Views
+[
+  new Uint8Array([]),
+  new Uint8Array([0, 1, 254, 255]),
+  new Uint16Array([0x0000, 0x0001, 0xFFFE, 0xFFFF]),
+  new Uint32Array([0x00000000, 0x00000001, 0xFFFFFFFE, 0xFFFFFFFF]),
+  new Int8Array([0, 1, 254, 255]),
+  new Int16Array([0x0000, 0x0001, 0xFFFE, 0xFFFF]),
+  new Int32Array([0x00000000, 0x00000001, 0xFFFFFFFE, 0xFFFFFFFF]),
+  new Uint8ClampedArray([0, 1, 254, 255]),
+  new Float32Array([-Infinity, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, Infinity, NaN]),
+  new Float64Array([-Infinity, -Number.MAX_VALUE, -Number.MIN_VALUE, 0,
+                    Number.MIN_VALUE, Number.MAX_VALUE, Infinity, NaN])
+].forEach(value => cloneObjectTest(value, (orig, clone) => {
+  assert_array_equals(orig, clone);
+}));
+
+// Map
+cloneObjectTest(new Map([[1,2],[3,4]]), (orig, clone) => {
+  assert_array_equals([...orig.keys()], [...clone.keys()]);
+  assert_array_equals([...orig.values()], [...clone.values()]);
+});
+
+// Set
+cloneObjectTest(new Set([1,2,3,4]), (orig, clone) => {
+  assert_array_equals([...orig.values()], [...clone.values()]);
+});
+
+// Error
+[
+  new Error(),
+  new Error('abc', 'def'),
+  new EvalError(),
+  new EvalError('ghi', 'jkl'),
+  new RangeError(),
+  new RangeError('ghi', 'jkl'),
+  new ReferenceError(),
+  new ReferenceError('ghi', 'jkl'),
+  new SyntaxError(),
+  new SyntaxError('ghi', 'jkl'),
+  new TypeError(),
+  new TypeError('ghi', 'jkl'),
+  new URIError(),
+  new URIError('ghi', 'jkl'),
+].forEach(value => cloneObjectTest(value, (orig, clone) => {
+  assert_equals(orig.name, clone.name);
+  assert_equals(orig.message, clone.message);
+}));
+
+// Arrays
+[
+  [],
+  [1,2,3],
+  Object.assign(
+    ['foo', 'bar'],
+    {10: true, 11: false, 20: 123, 21: 456, 30: null}),
+  Object.assign(
+    ['foo', 'bar'],
+    {a: true, b: false, foo: 123, bar: 456, '': null}),
+].forEach(value => cloneObjectTest(value, (orig, clone) => {
+  assert_array_equals(orig, clone);
+  assert_array_equals(Object.keys(orig), Object.keys(clone));
+  Object.keys(orig).forEach(key => {
+    assert_equals(orig[key], clone[key], `Property ${key}`);
+  });
+}));
+
+// Objects
+cloneObjectTest({foo: true, bar: false}, (orig, clone) => {
+  assert_array_equals(Object.keys(orig), Object.keys(clone));
+  Object.keys(orig).forEach(key => {
+    assert_equals(orig[key], clone[key], `Property ${key}`);
+  });
+});
+
+//
+// [Serializable] Platform objects
+//
+
+// TODO: Test these additional interfaces:
+// * DOMQuad
+// * DOMException
+// * DetectedText, DetectedFace, DetectedBarcode
+// * RTCCertificate
+
+// Geometry types
+[
+  new DOMMatrix(),
+  new DOMMatrixReadOnly(),
+  new DOMPoint(),
+  new DOMPointReadOnly(),
+  new DOMRect,
+  new DOMRectReadOnly(),
+].forEach(value => cloneObjectTest(value, (orig, clone) => {
+  Object.keys(orig.__proto__).forEach(key => {
+    assert_equals(orig[key], clone[key], `Property ${key}`);
+  });
+}));
+
+// ImageData
+const image_data = new ImageData(8, 8);
+for (let i = 0; i < 256; ++i) {
+  image_data.data[i] = i;
+}
+cloneObjectTest(image_data, (orig, clone) => {
+  assert_equals(orig.width, clone.width);
+  assert_equals(orig.height, clone.height);
+  assert_array_equals(orig.data, clone.data);
+});
+
+// Blob
+cloneObjectTest(
+  new Blob(['This is a test.'], {type: 'a/b'}),
+  async (orig, clone) => {
+    assert_equals(orig.size, clone.size);
+    assert_equals(orig.type, clone.type);
+    assert_equals(await orig.text(), await clone.text());
+  });
+
+// File
+cloneObjectTest(
+  new File(['This is a test.'], 'foo.txt', {type: 'c/d'}),
+  async (orig, clone) => {
+    assert_equals(orig.size, clone.size);
+    assert_equals(orig.type, clone.type);
+    assert_equals(orig.name, clone.name);
+    assert_equals(orig.lastModified, clone.lastModified);
+    assert_equals(String(orig.lastModifiedDate),
+                  String(clone.lastModifiedDate));
+    assert_equals(await orig.text(), await clone.text());
+  });
+
+
+// FileList - exposed in Workers, but not constructable.
+if ('document' in self) {
+  // TODO: Test with populated list.
+  cloneObjectTest(
+    Object.assign(document.createElement('input'),
+                  {type: 'file', multiple: true}).files,
+    async (orig, clone) => {
+      assert_equals(orig.length, clone.length);
+    });
+}
+
+//
+// Non-serializable types
+//
+[
+  // ECMAScript types
+  function() {},
+  Symbol('desc'),
+
+  // Non-[Serializable] platform objects
+  self,
+  new Event(''),
+  new MessageChannel()
+].forEach(cloneFailureTest);
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/common/security-features/tools/format_spec_src_json.py
@@ -0,0 +1,20 @@
+import collections
+import json
+import os
+
+
+def main():
+    '''Formats spec.src.json.'''
+    script_directory = os.path.dirname(os.path.abspath(__file__))
+    for dir in ['mixed-content', 'referrer-policy']:
+        filename = os.path.join(script_directory, '..', '..', '..', dir,
+                                'spec.src.json')
+        spec = json.load(
+            open(filename, 'r'), object_pairs_hook=collections.OrderedDict)
+        with open(filename, 'w') as f:
+            f.write(json.dumps(spec, indent=2, separators=(',', ': ')))
+            f.write('\n')
+
+
+if __name__ == '__main__':
+    main()
--- a/testing/web-platform/tests/common/security-features/tools/generate.py
+++ b/testing/web-platform/tests/common/security-features/tools/generate.py
@@ -23,79 +23,88 @@ def expand_pattern(expansion_pattern, te
             for sub_key in values_dict.keys():
                 expansion[artifact_key] += values_dict[sub_key]
         else:
             expansion[artifact_key] = [artifact_value]
 
     return expansion
 
 
-def permute_expansion(expansion, artifact_order, selection = {}, artifact_index = 0):
+def permute_expansion(expansion,
+                      artifact_order,
+                      selection={},
+                      artifact_index=0):
     assert isinstance(artifact_order, list), "artifact_order should be a list"
 
     if artifact_index >= len(artifact_order):
         yield selection
         return
 
     artifact_key = artifact_order[artifact_index]
 
     for artifact_value in expansion[artifact_key]:
         selection[artifact_key] = artifact_value
-        for next_selection in permute_expansion(expansion,
-                                                artifact_order,
-                                                selection,
-                                                artifact_index + 1):
+        for next_selection in permute_expansion(expansion, artifact_order,
+                                                selection, artifact_index + 1):
             yield next_selection
 
 
+# Dumps the test config `selection` into a serialized JSON string.
+# We omit `name` parameter because it is not used by tests.
+def dump_test_parameters(selection):
+    selection = dict(selection)
+    del selection['name']
+
+    return json.dumps(
+        selection, indent=2, separators=(',', ': '), sort_keys=True)
+
+
 def generate_selection(config, selection, spec, test_html_template_basename):
-    # TODO: Refactor out this referrer-policy-specific part.
-    if 'referrer_policy' in spec:
-      # Oddball: it can be None, so in JS it's null.
-      selection['referrer_policy'] = spec['referrer_policy']
-
-    test_parameters = json.dumps(selection, indent=2, separators=(',', ':'))
+    test_parameters = dump_test_parameters(selection)
     # Adjust the template for the test invoking JS. Indent it to look nice.
     indent = "\n" + " " * 8
     test_parameters = test_parameters.replace("\n", indent)
 
     selection['test_js'] = '''
       %s(
         %s,
         document.querySelector("meta[name=assert]").content,
         new SanityChecker()
       ).start();
       ''' % (config.test_case_name, test_parameters)
 
     selection['spec_name'] = spec['name']
-    selection['test_page_title'] = config.test_page_title_template % spec['title']
+    selection[
+        'test_page_title'] = config.test_page_title_template % spec['title']
     selection['spec_description'] = spec['description']
     selection['spec_specification_url'] = spec['specification_url']
     selection['helper_js'] = config.helper_js
     selection['sanity_checker_js'] = config.sanity_checker_js
     selection['spec_json_js'] = config.spec_json_js
 
-    test_filename = os.path.join(config.spec_directory, config.test_file_path_pattern % selection)
+    test_filename = os.path.join(config.spec_directory,
+                                 config.test_file_path_pattern % selection)
     test_headers_filename = test_filename + ".headers"
     test_directory = os.path.dirname(test_filename)
 
     test_html_template = util.get_template(test_html_template_basename)
     disclaimer_template = util.get_template('disclaimer.template')
 
     html_template_filename = os.path.join(util.template_directory,
                                           test_html_template_basename)
     generated_disclaimer = disclaimer_template \
-        % {'generating_script_filename': os.path.relpath(__file__,
+        % {'generating_script_filename': os.path.relpath(sys.argv[0],
                                                          util.test_root_directory),
            'html_template_filename': os.path.relpath(html_template_filename,
                                                      util.test_root_directory)}
 
     # Adjust the template for the test invoking JS. Indent it to look nice.
     selection['generated_disclaimer'] = generated_disclaimer.rstrip()
-    selection['test_description'] = config.test_description_template % selection
+    selection[
+        'test_description'] = config.test_description_template % selection
     selection['test_description'] = \
         selection['test_description'].rstrip().replace("\n", "\n" + " " * 33)
 
     # Directory for the test files.
     try:
         os.makedirs(test_directory)
     except:
         pass
@@ -118,19 +127,21 @@ def generate_selection(config, selection
     util.write_file(test_filename, test_html_template % selection)
 
 
 def generate_test_source_files(config, spec_json, target):
     test_expansion_schema = spec_json['test_expansion_schema']
     specification = spec_json['specification']
 
     spec_json_js_template = util.get_template('spec_json.js.template')
-    generated_spec_json_filename = os.path.join(config.spec_directory, "spec_json.js")
-    util.write_file(generated_spec_json_filename,
-               spec_json_js_template % {'spec_json': json.dumps(spec_json)})
+    generated_spec_json_filename = os.path.join(config.spec_directory,
+                                                "spec_json.js")
+    util.write_file(
+        generated_spec_json_filename,
+        spec_json_js_template % {'spec_json': json.dumps(spec_json)})
 
     # Choose a debug/release template depending on the target.
     html_template = "test.%s.html.template" % target
 
     artifact_order = test_expansion_schema.keys() + ['name']
     artifact_order.remove('expansion')
 
     # Create list of excluded tests.
@@ -144,46 +155,57 @@ def generate_test_source_files(config, s
             exclusion_dict[excluded_selection_path] = True
 
     for spec in specification:
         # Used to make entries with expansion="override" override preceding
         # entries with the same |selection_path|.
         output_dict = {}
 
         for expansion_pattern in spec['test_expansion']:
-            expansion = expand_pattern(expansion_pattern, test_expansion_schema)
+            expansion = expand_pattern(expansion_pattern,
+                                       test_expansion_schema)
             for selection in permute_expansion(expansion, artifact_order):
+                selection['delivery_key'] = spec_json['delivery_key']
                 selection_path = config.selection_pattern % selection
                 if not selection_path in exclusion_dict:
                     if selection_path in output_dict:
                         if expansion_pattern['expansion'] != 'override':
-                            print("Error: %s's expansion is default but overrides %s" % (selection['name'], output_dict[selection_path]['name']))
+                            print(
+                                "Error: %s's expansion is default but overrides %s"
+                                % (selection['name'],
+                                   output_dict[selection_path]['name']))
                             sys.exit(1)
                     output_dict[selection_path] = copy.deepcopy(selection)
                 else:
                     print('Excluding selection:', selection_path)
 
         for selection_path in output_dict:
             selection = output_dict[selection_path]
-            generate_selection(config,
-                               selection,
-                               spec,
-                               html_template)
+            generate_selection(config, selection, spec, html_template)
 
 
 def main(config):
-    parser = argparse.ArgumentParser(description='Test suite generator utility')
-    parser.add_argument('-t', '--target', type = str,
-        choices = ("release", "debug"), default = "release",
-        help = 'Sets the appropriate template for generating tests')
-    parser.add_argument('-s', '--spec', type = str, default = None,
-        help = 'Specify a file used for describing and generating the tests')
+    parser = argparse.ArgumentParser(
+        description='Test suite generator utility')
+    parser.add_argument(
+        '-t',
+        '--target',
+        type=str,
+        choices=("release", "debug"),
+        default="release",
+        help='Sets the appropriate template for generating tests')
+    parser.add_argument(
+        '-s',
+        '--spec',
+        type=str,
+        default=None,
+        help='Specify a file used for describing and generating the tests')
     # TODO(kristijanburnik): Add option for the spec_json file.
     args = parser.parse_args()
 
     if args.spec:
-      config.spec_directory = args.spec
+        config.spec_directory = args.spec
 
     spec_filename = os.path.join(config.spec_directory, "spec.src.json")
     spec_json = util.load_spec_json(spec_filename)
     spec_validator.assert_valid_spec_json(spec_json)
 
     generate_test_source_files(config, spec_json, args.target)
rename from testing/web-platform/tests/mixed-content/generic/tools/spec_validator.py
rename to testing/web-platform/tests/common/security-features/tools/spec_validator.py
--- a/testing/web-platform/tests/mixed-content/generic/tools/spec_validator.py
+++ b/testing/web-platform/tests/common/security-features/tools/spec_validator.py
@@ -1,14 +1,14 @@
 #!/usr/bin/env python
 
 from __future__ import print_function
 
 import json, sys
-from common_paths import *
+
 
 def assert_non_empty_string(obj, field):
     assert field in obj, 'Missing field "%s"' % field
     assert isinstance(obj[field], basestring), \
         'Field "%s" must be a string' % field
     assert len(obj[field]) > 0, 'Field "%s" must not be empty' % field
 
 
@@ -26,22 +26,23 @@ def assert_non_empty_dict(obj, field):
         '%s dict must not be empty' % field
 
 
 def assert_contains(obj, field):
     assert field in obj, 'Must contain field "%s"' % field
 
 
 def assert_value_from(obj, field, items):
-   assert obj[field] in items, \
-        'Field "%s" must be from: %s' % (field, str(items))
+    assert obj[field] in items, \
+         'Field "%s" must be from: %s' % (field, str(items))
 
 
 def assert_atom_or_list_items_from(obj, field, items):
-    if isinstance(obj[field], basestring) or isinstance(obj[field], int):
+    if isinstance(obj[field], basestring) or isinstance(
+            obj[field], int) or obj[field] is None:
         assert_value_from(obj, field, items)
         return
 
     assert isinstance(obj[field], list), '%s must be a list' % field
     for allowed_value in obj[field]:
         assert allowed_value != '*', "Wildcard is not supported for lists!"
         assert allowed_value in items, \
             'Field "%s" must be from: %s' % (field, str(items))
@@ -66,43 +67,44 @@ def assert_valid_artifact(exp_pattern, a
         assert_atom_or_list_items_from(exp_pattern, artifact_key,
                                        ["*"] + schema)
         return
 
     for sub_artifact_key, sub_schema in schema.iteritems():
         assert_valid_artifact(exp_pattern[artifact_key], sub_artifact_key,
                               sub_schema)
 
+
 def validate(spec_json, details):
     """ Validates the json specification for generating tests. """
 
     details['object'] = spec_json
-    assert_contains_only_fields(spec_json, ["specification",
-                                            "test_expansion_schema",
-                                            "excluded_tests"])
+    assert_contains_only_fields(spec_json, [
+        "specification", "delivery_key", "test_expansion_schema",
+        "excluded_tests"
+    ])
     assert_non_empty_list(spec_json, "specification")
     assert_non_empty_dict(spec_json, "test_expansion_schema")
     assert_non_empty_list(spec_json, "excluded_tests")
 
     specification = spec_json['specification']
     test_expansion_schema = spec_json['test_expansion_schema']
     excluded_tests = spec_json['excluded_tests']
 
     valid_test_expansion_fields = ['name'] + test_expansion_schema.keys()
 
     # Validate each single spec.
     for spec in specification:
         details['object'] = spec
 
         # Validate required fields for a single spec.
-        assert_contains_only_fields(spec, ['name',
-                                           'title',
-                                           'description',
-                                           'specification_url',
-                                           'test_expansion'])
+        assert_contains_only_fields(spec, [
+            'name', 'title', 'description', 'specification_url',
+            'test_expansion'
+        ])
         assert_non_empty_string(spec, 'name')
         assert_non_empty_string(spec, 'title')
         assert_non_empty_string(spec, 'description')
         assert_non_empty_string(spec, 'specification_url')
         assert_non_empty_list(spec, 'test_expansion')
 
         # Validate spec's test expansion.
         used_spec_names = {}
@@ -118,51 +120,45 @@ def validate(spec_json, details):
             for artifact in test_expansion_schema:
                 details['test_expansion_field'] = artifact
                 assert_valid_artifact(spec_exp, artifact,
                                       test_expansion_schema[artifact])
                 del details['test_expansion_field']
 
     # Validate the test_expansion schema members.
     details['object'] = test_expansion_schema
-    assert_contains_only_fields(test_expansion_schema, ['expansion',
-                                                        'source_scheme',
-                                                        'opt_in_method',
-                                                        'context_nesting',
-                                                        'redirection',
-                                                        'subresource',
-                                                        'origin',
-                                                        'expectation'])
+    assert_contains_only_fields(test_expansion_schema, [
+        'expansion', 'source_scheme', 'delivery_type', 'delivery_value',
+        'redirection', 'subresource', 'origin', 'expectation'
+    ])
     # Validate excluded tests.
     details['object'] = excluded_tests
     for excluded_test_expansion in excluded_tests:
         assert_contains_only_fields(excluded_test_expansion,
                                     valid_test_expansion_fields)
         details['object'] = excluded_test_expansion
         for artifact in test_expansion_schema:
             details['test_expansion_field'] = artifact
-            assert_valid_artifact(
-                excluded_test_expansion,
-                artifact,
-                test_expansion_schema[artifact])
+            assert_valid_artifact(excluded_test_expansion, artifact,
+                                  test_expansion_schema[artifact])
             del details['test_expansion_field']
 
     del details['object']
 
 
 def assert_valid_spec_json(spec_json):
     error_details = {}
     try:
         validate(spec_json, error_details)
     except AssertionError as err:
         print('ERROR:', err.message)
         print(json.dumps(error_details, indent=4))
         sys.exit(1)
 
 
 def main():
-    spec_json = load_spec_json();
+    spec_json = load_spec_json()
     assert_valid_spec_json(spec_json)
     print("Spec JSON is valid.")
 
 
 if __name__ == '__main__':
     main()
--- a/testing/web-platform/tests/common/security-features/tools/util.py
+++ b/testing/web-platform/tests/common/security-features/tools/util.py
@@ -1,41 +1,41 @@
 from __future__ import print_function
 
 import os, sys, json, re
 
 script_directory = os.path.dirname(os.path.abspath(__file__))
-template_directory = os.path.abspath(os.path.join(script_directory,
-                                                  'template'))
-test_root_directory = os.path.abspath(os.path.join(script_directory,
-                                                   '..', '..', '..'))
+template_directory = os.path.abspath(
+    os.path.join(script_directory, 'template'))
+test_root_directory = os.path.abspath(
+    os.path.join(script_directory, '..', '..', '..'))
 
 
 def get_template(basename):
     with open(os.path.join(template_directory, basename), "r") as f:
         return f.read()
 
 
 def write_file(filename, contents):
     with open(filename, "w") as f:
         f.write(contents)
 
 
 def read_nth_line(fp, line_number):
-  fp.seek(0)
-  for i, line in enumerate(fp):
-    if (i + 1) == line_number:
-      return line
+    fp.seek(0)
+    for i, line in enumerate(fp):
+        if (i + 1) == line_number:
+            return line
 
 
 def load_spec_json(path_to_spec):
     re_error_location = re.compile('line ([0-9]+) column ([0-9]+)')
     with open(path_to_spec, "r") as f:
         try:
-          return json.load(f)
+            return json.load(f)
         except ValueError as ex:
-          print(ex.message)
-          match = re_error_location.search(ex.message)
-          if match:
-            line_number, column = int(match.group(1)), int(match.group(2))
-            print(read_nth_line(f, line_number).rstrip())
-            print(" " * (column - 1) + "^")
-          sys.exit(1)
+            print(ex.message)
+            match = re_error_location.search(ex.message)
+            if match:
+                line_number, column = int(match.group(1)), int(match.group(2))
+                print(read_nth_line(f, line_number).rstrip())
+                print(" " * (column - 1) + "^")
+            sys.exit(1)
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/cookie-store/cookieStore_delete_insecure.tentative.https.window.js
@@ -0,0 +1,19 @@
+'use strict';
+
+promise_test(async t => {
+  await cookieStore.set('cookie-name', 'cookie-value', { secure: false });
+  t.add_cleanup(async () => { await cookieStore.delete('cookie-name'); });
+
+  await cookieStore.delete('cookie-name');
+  const cookie = await cookieStore.get('cookie-name');
+  assert_equals(cookie, null);
+}, 'cookieStore.delete(name) can delete an insecure cookie');
+
+promise_test(async t => {
+  await cookieStore.set('cookie-name', 'cookie-value', { secure: false });
+  t.add_cleanup(async () => { await cookieStore.delete('cookie-name'); });
+
+  await cookieStore.delete({ name: 'cookie-name' });
+  const cookie = await cookieStore.get('cookie-name');
+  assert_equals(cookie, null);
+}, 'cookieStore.delete(options) can delete an insecure cookie');
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/cookies/cookie-enabled-noncookie-frame.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<head>
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+  <script>
+    var t = async_test("navigator.cookieEnabled behavior on frames without cookie access");
+    window.onmessage = function(ev) {
+      // Surprisingly, the legacy behavior here is to return true; this actually
+      // does match the spec definition since false is supposed to be returned
+      // when a document.cookie write is ignored --- and here it would throw
+      // a security exception, not be ignored.
+      assert_equals(ev.data, true);
+      t.done();
+    }
+
+    t.step(function() {
+      var iframe = document.createElement("iframe");
+      iframe.sandbox = "allow-scripts";
+      iframe.srcdoc = "<scr" + "ipt>" +
+            "window.onmessage = function() {" +
+            "  parent.postMessage(navigator.cookieEnabled, '*'); " +
+            "}</scr" + "ipt>";
+      iframe.onload = function() {
+        iframe.contentWindow.postMessage({}, "*");
+      }
+      document.body.appendChild(iframe);
+    });
+  </script>
+</body>
--- a/testing/web-platform/tests/credential-management/idlharness.https.window.js
+++ b/testing/web-platform/tests/credential-management/idlharness.https.window.js
@@ -1,35 +1,36 @@
 // META: script=/resources/WebIDLParser.js
 // META: script=/resources/idlharness.js
 
 // https://w3c.github.io/webappsec-credential-management/
 
 'use strict';
 
-promise_test(async () => {
-  const idl = await fetch('/interfaces/credential-management.idl').then(r => r.text());
-  const html = await fetch('/interfaces/html.idl').then(r => r.text());
+idl_test(
+  ['credential-management'],
+  ['html', 'dom'],
+  idl_array => {
+    idl_array.add_objects({
+      CredentialsContainer: ['navigator.credentials'],
+      PasswordCredential: ['passwordCredential'],
+      FederatedCredential: ['federatedCredential'],
+    });
 
-  var idl_array = new IdlArray();
-  idl_array.add_idls(idl);
-  idl_array.add_dependency_idls(html);
-  idl_array.add_objects({
-    CredentialsContainer: ['navigator.credentials'],
-    PasswordCredential: [
-      `new PasswordCredential({
+    try {
+      self.passwordCredential = new PasswordCredential({
         id: "id",
         password: "pencil",
         iconURL: "https://example.com/",
         name: "name"
-      })`
-    ],
-    FederatedCredential: [
-      `new FederatedCredential({
+      });
+    } catch (e) {}
+
+    try {
+      self.federatedCredential = new FederatedCredential({
         id: "id",
         provider: "https://example.com",
         iconURL: "https://example.com/",
         name: "name"
-      })`
-    ]
-  });
-  idl_array.test();
-})
+      });
+    } catch (e) {}
+  }
+)
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/CSS2/floats/zero-available-space-float-positioning.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#float-width" title="10.3.5 Floating, non-replaced elements">
+<link rel="match" href="../../reference/ref-filled-green-100px-square-only.html">
+<p>Test passes if there is a filled green square.</p>
+<div style="width: 0px;">
+  <div style="float: left; width: 100px; height: 50px; background: green;"></div>
+  <div style="float: left; width: 100px; height: 50px; background: green;"></div>
+</div>
+
--- a/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-004.html
+++ b/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-004.html
@@ -3,8 +3,9 @@
 <link rel="help" href="https://drafts.csswg.org/css-backgrounds/#special-backgrounds">
 <link rel="match" href="../reference/blank.html">
 <style>
   body {
     background: red;
     display: none
   }
 </style>
+<body></body>
--- a/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-005.html
+++ b/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-005.html
@@ -1,8 +1,9 @@
 <!DOCTYPE html>
 <title>CSS Backgrounds and Borders Test: don't propagate body background when html is display:none</title>
 <link rel="help" href="https://drafts.csswg.org/css-backgrounds/#special-backgrounds">
 <link rel="match" href="../reference/blank.html">
 <style>
   html { display: none; }
   body { background: red; }
 </style>
+<body></body>
--- a/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-006.html
+++ b/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-006.html
@@ -9,8 +9,9 @@
 <script>
   window.onload = () => {
     requestAnimationFrame(() => requestAnimationFrame(() => {
       document.documentElement.style.display = "none";
       document.documentElement.classList.remove("reftest-wait");
     }));
   };
 </script>
+<body></body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-backgrounds/background-color-body-propagation-007.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>CSS Backgrounds and Borders Test: don't propagate body background when display:contents</title>
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#special-backgrounds">
+<link rel="match" href="../reference/blank.html">
+<style>
+  body {
+    background: red;
+    display: contents
+  }
+</style>
+<body></body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-inline/parsing/dominant-baseline-computed.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Inline Layout: getComputedStyle().dominantBaseline</title>
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#dominant-baseline-property">
+<meta name="assert" content="dominant-baseline computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+test_computed_value("dominant-baseline", "auto");
+test_computed_value("dominant-baseline", "text-bottom");
+test_computed_value("dominant-baseline", "alphabetic");
+test_computed_value("dominant-baseline", "ideographic");
+test_computed_value("dominant-baseline", "middle");
+test_computed_value("dominant-baseline", "central");
+test_computed_value("dominant-baseline", "mathematical");
+test_computed_value("dominant-baseline", "hanging");
+test_computed_value("dominant-baseline", "text-top");
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-inline/parsing/dominant-baseline-invalid.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Inline Layout: parsing dominant-baseline with invalid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#dominant-baseline-property">
+<meta name="assert" content="dominant-baseline supports only the grammar 'auto | text-bottom | alphabetic | ideographic | middle | central | mathematical | hanging | text-top'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_invalid_value("dominant-baseline", "normal");
+test_invalid_value("dominant-baseline", "none");
+test_invalid_value("dominant-baseline", "alphabetic, ideographic");
+test_invalid_value("dominant-baseline", "middle central");
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-inline/parsing/dominant-baseline-valid.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Inline Layout: parsing dominant-baseline with valid values</title>
+<link rel="help" href="https://drafts.csswg.org/css-inline-3/#dominant-baseline-property">
+<meta name="assert" content="dominant-baseline supports the full grammar 'auto | text-bottom | alphabetic | ideographic | middle | central | mathematical | hanging | text-top'.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/parsing-testcommon.js"></script>
+</head>
+<body>
+<script>
+test_valid_value("dominant-baseline", "auto");
+test_valid_value("dominant-baseline", "text-bottom");
+test_valid_value("dominant-baseline", "alphabetic");
+test_valid_value("dominant-baseline", "ideographic");
+test_valid_value("dominant-baseline", "middle");
+test_valid_value("dominant-baseline", "central");
+test_valid_value("dominant-baseline", "mathematical");
+test_valid_value("dominant-baseline", "hanging");
+test_valid_value("dominant-baseline", "text-top");
+</script>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-overflow/overflow-body-propagation-001.tentative.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<title>CSS Overflow Test: Propagation of body overflow to viewport</title>
+<link rel="help" href="https://drafts.csswg.org/css-overflow/#overflow-propagation">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/pull/4148">
+<link rel="match" href="reference/overflow-body-propagation-ref.html">
+<style>
+  body {
+    overflow: scroll;
+    margin-top: 100px;
+  }
+</style>
+<body>The viewport should have scrollbars, not the body.</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-overflow/overflow-body-propagation-002.tentative.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<title>CSS Overflow Test: Do not propagate overflow of display:none body to viewport</title>
+<link rel="help" href="https://drafts.csswg.org/css-overflow-3/#overflow-propagation">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/pull/4148">
+<link rel="match" href="/css/reference/blank.html">
+<body style="display:none; overflow:scroll"></body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-overflow/overflow-body-propagation-003.tentative.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<title>CSS Overflow Test: Do not propagate overflow of display:contents body to viewport</title>
+<link rel="help" href="https://drafts.csswg.org/css-overflow-3/#overflow-propagation">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/pull/4148">
+<link rel="match" href="/css/reference/blank.html">
+<body style="display:contents; overflow:scroll"></body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-overflow/overflow-body-propagation-004.tentative.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<link rel="help" href="https://drafts.csswg.org/css-overflow/#overflow-propagation">
+<link rel="help" href="https://github.com/w3c/csswg-drafts/pull/4148">
+<link rel="match" href="reference/overflow-body-no-propagation-ref.html">
+<style>
+  html {
+    overflow: hidden;
+  }
+  body {
+    overflow: scroll;
+    margin-top: 100px;
+  }
+</style>
+<body>The body should have scrollbars, not the viewport.</body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-overflow/reference/overflow-body-no-propagation-ref.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<html style="overflow:auto">
+<title>CSS Overflow Test Reference</title>
+<body style="margin-top:100px;overflow:scroll">The body should have scrollbars, not the viewport.</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-overflow/reference/overflow-body-propagation-ref.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<html style="overflow:scroll">
+<title>CSS Overflow Test Reference</title>
+<body style="margin-top:100px">The viewport should have scrollbars, not the body.</body>
+</html>
--- a/testing/web-platform/tests/css/css-overflow/webkit-line-clamp-033.html
+++ b/testing/web-platform/tests/css/css-overflow/webkit-line-clamp-033.html
@@ -1,14 +1,14 @@
 <!doctype html>
 <meta charset="utf-8">
 <title>CSS Overflow: -webkit-line-clamp with an empty line</title>
 <link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
 <link rel="help" href="https://drafts.csswg.org/css-overflow-3/#webkit-line-clamp">
-<link rel="match" href="about:blank">
+<link rel="match" href="/css/reference/blank.html">
 <style>
 .clamp {
   display: -webkit-box;
   -webkit-box-orient: vertical;
   -webkit-line-clamp: 3;
   font: 16px / 32px serif;
   white-space: pre;
   background-color: yellow;
--- a/testing/web-platform/tests/css/css-properties-values-api/registered-property-cssom.html
+++ b/testing/web-platform/tests/css/css-properties-values-api/registered-property-cssom.html
@@ -47,32 +47,33 @@ test(function() {
   assert_equals(inlineStyle.getPropertyValue('--color'), 'hello');
   assert_equals(computedStyle.getPropertyValue('--length'), '0px');
   assert_equals(computedStyle.getPropertyValue('--color'), 'rgb(0, 0, 255)');
 }, "Formerly valid values are still readable from inline styles but are computed as the unset value");
 
 test(function() {
   inlineStyle.setProperty('--length', 'hi');
   inlineStyle.setProperty('--color', '20');
-  assert_equals(inlineStyle.getPropertyValue('--length'), '5');
-  assert_equals(inlineStyle.getPropertyValue('--color'), 'hello');
-}, "Values not matching the registered type can't be set");
+  assert_equals(inlineStyle.getPropertyValue('--length'), 'hi');
+  assert_equals(inlineStyle.getPropertyValue('--color'), '20');
+}, "Values not matching the registered type can still be set");
 
 test(function() {
   inlineStyle.removeProperty('--length');
   inlineStyle.setProperty('--color', '');
   assert_equals(inlineStyle.getPropertyValue('--length'), '');
   assert_equals(inlineStyle.getPropertyValue('--color'), '');
   assert_equals(computedStyle.getPropertyValue('--length'), '10px');
   assert_equals(computedStyle.getPropertyValue('--color'), 'rgb(255, 0, 0)');
 }, "Values can be removed from inline styles");
 
 test(function() {
-  sheetStyle.setProperty('--length', 'banana'); // Invalid, no change
-  assert_equals(computedStyle.getPropertyValue('--length'), '10px');
+  // 'banana' is not a valid <length>, but still accepted.
+  sheetStyle.setProperty('--length', 'banana');
+  assert_equals(computedStyle.getPropertyValue('--length'), '0px');
   sheetStyle.setProperty('--length', '20px');
   assert_equals(computedStyle.getPropertyValue('--length'), '20px');
   sheetStyle.setProperty('--length', 'initial');
   assert_equals(computedStyle.getPropertyValue('--length'), '0px');
 }, "Stylesheets can be modified by CSSOM");
 
 test(function() {
   inlineStyle.setProperty('--length', '30px');
--- a/testing/web-platform/tests/css/css-properties-values-api/typedom.html
+++ b/testing/web-platform/tests/css/css-properties-values-api/typedom.html
@@ -1,1019 +1,993 @@
 <!DOCTYPE html>
 <link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#css-style-value-reification" />
 <meta name="assert" content="Verifies that registered custom properties interact correctly with CSS Typed OM" />
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src="./resources/utils.js"></script>
 <style id=style>
     div {}
 </style>
 <div id=target></div>
 
 <script>
 
-// Properties are generated on demand, as `--prop-${g_counter}`.
-let g_counter = 1;
-
-// Generate a new property name.
-function gen_name() {
-    let name = `--prop-${g_counter}`;
-    g_counter++;
-    return name;
-}
-
-// Generate a property and return its name.
-function gen_prop(syntax, initialValue) {
-    let name = gen_name();
-    CSS.registerProperty({
-        name: name,
-        syntax: syntax,
-        initialValue: initialValue,
-        inherits: false
-    });
-    return name;
-}
-
 // Cleans style rules used for testing between every test.
 add_result_callback(function(){
     target.attributeStyleMap.clear();
     // Clears 'div' rule in #style:
     style.sheet.rules[0].styleMap.clear();
 });
 
+// In the following utility functions, the 'map' parameter (if present)
+// can be any StylePropertyMap. (Not StylePropertyMapReadOnly).
+
+// Verifies that get()/getAll() reifies the specified property to a
+// CSSUnparsedValue, with a string serialization equal to 'value'.
+function verify_map_get_unparsed(map, name, value) {
+    map.set(name, value);
+
+    let specifiedValue = map.get(name);
+    assert_true(specifiedValue instanceof CSSUnparsedValue);
+    assert_equals(specifiedValue.toString(), value);
+
+    let allSpecifiedValues = map.getAll(name);
+    assert_equals(allSpecifiedValues.length, 1);
+    assert_true(allSpecifiedValues[0] instanceof CSSUnparsedValue);
+    assert_equals(allSpecifiedValues[0].toString(), value);
+}
+
+// Verifies that the specified value is accepted by set().
+function verify_map_set(map, name, value) {
+    map.set(name, value);
+    assert_equals(map.get(name).toString(), value.toString());
+}
+
+// Verifies that the specified value is NOT accepted by set().
+function verify_map_not_set(map, name, value) {
+    assert_throws(new TypeError(), () => {
+        map.set(name, value);
+    });
+}
+
+// Verifies that the specified value is NOT accepted by append().
+function verify_map_no_append(map, name, value) {
+    assert_throws(new TypeError(), () => {
+        map.append(name, value);
+    });
+}
+
+// Verifies that the property 'name' shows up on iteration, that it's reified
+// as a CSSUnparsedValue, and that the string representation is equal to
+// 'value'.
+function verify_map_iteration_unparsed(map, name, value) {
+    map.set(name, value);
+    let result = Array.from(map).filter(e => e[0] == name)[0];
+    assert_equals(result.length, 2);
+    let iter_value = result[1];
+    assert_equals(iter_value.length, 1);
+    assert_true(iter_value[0] instanceof CSSUnparsedValue);
+    assert_equals(iter_value[0].toString(), value);
+}
+
+// Verifies that CSSStyleValue.parse/parseAll results in a CSSStyleValue with
+// the 'expected' type.
+function verify_parsed_type(prop, value, expected) {
+    let parse_value = CSSStyleValue.parse(prop, value);
+    let parse_all_value = CSSStyleValue.parseAll(prop, value);
+
+    assert_true(parse_value instanceof expected);
+    assert_true(parse_all_value.every(x => x instanceof expected))
+}
+
 // On the target element, verify that computed value of 'name' is an instance
 // of 'expected' and not an instance of CSSUnparsedValue.
 //
-// If 'value' is non-null, that value is first set on the attributeStyleMap
-// of the target.
-function assert_computed_type(name, value, expected) {
+// If 'value' is non-null, that value is first set using the style attribute
+// of the target element.
+function verify_computed_type(name, value, expected) {
     if (expected == CSSUnparsedValue) {
         throw 'CSSUnparsedValue may not be used as expected type';
     }
 
-    if (value != null) {
-        target.style = `${name}: ${value}`;
-    }
+    try {
+        if (value != null) {
+            target.style = `${name}: ${value}`;
+        }
 
-    let computedValue = target.computedStyleMap().get(name);
+        let computedValue = target.computedStyleMap().get(name);
 
-    assert_false(computedValue instanceof CSSUnparsedValue);
-    assert_true(computedValue instanceof expected);
-
-    if (value != null) {
-        target.style = '';
+        assert_false(computedValue instanceof CSSUnparsedValue);
+        assert_true(computedValue instanceof expected);
+    } finally {
+        if (value != null) {
+            target.style = '';
+        }
     }
 }
 
-function assert_attribute_get_type(styleDecl, propertyMap, syntax, value, expected) {
-    let name = gen_name();
-    styleDecl.setProperty(name, value);
-
-    assert_true(propertyMap.get(name) instanceof CSSUnparsedValue);
-
-    CSS.registerProperty({
-        name: name,
-        syntax: syntax,
-        initialValue: value,
-        inherits: false
-    });
-
-    if (expected == CSSStyleValue) {
-        assert_false(propertyMap.get(name) instanceof CSSUnparsedValue);
-    }
-
-    assert_true(propertyMap.get(name) instanceof expected);
+// Verifies that the property 'name' shows up on iteration, that it's reified
+// to the specified type, and that the string representation is equal to 'value'.
+function verify_computed_iteration_type(name, value, type) {
+    target.attributeStyleMap.set(name, value);
+    let result = Array.from(target.computedStyleMap()).filter(e => e[0] == name)[0];
+    assert_equals(result.length, 2);
+    let iter_value = result[1];
+    assert_equals(iter_value.length, 1);
+    assert_true(iter_value[0] instanceof type);
+    assert_equals(iter_value[0].toString(), value);
 }
 
-// computedStyleMap
+// Run the same test twice: once for each StylePropertyMap.
+//
+// https://drafts.css-houdini.org/css-typed-om-1/#stylepropertymap
+function test_specified_maps(func, description) {
+    test(function(){
+        func(target.attributeStyleMap)
+    }, description + ' [attributeStyleMap]');
+
+    test(function(){
+        let rule = style.sheet.rules[0];
+        func(rule.styleMap)
+    }, description + ' [styleMap]');
+}
+
+// StylePropertyMapReadOnly.get
 
 test(function(){
-    let name = gen_prop('*', 'if(){}');
+    let name = generate_property('*', 'if(){}');
     assert_true(target.computedStyleMap().get(name) instanceof CSSUnparsedValue);
 
     target.attributeStyleMap.set(name, 'as{}df');
     assert_true(target.computedStyleMap().get(name) instanceof CSSUnparsedValue);
     target.attributeStyleMap.delete(name);
 }, 'Computed * is reified as CSSUnparsedValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<angle>', '42deg'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<angle> | fail', 'fail'), '42deg', CSSUnitValue);
+    verify_computed_type(generate_property('<angle>'), null, CSSUnitValue);
+    verify_computed_type(generate_property('fail | <angle> '), '42deg', CSSUnitValue);
 }, 'Computed <angle> is reified as CSSUnitValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<color>', '#fefefe'), null, CSSStyleValue);
-    assert_computed_type(gen_prop('<color> | fail', 'fail'), null, CSSStyleValue);
+    verify_computed_type(generate_property('<color>'), null, CSSStyleValue);
+    verify_computed_type(generate_property('fail | <color> '), null, CSSStyleValue);
 }, 'Computed <color> is reified as CSSStyleValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<custom-ident>', 'none'), null, CSSKeywordValue);
-    assert_computed_type(gen_prop('<custom-ident> | <length>', '10px'), 'none', CSSKeywordValue);
+    verify_computed_type(generate_property('<custom-ident>'), null, CSSKeywordValue);
+    verify_computed_type(generate_property('<custom-ident> | <length>'), 'none', CSSKeywordValue);
 }, 'Computed <custom-ident> is reified as CSSKeywordValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<image>', 'url(thing.png)'), null, CSSImageValue);
-    assert_computed_type(gen_prop('<image> | fail', 'fail'), 'url(thing.png)', CSSImageValue);
+    verify_computed_type(generate_property('<image>'), null, CSSImageValue);
+    verify_computed_type(generate_property('fail | <image> '), 'url(thing.png)', CSSImageValue);
 }, 'Computed <image> [url] is reified as CSSImageValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<integer>', '100'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<integer> | fail', 'fail'), '100', CSSUnitValue);
+    verify_computed_type(generate_property('<integer>'), null, CSSUnitValue);
+    verify_computed_type(generate_property('fail | <integer> '), '100', CSSUnitValue);
 }, 'Computed <integer> is reified as CSSUnitValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<length-percentage>', '10%'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<length-percentage> | fail', 'fail'), '10%', CSSUnitValue);
+    verify_computed_type(generate_property('<length-percentage>'), null, CSSUnitValue);
+    verify_computed_type(generate_property('fail | <length-percentage> '), '10%', CSSUnitValue);
 }, 'Computed <length-percentage> [%] is reified as CSSUnitValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<length-percentage>', '10px'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<length-percentage> | fail', 'fail'), '10px', CSSUnitValue);
+    verify_computed_type(generate_property('<length-percentage>'), null, CSSUnitValue);
+    verify_computed_type(generate_property('fail | <length-percentage> '), '10px', CSSUnitValue);
 }, 'Computed <length-percentage> [px] is reified as CSSUnitValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<length-percentage>', 'calc(10px + 10%)'), null, CSSMathSum);
-    assert_computed_type(gen_prop('<length-percentage> | fail', 'fail'), 'calc(10px + 10%)', CSSMathSum);
+    verify_computed_type(generate_property({syntax: '<length-percentage>', initialValue: 'calc(10% + 10px)'}), null, CSSMathSum);
+    verify_computed_type(generate_property('fail | <length-percentage> '), 'calc(10px + 10%)', CSSMathSum);
 }, 'Computed <length-percentage> [px + %] is reified as CSSMathSum');
 
 test(function(){
-    assert_computed_type(gen_prop('<length>', '10px'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<length> | fail', 'fail'), '10px', CSSUnitValue);
+    verify_computed_type(generate_property('<length>'), null, CSSUnitValue);
+    verify_computed_type(generate_property('fail | <length> '), '10px', CSSUnitValue);
 }, 'Computed <length> is reified as CSSUnitValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<number>', '42'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<number> | fail', 'fail'), '42', CSSUnitValue);
+    verify_computed_type(generate_property('<number>'), null, CSSUnitValue);
+    verify_computed_type(generate_property('fail | <number> '), '42', CSSUnitValue);
 }, 'Computed <number> is reified as CSSUnitValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<percentage>', '10%'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<percentage> | fail', 'fail'), '10%', CSSUnitValue);
+    verify_computed_type(generate_property('<percentage>'), null, CSSUnitValue);
+    verify_computed_type(generate_property('fail | <percentage> '), '10%', CSSUnitValue);
 }, 'Computed <percentage> is reified as CSSUnitValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<resolution>', '300dpi'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<resolution> | fail', 'fail'), '300dpi', CSSUnitValue);
+    verify_computed_type(generate_property('<resolution>'), null, CSSUnitValue);
+    verify_computed_type(generate_property('fail | <resolution> '), '300dpi', CSSUnitValue);
 }, 'Computed <resolution> is reified as CSSUnitValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<time>', '42s'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<time> | fail', 'fail'), '42s', CSSUnitValue);
+    verify_computed_type(generate_property('<time>'), null, CSSUnitValue);
+    verify_computed_type(generate_property('fail | <time> '), '42s', CSSUnitValue);
 }, 'Computed <time> is reified as CSSUnitValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<url>', 'url(a)'), null, CSSStyleValue);
-    assert_computed_type(gen_prop('<url> | fail', 'fail'), 'url(a)', CSSStyleValue);
+    verify_computed_type(generate_property('<url>'), null, CSSStyleValue);
+    verify_computed_type(generate_property('fail | <url> '), 'url(a)', CSSStyleValue);
 }, 'Computed <url> is reified as CSSStyleValue');
 
 test(function(){
-    assert_computed_type(gen_prop('thing1 | THING2', 'thing1'), null, CSSKeywordValue);
-    assert_computed_type(gen_prop('thing1 | THING2 | <url>', 'url(fail)'), 'THING2', CSSKeywordValue);
+    verify_computed_type(generate_property('thing1 | THING2'), null, CSSKeywordValue);
+    verify_computed_type(generate_property('thing1 | THING2 | <url>'), 'THING2', CSSKeywordValue);
 }, 'Computed ident is reified as CSSKeywordValue');
 
 test(function(){
-    assert_computed_type(gen_prop('<length>+', '10px 20px'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<length>+', '0px 0px'), '10px 20px', CSSUnitValue);
+    verify_computed_type(generate_property('<length>+'), null, CSSUnitValue);
+    verify_computed_type(generate_property('<length>+'), '10px 20px', CSSUnitValue);
 }, 'First computed value correctly reified in space-separated list');
 
 test(function(){
-    assert_computed_type(gen_prop('<length>#', '10px, 20px'), null, CSSUnitValue);
-    assert_computed_type(gen_prop('<length>#', '0px, 0px'), '10px, 20px', CSSUnitValue);
+    verify_computed_type(generate_property('<length>#'), null, CSSUnitValue);
+    verify_computed_type(generate_property('<length>#'), '10px, 20px', CSSUnitValue);
 }, 'First computed value correctly reified in comma-separated list');
 
+// StylePropertyMapReadOnly.getAll
+
 test(function(){
-    let name = gen_prop('<length>+', '10px 20px');
+    let name = generate_property({syntax: '<length>+', initialValue: '10px 20px'});
     assert_equals(target.computedStyleMap().getAll(name).length, 2);
     assert_true(target.computedStyleMap().getAll(name).every(x => x instanceof CSSUnitValue));
 
     target.style = `${name}: 10px 20px 30px`;
     assert_equals(target.computedStyleMap().getAll(name).length, 3);
     assert_true(target.computedStyleMap().getAll(name).every(x => x instanceof CSSUnitValue));
 }, 'All computed values correctly reified in space-separated list');
 
 test(function(){
-    let name = gen_prop('<length>#', '10px, 20px');
+    let name = generate_property({syntax: '<length>#', initialValue: '10px, 20px'});
     assert_equals(target.computedStyleMap().getAll(name).length, 2);
     assert_true(target.computedStyleMap().getAll(name).every(x => x instanceof CSSUnitValue));
 
     target.style = `${name}: 10px, 20px, 30px`;
     assert_equals(target.computedStyleMap().getAll(name).length, 3);
     assert_true(target.computedStyleMap().getAll(name).every(x => x instanceof CSSUnitValue));
 }, 'All computed values correctly reified in comma-separated list');
 
-// attributeStyleMap.get / styleMap.get
-
-function test_style_property_map_get(test_fn, name_fn) {
-    let rule = style.sheet.rules[0];
+// StylePropertyMap.get/All
 
-    test(function(){
-        target.attributeStyleMap.clear();
-        test_fn(target.style, target.attributeStyleMap);
-    }, name_fn('attributeStyleMap'));
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('*'), 'foo');
+}, 'Specified * is reified as CSSUnparsedValue from get/getAll');
 
-    test(function(){
-        rule.styleMap.clear();
-        test_fn(rule.style, rule.styleMap);
-    }, name_fn('styleMap'));
-}
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('foo'), 'foo');
+}, 'Specified foo is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    let name1 = gen_prop('<length>', '100px');
-    let name2 = gen_prop('<length>', '0px');
-    styleDecl.setProperty(name2, `var(${name1})`);
-    assert_true(propertyMap.get(name2) instanceof CSSUnparsedValue);
-}, name => `StylePropertyMap.get returns CSSUnparsedValue for value with var references (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<angle>'), '10deg');
+}, 'Specified <angle> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    let name1 = gen_prop('<length>', '100px');
-    let name2 = gen_prop('<length>#', '0px');
-    styleDecl.setProperty(name2, `1px, var(${name1}), 3px`);
-    assert_true(propertyMap.get(name2) instanceof CSSUnparsedValue);
-}, name => `StylePropertyMap.get returns CSSUnparsedValue for value with var references in list (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<color>'), 'green');
+}, 'Specified <color> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '*', 'if(){}', CSSUnparsedValue);
-}, name => `StylePropertyMap.get returns CSSUnparsedValue for * (${name})`);
-
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<angle>', '42deg', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <angle> (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<custom-ident>'), 'foo');
+}, 'Specified <custom-ident> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<color>', '#fefefe', CSSStyleValue);
-}, name => `StylePropertyMap.get returns CSSStyleValue for <color> (${name})`);
-
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<custom-ident>', 'none', CSSKeywordValue);
-}, name => `StylePropertyMap.get returns CSSKeywordValue for <custom-ident> (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<image>'), 'url("a")');
+}, 'Specified <image> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<image>', 'url(thing.png)', CSSImageValue);
-}, name => `StylePropertyMap.get returns CSSImageValue for <image> (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<integer>'), '1');
+}, 'Specified <integer> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<integer>', '100', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <integer> (${name})`);
-
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<length-percentage>', '10%', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <length-percentage> [10%] (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<length-percentage>'), 'calc(10% + 10px)');
+}, 'Specified <length-percentage> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<length-percentage>', '10px', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <length-percentage> [10px] (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<length>'), '10px');
+}, 'Specified <length> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<length-percentage>', 'calc(10px + 10%)', CSSMathSum);
-}, name => `StylePropertyMap.get returns CSSMathSum for <length-percentage> [calc(10px + 10%)] (${name})`);
-
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<length>', '10px', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <length> (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<number>'), '1');
+}, 'Specified <number> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<number>', '42', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <number> (${name})`);
-
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<percentage>', '10%', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <percentage> (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<percentage>'), '10%');
+}, 'Specified <percentage> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<resolution>', '300dpi', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <resolution> (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<resolution>'), '10dpi');
+}, 'Specified <resolution> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<time>', '42s', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <time> (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<time>'), '1s');
+}, 'Specified <time> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<url>', 'url(a)', CSSStyleValue);
-}, name => `StylePropertyMap.get returns CSSStyleValue for <url> (${name})`);
-
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, 'thing1 | THING2', 'thing1', CSSKeywordValue);
-}, name => `StylePropertyMap.get returns CSSKeywordValue for thing1 | THING2 (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<transform-function>'), 'matrix(0, 0, 0, 0, 0, 0)');
+}, 'Specified <transform-function> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<length>+', '10px 20px', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <length>+ (${name})`);
-
-test_style_property_map_get(function(styleDecl, propertyMap){
-    assert_attribute_get_type(styleDecl, propertyMap, '<length>#', '10px 20px', CSSUnitValue);
-}, name => `StylePropertyMap.get returns CSSUnitValue for <length># (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<transform-list>'), 'matrix(0, 0, 0, 0, 0, 0)');
+}, 'Specified <transform-list> is reified as CSSUnparsedValue from get/getAll');
 
-// attributeStyleMap.getAll
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<url>'), 'url("a")');
+}, 'Specified <url> is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    let name = gen_prop('<length>+', '0px');
-    styleDecl.setProperty(name, '10px 20px 30px');
-    assert_equals(propertyMap.getAll(name).length, 3);
-    assert_true(propertyMap.getAll(name).every(x => x instanceof CSSUnitValue));
-}, name => `StylePropertyMap.getAll returns a list of CSSUnitValues for <length>+ (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<length>+'), '10px 11px');
+}, 'Specified <length>+ is reified as CSSUnparsedValue from get/getAll');
 
-test_style_property_map_get(function(styleDecl, propertyMap){
-    let name = gen_prop('<length>#', '0px');
-    styleDecl.setProperty(name, '10px, 20px, 30px');
-    assert_equals(propertyMap.getAll(name).length, 3);
-    assert_true(propertyMap.getAll(name).every(x => x instanceof CSSUnitValue));
-}, name => `StylePropertyMap.getAll returns a list of CSSUnitValues for <length># (${name})`);
+test_specified_maps(function(map){
+    verify_map_get_unparsed(map, generate_property('<length>#'), '10px, 11px');
+}, 'Specified <length># is reified as CSSUnparsedValue from get/getAll');
 
 // StylePropertyMap.set
 
-function test_style_property_map_set_using_property_map(propertyMapName, propertyMap, options) {
-    test(function(){
-        let name = gen_prop(options.syntax, options.initialValue);
-        propertyMap.clear();
+// The following strings are valid for the specified syntax, and should be
+// accepted by set().
 
-        let ensureArray = v => v.constructor === Array ? v : [v];
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('*'), 'foo');
+}, 'Specified string "foo" accepted by set() for syntax *');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('foo'), 'foo');
+}, 'Specified string "foo" accepted by set() for syntax foo');
 
-        for (let value of options.shouldAccept)
-            propertyMap.set(name, ...ensureArray(value));
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<angle>'), '10deg');
+}, 'Specified string "10deg" accepted by set() for syntax <angle>');
 
-        for (let value of options.shouldReject) {
-            assert_throws(new TypeError(), () => propertyMap.set(name, ...ensureArray(value)));
-        }
-    }, `StylePropertyMap.set accepts correct CSSStyleValues for ${options.syntax} (${propertyMapName})`);
-}
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<color>'), 'green');
+}, 'Specified string "green" accepted by set() for syntax <color>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<custom-ident>'), 'foo');
+}, 'Specified string "foo" accepted by set() for syntax <custom-ident>');
 
-// Verify that the correct CSSStyleValues are accepted/rejected for a registered
-// property with the specified syntax.
-//
-// The same test is performed twice: once for attributeStyleMap, and once
-// for styleMap.
-function test_style_property_map_set(options) {
-    test_style_property_map_set_using_property_map('attributeStyleMap', target.attributeStyleMap, options);
-    test_style_property_map_set_using_property_map('styleMap', style.sheet.rules[0].styleMap, options);
-}
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<image>'), 'url("a")');
+}, 'Specified string "url("a")" accepted by set() for syntax <image>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<integer>'), '1');
+}, 'Specified string "1" accepted by set() for syntax <integer>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length-percentage>'), 'calc(10% + 10px)');
+}, 'Specified string "calc(10% + 10px)" accepted by set() for syntax <length-percentage>');
 
-let unparsed = x => new CSSUnparsedValue([x]);
-let keyword = x => new CSSKeywordValue(x);
-let sum = (a, b) => new CSSMathSum(a, b);
-let url_image = x => CSSStyleValue.parse('background-image', x);
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length>'), '10px');
+}, 'Specified string "10px" accepted by set() for syntax <length>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<number>'), '1');
+}, 'Specified string "1" accepted by set() for syntax <number>');
 
-test_style_property_map_set({
-    syntax: '*',
-    initialValue: 'none',
-    shouldAccept: [unparsed('thing')],
-    shouldReject: [CSS.px(15), keyword('none')],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<percentage>'), '10%');
+}, 'Specified string "10%" accepted by set() for syntax <percentage>');
 
-test_style_property_map_set({
-    syntax: '<angle>',
-    initialValue: '0deg',
-    shouldAccept: [CSS.deg(42), CSS.turn(2), '42deg'],
-    shouldReject: [unparsed('42deg'), CSS.px(15), '50px', [CSS.deg(15), '10deg']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<resolution>'), '10dpi');
+}, 'Specified string "10dpi" accepted by set() for syntax <resolution>');
 
-test_style_property_map_set({
-    syntax: '<custom-ident>',
-    initialValue: 'none',
-    shouldAccept: [keyword('foo'), 'foo'],
-    shouldReject: [unparsed('foo'), CSS.px(15), '15px', [keyword('foo'), 'foo']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<time>'), '1s');
+}, 'Specified string "1s" accepted by set() for syntax <time>');
 
-test_style_property_map_set({
-    syntax: '<image>',
-    initialValue: 'url(a)',
-    shouldAccept: [url_image('url(b)'), 'url(b)'],
-    shouldReject: [unparsed('url(b)'), CSS.px(100), '50px', [url_image('url(1)'), 'url(2)']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<transform-function>'), 'matrix(0, 0, 0, 0, 0, 0)');
+}, 'Specified string "matrix(0, 0, 0, 0, 0, 0)" accepted by set() for syntax <transform-function>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<transform-list>'), 'matrix(0, 0, 0, 0, 0, 0)');
+}, 'Specified string "matrix(0, 0, 0, 0, 0, 0)" accepted by set() for syntax <transform-list>');
 
-test_style_property_map_set({
-    syntax: '<integer>',
-    initialValue: '0',
-    shouldAccept: [CSS.number(1), CSS.number(-42), '1', '-42', 'calc(2.4)'],
-    shouldReject: [unparsed('42'), CSS.px(100), '50px', [CSS.number(42), '42'], 'calc(2px + 1px)'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<url>'), 'url("a")');
+}, 'Specified string "url("a")" accepted by set() for syntax <url>');
 
-test_style_property_map_set({
-    syntax: '<length-percentage>',
-    initialValue: '0px',
-    shouldAccept: [CSS.percent(10), CSS.px(1), CSS.em(1), '10px', '10%'],
-    shouldReject: [unparsed('10%'), unparsed('10px'), CSS.dpi(1), 'url(b)', [CSS.percent(10), '10%']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length>+'), '10px 11px');
+}, 'Specified string "10px 11px" accepted by set() for syntax <length>+');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length>#'), '10px, 11px');
+}, 'Specified string "10px, 11px" accepted by set() for syntax <length>#');
+
+// The following strings are invalid for the specified syntax, but should
+// should be accepted by set().
 
-test_style_property_map_set({
-    syntax: '<length>',
-    initialValue: '0px',
-    shouldAccept: [CSS.px(10), CSS.em(10), CSS.vh(200), sum(CSS.px(10), CSS.em(20)), '10em', 'calc(10px + 10em)'],
-    shouldReject: [unparsed('10px'), CSS.percent(1), 'url(b)', [CSS.em(10), '10px']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('foo'), 'bar');
+}, 'Specified string "bar" accepted by set() for syntax foo');
 
-test_style_property_map_set({
-    syntax: '<number>',
-    initialValue: '0',
-    shouldAccept: [CSS.number(1337), CSS.number(-42.5), '1337', '-42.5'],
-    shouldReject: [unparsed('42'), CSS.px(15), '#fef', [CSS.number(-42.5), '42.5']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<angle>'), '10px');
+}, 'Specified string "10px" accepted by set() for syntax <angle>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<color>'), '10px');
+}, 'Specified string "10px" accepted by set() for syntax <color>');
 
-test_style_property_map_set({
-    syntax: '<percentage>',
-    initialValue: '0%',
-    shouldAccept: [CSS.percent(10), '10%'],
-    shouldReject: [unparsed('10%'), CSS.px(1), '#fef', [CSS.percent(10), '1%']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<custom-ident>'), '10px');
+}, 'Specified string "10px" accepted by set() for syntax <custom-ident>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<image>'), 'a');
+}, 'Specified string "a" accepted by set() for syntax <image>');
 
-test_style_property_map_set({
-    syntax: '<resolution>',
-    initialValue: '0dpi',
-    shouldAccept: [CSS.dpi(100), CSS.dpcm(10), CSS.dppx(50), '100dpi'],
-    shouldReject: [unparsed('42'), CSS.px(15), '#fef', [CSS.dpi(1), '2dpi']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<integer>'), 'float');
+}, 'Specified string "float" accepted by set() for syntax <integer>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length-percentage>'), 'red');
+}, 'Specified string "red" accepted by set() for syntax <length-percentage>');
 
-test_style_property_map_set({
-    syntax: '<time>',
-    initialValue: '0s',
-    shouldAccept: [CSS.s(42), CSS.ms(16), '16ms'],
-    shouldReject: [unparsed('42s'), CSS.px(15), '#fef', [CSS.s(5), '6s']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length>'), 'red');
+}, 'Specified string "red" accepted by set() for syntax <length>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<number>'), 'red');
+}, 'Specified string "red" accepted by set() for syntax <number>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<percentage>'), 'var(--x)');
+}, 'Specified string "var(--x)" accepted by set() for syntax <percentage>');
 
-test_style_property_map_set({
-    syntax: '<url>',
-    initialValue: 'url(a)',
-    shouldAccept: [url_image('url(b)')],
-    shouldReject: [unparsed('url(b)'), CSS.px(100), '#fef', [url_image('url(1)'), 'url(2)']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<resolution>'), 'blue');
+}, 'Specified string "blue" accepted by set() for syntax <resolution>');
 
-test_style_property_map_set({
-    syntax: '<transform-list>',
-    initialValue: 'translateX(0px)',
-    shouldAccept: [CSSStyleValue.parse('transform', 'translateX(10px)')],
-    shouldReject: [unparsed('transformX(10px'), CSS.px(100), '#fef'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<time>'), '1meter');
+}, 'Specified string "1meter" accepted by set() for syntax <time>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<transform-function>'), 'foo(0)');
+}, 'Specified string "foo(0)" accepted by set() for syntax <transform-function>');
 
-test_style_property_map_set({
-    syntax: 'none | thing | THING',
-    initialValue: 'none',
-    shouldAccept: [keyword('thing'), keyword('THING'), 'thing'],
-    shouldReject: [unparsed('thing'), CSS.px(15), keyword('notathing'), 'notathing', [keyword('thing'), keyword('thing')]],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<transform-list>'), 'bar(1)');
+}, 'Specified string "bar(1)" accepted by set() for syntax <transform-list>');
 
-test_style_property_map_set({
-    syntax: '<angle> | <length>',
-    initialValue: '0deg',
-    shouldAccept: [CSS.deg(42), CSS.turn(2), CSS.px(10), CSS.em(10), '10deg', '10px'],
-    shouldReject: [unparsed('42deg'), unparsed('20px'), CSS.s(1), '#fef', [CSS.deg(42), '21deg']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<url>'), 'a');
+}, 'Specified string "a" accepted by set() for syntax <url>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length>+'), 'a b');
+}, 'Specified string "a b" accepted by set() for syntax <length>+');
 
-// StylePropertyMap.set for list-valued properties:
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length>#'), 'a, b');
+}, 'Specified string "a, b" accepted by set() for syntax <length>#');
+
+// CSSUnparsedValue should always be accepted by any custom property,
+// regardless of registation status.
 
-test_style_property_map_set({
-    syntax: '<angle>+',
-    initialValue: '0deg',
-    shouldAccept: [CSS.deg(15), [CSS.deg(15), '10deg'], '15deg 10deg'],
-    shouldReject: [[CSS.deg(15), CSS.px(10)], '15deg 10px'],
-});
+const unparsed = CSSStyleValue.parse('--x', 'foo bar thing');
 
-test_style_property_map_set({
-    syntax: '<custom-ident>+',
-    initialValue: 'none',
-    shouldAccept: [keyword('foo'), [keyword('foo'), 'bar'], 'foo bar'],
-    shouldReject: [[keyword('foo'), CSS.px(10)], 'foo 10px'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('*'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax *');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('foo'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax foo');
 
-test_style_property_map_set({
-    syntax: '<image>+',
-    initialValue: 'url(a)',
-    shouldAccept: [url_image('url(1)'), [url_image('url(1)'), 'url(2)'], 'url(1) url(2)'],
-    shouldReject: [[url_image('url(1)'), CSS.px(10)], 'url(1) 10px'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<angle>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <angle>');
 
-test_style_property_map_set({
-    syntax: '<integer>+',
-    initialValue: '0',
-    shouldAccept: [CSS.number(42), [CSS.number(42), '42'], '42 42', 'calc(2.4) calc(2.6)'],
-    shouldReject: [[CSS.number(42), keyword('noint')], '42 noint', 'calc(2px + 2px)'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<color>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <color>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<custom-ident>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <custom-ident>');
 
-test_style_property_map_set({
-    syntax: '<length-percentage>+',
-    initialValue: '0px',
-    shouldAccept: [CSS.percent(10), [CSS.percent(10), '10%']],
-    shouldReject: [[CSS.percent(10), keyword('nolength')], '10% nolength'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<image>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <image>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<integer>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <integer>');
 
-test_style_property_map_set({
-    syntax: '<length>+',
-    initialValue: '0px',
-    shouldAccept: [CSS.em(10), [CSS.em(10), '10px']],
-    shouldReject: [[CSS.em(10), keyword('nolength'), '10em nolength']],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length-percentage>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <length-percentage>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <length>');
 
-test_style_property_map_set({
-    syntax: '<number>+',
-    initialValue: '0',
-    shouldAccept: [CSS.number(-42.5), [CSS.number(-42.5), '42.5'], '-42.5 42.5'],
-    shouldReject: [[CSS.number(-42.5), CSS.px(10)], '-42.5 10px'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<number>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <number>');
 
-test_style_property_map_set({
-    syntax: '<percentage>+',
-    initialValue: '0%',
-    shouldAccept: [CSS.percent(10), [CSS.percent(10), '1%'], '10% 1%'],
-    shouldReject: [[CSS.percent(10), keyword('foo')], '10% foo'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<percentage>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <percentage>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<resolution>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <resolution>');
 
-test_style_property_map_set({
-    syntax: '<resolution>+',
-    initialValue: '0dpi',
-    shouldAccept: [CSS.dpi(1), [CSS.dpi(1), '2dpi'], '1dpi 2dpi'],
-    shouldReject: [[CSS.dpi(1), keyword('foo')], '1dpi foo'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<time>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <time>');
+
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<transform-function>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <transform-function>');
 
-test_style_property_map_set({
-    syntax: '<time>+',
-    initialValue: '0s',
-    shouldAccept: [CSS.s(5), [CSS.s(5), '6s'], '5s 6s'],
-    shouldReject: [[CSS.s(5), keyword('foo')], '5s foo'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<transform-list>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <transform-list>');
 
-test_style_property_map_set({
-    syntax: '<url>+',
-    initialValue: 'url(a)',
-    shouldAccept: [url_image('url(1)'), [url_image('url(1)'), 'url(2)'], 'url(1) url(2)'],
-    shouldReject: [[url_image('url(1)'), CSS.px(10)], 'url(1) 10px'],
-});
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<url>'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <url>');
 
-test_style_property_map_set({
-    syntax: 'thing+',
-    initialValue: 'thing',
-    shouldAccept: [keyword('thing'), [keyword('thing'), 'thing'], 'thing thing'],
-    shouldReject: [[keyword('thing'), CSS.px(10)], 'thing 10px'],
-});
-
-test_style_property_map_set({
-    syntax: '<length>#',
-    initialValue: '0px',
-    shouldAccept: [CSS.em(10), [CSS.em(10), '10px']],
-    shouldReject: [[CSS.em(10), keyword('nolength'), '10em nolength']],
-});
-
-function test_append_for_property_map(propertyMapName, propertyMap, options) {
-    test(function(){
-        let name = gen_prop(options.syntax, options.initialValue);
-
-        let ensureArray = v => v.constructor === Array ? v : [v];
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length>+'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <length>+');
 
-        for (let value of options.values) {
-            propertyMap.clear();
-
-            if (value.base !== null)
-                propertyMap.set(name, ...ensureArray(value.base));
+test_specified_maps(function(map){
+    verify_map_set(map, generate_property('<length>#'), unparsed);
+}, 'CSSUnparsedValue is accepted via set() for syntax <length>#');
 
-            // If 'null' is expected, it means we expect the append to fail.
-            if (value.expect !== null) {
-                propertyMap.append(name, ...ensureArray(value.append));
-                let actual = Array.from(propertyMap.getAll(name)).join(' ');
-                assert_equals(actual, value.expect);
-            } else {
-                assert_throws(new TypeError(), () => propertyMap.append(name, ...ensureArray(value.append)));
-            }
-        }
-    }, `StylePropertyMap.append accepts correct CSSStyleValues for ${options.syntax} (${propertyMapName})`);
-}
-
-// Verify that the correct CSSStyleValues are accepted/rejected when
-// appending values to list-valued properties.
+// CSSStyleValues which aren't CSSUnparsedValues aren't accepted by set(),
+// even if they're a value which is compatible with the syntax.
 //
-// The same test is performed twice: once for attributeStyleMap, and once
-// for styleMap.
-function test_append(options) {
-    test_append_for_property_map('attributeStyleMap', target.attributeStyleMap, options);
-    test_append_for_property_map('styleMap', style.sheet.rules[0].styleMap, options);
-}
+// https://drafts.css-houdini.org/css-properties-values-api-1/#cssom
+const zero_matrix = CSSStyleValue.parse('transform', 'matrix(0, 0, 0, 0, 0, 0)');
+const image_value = CSSStyleValue.parse('background-image', 'url(a)');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('*'), new CSSKeywordValue('foo'));
+}, 'CSSKeywordValue rejected by set() for syntax *');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('foo'), new CSSKeywordValue('foo'));
+}, 'CSSKeywordValue rejected by set() for syntax foo');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<angle>'), CSS.deg(10));
+}, 'CSSUnitValue rejected by set() for syntax <angle>');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<custom-ident>'), new CSSKeywordValue('foo'));
+}, 'CSSKeywordValue rejected by set() for syntax <custom-ident>');
 
-test_append({
-    syntax: '<angle>+',
-    initialValue: '0deg',
-    values: [
-        { base: [CSS.deg(1)], append: [CSS.px(1)], expect: null },
-        { base: [CSS.deg(1)], append: [CSS.deg(2), CSS.px(1)], expect: null },
-        { base: [CSS.deg(1)], append: [CSS.deg(2), '1px'], expect: null },
-        { base: [CSS.deg(1)], append: [CSS.turn(2), CSS.deg(3)], expect: '1deg 2turn 3deg' },
-        { base: [CSS.deg(1), CSS.deg(2)], append: [CSS.deg(3)], expect: '1deg 2deg 3deg' },
-        { base: [CSS.deg(1)], append: [CSS.deg(2), '3deg'], expect: '1deg 2deg 3deg' },
-        { base: [CSS.deg(1)], append: [CSS.deg(2), '3turn 4deg'], expect: '1deg 2deg 3turn 4deg' },
-        { base: null, append: [CSS.deg(1), '2deg'], expect: '1deg 2deg' },
-    ],
-});
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<image>'), image_value);
+}, 'CSSImageValue rejected by set() for syntax <image>');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<integer>'), CSS.number(1));
+}, 'CSSUnitValue rejected by set() for syntax <integer>');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<length-percentage>'), CSS.px(10));
+}, 'CSSUnitValue rejected by set() for syntax <length-percentage>');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<length>'), CSS.px(10));
+}, 'CSSUnitValue rejected by set() for syntax <length>');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<number>'), CSS.number(10));
+}, 'CSSUnitValue rejected by set() for syntax <number>');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<percentage>'), CSS.percent(10));
+}, 'CSSUnitValue rejected by set() for syntax <percentage>');
 
-test_append({
-    syntax: '<custom-ident>+',
-    initialValue: 'none',
-    values: [
-        { base: [keyword('foo')], append: [CSS.px(1)], expect: null },
-        { base: [keyword('foo')], append: [keyword('bar'), CSS.px(1)], expect: null },
-        { base: [keyword('foo')], append: [keyword('bar'), '1px'], expect: null },
-        { base: [keyword('foo')], append: [keyword('bar'), keyword('baz')], expect: 'foo bar baz' },
-        { base: [keyword('foo'), keyword('bar')], append: [keyword('baz')], expect: 'foo bar baz' },
-        { base: [keyword('foo')], append: [keyword('bar'), 'baz'], expect: 'foo bar baz' },
-        { base: [keyword('foo')], append: [keyword('bar'), 'baz zim'], expect: 'foo bar baz zim' },
-        { base: null, append: [keyword('foo'), 'bar'], expect: 'foo bar' },
-    ],
-});
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<resolution>'), CSS.dpi(10));
+}, 'CSSUnitValue rejected by set() for syntax <resolution>');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<time>'), CSS.s(10));
+}, 'CSSUnitValue rejected by set() for syntax <time>');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<transform-list>'), zero_matrix);
+}, 'CSSTransformValue rejected by set() for syntax <transform-list>');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<length>+'), CSS.px(10), CSS.px(10));
+}, 'CSSUnitValue rejected by set() for syntax <length>+');
+
+test_specified_maps(function(map){
+    verify_map_not_set(map, generate_property('<length>#'), CSS.px(10), CSS.px(10));
+}, 'CSSUnitValue rejected by set() for syntax <length>#');
+
+// <color> has no CSSStyleValue subclass yet.
+// <url> has no CSSStyleValue subclass yet.
+// <transform-function> has no CSSStyleValue subclass yet.
 
-['<image>+', '<url>+'].forEach((syntax) => {
-    test_append({
-        syntax: syntax,
-        initialValue: 'url(0)',
-        values: [
-            { base: [url_image('url("1")')], append: [CSS.px(1)], expect: null },
-            { base: [url_image('url("1")')], append: [url_image('url("2")'), CSS.px(1)], expect: null },
-            { base: [url_image('url("1")')], append: [url_image('url("2")'), '1px'], expect: null },
-            { base: [url_image('url("1")')], append: [url_image('url("2")'), url_image('url("3")')], expect: 'url("1") url("2") url("3")' },
-            { base: [url_image('url("1")'), url_image('url("2")')], append: [url_image('url("3")')], expect: 'url("1") url("2") url("3")' },
-            { base: [url_image('url("1")')], append: [url_image('url("2")'), 'url("3")'], expect: 'url("1") url("2") url("3")' },
-            { base: [url_image('url("1")')], append: [url_image('url("2")'), 'url("3") url("4")'], expect: 'url("1") url("2") url("3") url("4")' },
-            { base: null, append: [url_image('url("1")'), 'url("2")'], expect: 'url("1") url("2")' },
-        ],
-    });
-});
+// StylePropertyMap.append
+
+// It is not allowed to append CSSStyleValues to custom properties, even
+// when the string matches the syntax of the custom property.
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('*'), 'a');
+}, 'Appending a string to * is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('foo+'), 'foo');
+}, 'Appending a string to foo+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<angle>+'), '10deg');
+}, 'Appending a string to <angle>+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<color>+'), 'red');
+}, 'Appending a string to <color>+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<custom-ident>+'), 'foo');
+}, 'Appending a string to <custom-ident>+ is not allowed');
 
-test_append({
-    syntax: '<integer>+',
-    initialValue: '0',
-    values: [
-        { base: [CSS.number(1)], append: [CSS.px(1)], expect: null },
-        { base: [CSS.number(1)], append: [CSS.number(2), CSS.px(1)], expect: null },
-        { base: [CSS.number(1)], append: [CSS.number(2), 'noint'], expect: null },
-        { base: [CSS.number(1)], append: [CSS.number(2), CSS.number(3)], expect: '1 2 3' },
-        { base: [CSS.number(1), CSS.number(2)], append: [CSS.number(3)], expect: '1 2 3' },
-        { base: [CSS.number(1)], append: [CSS.number(2), '3'], expect: '1 2 3' },
-        { base: [CSS.number(1)], append: [CSS.number(2), '3 4'], expect: '1 2 3 4' },
-        { base: null, append: [CSS.number(1), '2'], expect: '1 2' },
-    ],
-});
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<image>+'), 'url(a)');
+}, 'Appending a string to <image>+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<integer>+'), 'a');
+}, 'Appending a string to <integer>+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<length-percentage>+'), 'calc(10*% + 10px)');
+}, 'Appending a string to <length-percentage>+ is not allowed');
 
-test_append({
-    syntax: '<length-percentage>+',
-    initialValue: '0px',
-    values: [
-        { base: [CSS.px(1)], append: [keyword('nolength')], expect: null },
-        { base: [CSS.px(1)], append: [CSS.px(2), keyword('nolength')], expect: null },
-        { base: [CSS.px(1)], append: [CSS.px(2), 'nolength'], expect: null },
-        { base: [CSS.px(1)], append: [CSS.px(2), CSS.percent(3)], expect: '1px 2px 3%' },
-        { base: [CSS.px(1), CSS.px(2)], append: [CSS.percent(3)], expect: '1px 2px 3%' },
-        { base: [CSS.px(1)], append: [CSS.percent(2), '3px'], expect: '1px 2% 3px' },
-        { base: [CSS.px(1)], append: [CSS.px(2), '3% 4px'], expect: '1px 2px 3% 4px' },
-        { base: null, append: [CSS.px(1), '2%'], expect: '1px 2%' },
-    ],
-});
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<length>+'), '10px');
+}, 'Appending a string to <length>+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<number>+'), '1.3');
+}, 'Appending a string to <number>+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<percentage>+'), '10%');
+}, 'Appending a string to <percentage>+ is not allowed');
 
-test_append({
-    syntax: '<length>+',
-    initialValue: '0',
-    values: [
-        { base: [CSS.px(1)], append: [keyword('nolength')], expect: null },
-        { base: [CSS.px(1)], append: [CSS.px(2), keyword('nolength')], expect: null },
-        { base: [CSS.px(1)], append: [CSS.px(2), 'nolength'], expect: null },
-        { base: [CSS.px(1)], append: [CSS.em(2), CSS.px(3)], expect: '1px 2em 3px' },
-        { base: [CSS.px(1), CSS.em(2)], append: [CSS.vh(3)], expect: '1px 2em 3vh' },
-        { base: [CSS.px(1)], append: [CSS.em(2), '3px'], expect: '1px 2em 3px' },
-        { base: [CSS.px(1)], append: [CSS.px(2), '3em 4cm'], expect: '1px 2px 3em 4cm' },
-        { base: null, append: [CSS.vh(1), '2px'], expect: '1vh 2px' },
-    ],
-});
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<resolution>+'), '10dpi');
+}, 'Appending a string to <resolution>+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<time>+'), '1s');
+}, 'Appending a string to <time>+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<transform-function>+'), 'matrix(0, 0, 0, 0, 0, 0)');
+}, 'Appending a string to <transform-function>+ is not allowed');
 
-test_append({
-    syntax: '<number>+',
-    initialValue: '0',
-    values: [
-        { base: [CSS.number(-1)], append: [keyword('NaN')], expect: null },
-        { base: [CSS.number(-1)], append: [CSS.number(2.5), keyword('NaN')], expect: null },
-        { base: [CSS.number(-1)], append: [CSS.number(2.5), '1px'], expect: null },
-        { base: [CSS.number(-1)], append: [CSS.number(2.5), CSS.number(3.2)], expect: '-1 2.5 3.2' },
-        { base: [CSS.number(-1), CSS.number(2.5)], append: [CSS.number(3.2)], expect: '-1 2.5 3.2' },
-        { base: [CSS.number(-1)], append: [CSS.number(2.5), '3.2'], expect: '-1 2.5 3.2' },
-        { base: [CSS.number(-1)], append: [CSS.number(2.5), '3.2 4'], expect: '-1 2.5 3.2 4' },
-        { base: null, append: [CSS.number(-1), '2.5'], expect: '-1 2.5' },
-    ],
-});
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<transform-list>'), 'matrix(0, 0, 0, 0, 0, 0)');
+}, 'Appending a string to <transform-list> is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<url>+'), 'url(a)');
+}, 'Appending a string to <url>+ is not allowed');
+
+test_specified_maps(function(map){
+    verify_map_no_append(map, generate_property('<length>#'), '10px');
+}, 'Appending a string to <length># is not allowed');
+
+// It is not allowed to append CSSStyleValues to custom properties, even
+// when the CSSStyleValue matches the syntax of the custom property.
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('*'), new CSSKeywordValue('foo'));
+}, 'Appending a CSSKeywordValue to * is not allowed');
 
-test_append({
-    syntax: '<percentage>+',
-    initialValue: '0%',
-    values: [
-        { base: [CSS.percent(1)], append: [CSS.px(1)], expect: null },
-        { base: [CSS.percent(1)], append: [CSS.percent(2), CSS.px(1)], expect: null },
-        { base: [CSS.percent(1)], append: [CSS.percent(2), '1px'], expect: null },
-        { base: [CSS.percent(1)], append: [CSS.percent(2), CSS.percent(3)], expect: '1% 2% 3%' },
-        { base: [CSS.percent(1), CSS.percent(2)], append: [CSS.percent(3)], expect: '1% 2% 3%' },
-        { base: [CSS.percent(1)], append: [CSS.percent(2), '3%'], expect: '1% 2% 3%' },
-        { base: [CSS.percent(1)], append: [CSS.percent(2), '3% 4%'], expect: '1% 2% 3% 4%' },
-        { base: null, append: [CSS.percent(1), '2%'], expect: '1% 2%' },
-    ],
-});
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('foo+'), new CSSKeywordValue('foo'));
+}, 'Appending a CSSKeywordValue to foo+ is not allowed');
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<angle>+'), CSS.deg(10));
+}, 'Appending a CSSUnitValue to <angle>+ is not allowed');
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<custom-ident>+'), new CSSKeywordValue('foo'));
+}, 'Appending a CSSKeywordValue to <custom-ident>+ is not allowed');
 
-test_append({
-    syntax: '<resolution>+',
-    initialValue: '0dpi',
-    values: [
-        { base: [CSS.dpi(1)], append: [CSS.px(1)], expect: null },
-        { base: [CSS.dpi(1)], append: [CSS.dpi(2), CSS.px(1)], expect: null },
-        { base: [CSS.dpi(1)], append: [CSS.dpi(2), '1px'], expect: null },
-        { base: [CSS.dpi(1)], append: [CSS.dpi(2), CSS.dpi(3)], expect: '1dpi 2dpi 3dpi' },
-        { base: [CSS.dpi(1), CSS.dpi(2)], append: [CSS.dpi(3)], expect: '1dpi 2dpi 3dpi' },
-        { base: [CSS.dpi(1)], append: [CSS.dpi(2), '3dpi'], expect: '1dpi 2dpi 3dpi' },
-        { base: [CSS.dpi(1)], append: [CSS.dpi(2), '3dpi 4dpi'], expect: '1dpi 2dpi 3dpi 4dpi' },
-        { base: null, append: [CSS.dpi(1), '2dpi'], expect: '1dpi 2dpi' },
-    ],
-});
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<image>+'), image_value);
+}, 'Appending a CSSImageValue to <image>+ is not allowed');
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<integer>+'), CSS.number(1));
+}, 'Appending a CSSUnitValue to <integer>+ is not allowed');
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<length-percentage>+'), CSS.px(10));
+}, 'Appending a CSSUnitValue to <length-percentage>+ is not allowed');
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<length>+'), CSS.px(10));
+}, 'Appending a CSSUnitValue to <length>+ is not allowed');
 
-test_append({
-    syntax: '<time>+',
-    initialValue: '0s',
-    values: [
-        { base: [CSS.s(1)], append: [CSS.px(1)], expect: null },
-        { base: [CSS.s(1)], append: [CSS.s(2), CSS.px(1)], expect: null },
-        { base: [CSS.s(1)], append: [CSS.ms(2), '1px'], expect: null },
-        { base: [CSS.s(1)], append: [CSS.ms(2), CSS.s(3)], expect: '1s 2ms 3s' },
-        { base: [CSS.s(1), CSS.s(2)], append: [CSS.s(3)], expect: '1s 2s 3s' },
-        { base: [CSS.s(1)], append: [CSS.s(2), '3s'], expect: '1s 2s 3s' },
-        { base: [CSS.s(1)], append: [CSS.s(2), '3ms 4s'], expect: '1s 2s 3ms 4s' },
-        { base: null, append: [CSS.s(1), '2s'], expect: '1s 2s' },
-    ],
-});
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<number>+'), CSS.number(10));
+}, 'Appending a CSSUnitValue to <number>+ is not allowed');
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<percentage>+'), CSS.percent(10));
+}, 'Appending a CSSUnitValue to <percentage>+ is not allowed');
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<resolution>+'), CSS.dpi(10));
+}, 'Appending a CSSUnitValue to <resolution>+ is not allowed');
 
-test_append({
-    syntax: 'foo+',
-    initialValue: 'foo',
-    values: [
-        { base: [keyword('foo')], append: [CSS.px(1)], expect: null },
-        { base: [keyword('foo')], append: [keyword('foo'), CSS.px(1)], expect: null },
-        { base: [keyword('foo')], append: [keyword('foo'), '1px'], expect: null },
-        { base: [keyword('foo')], append: [keyword('foo'), keyword('foo')], expect: 'foo foo foo' },
-        { base: [keyword('foo'), keyword('foo')], append: [keyword('foo')], expect: 'foo foo foo' },
-        { base: [keyword('foo')], append: [keyword('foo'), 'foo'], expect: 'foo foo foo' },
-        { base: [keyword('foo')], append: [keyword('foo'), 'foo foo'], expect: 'foo foo foo foo' },
-        { base: null, append: [keyword('foo'), keyword('foo')], expect: 'foo foo' },
-    ],
-});
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<time>+'), CSS.s(10));
+}, 'Appending a CSSUnitValue to <time>+ is not allowed');
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<transform-list>'), zero_matrix);
+}, 'Appending a CSSKeywordValue to <transform-list> is not allowed');
+
+test_specified_maps(function(map) {
+    verify_map_no_append(map, generate_property('<length>#'), CSS.px(10));
+}, 'Appending a CSSUnitValue to <length># is not allowed');
+
+// <color> has no CSSStyleValue subclass yet.
+// <url> has no CSSStyleValue subclass yet.
+// <transform-function> has no CSSStyleValue subclass yet.
 
 // CSSStyleValue.parse/parseAll
 
-function assert_parsed_type(prop, value, expected) {
-    let parse_value = CSSStyleValue.parse(prop, value);
-    let parse_all_value = CSSStyleValue.parseAll(prop, value);
+test(function(){
+    verify_parsed_type(generate_property('*'), 'while(){}', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax *', CSSUnparsedValue);
 
-    assert_true(parse_value instanceof expected);
-    assert_true(parse_all_value.every(x => x instanceof expected))
+test(function(){
+    verify_parsed_type(generate_property('<angle>'), '42deg', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <angle>');
 
-    // If CSSStyleValue is expected, the values must be exactly CSSStyleValue.
-    // This is because CSSUnparsedValues are also CSSStyleValues, which would be
-    // wrong in this case.
-    if (expected == CSSStyleValue) {
-        assert_equals(parse_value.constructor, CSSStyleValue);
-        assert_true(parse_all_value.every(x => x.constructor == CSSStyleValue));
-    }
-}
+test(function(){
+    verify_parsed_type(generate_property('<color>'), '#fefefe', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <color>');
+
+test(function(){
+    verify_parsed_type(generate_property('<custom-ident> | <length>'), 'none', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <custom-ident> | <length>');
 
 test(function(){
-    assert_parsed_type(gen_prop('*', 'if(){}'), 'while(){}', CSSUnparsedValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for *');
+    verify_parsed_type(generate_property('<image>'), 'url(thing.png)', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <image>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<angle> | fail', 'fail'), '42deg', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnitValue for <angle>');
+    verify_parsed_type(generate_property('<integer>'), '100', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <integer>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<color> | fail', 'fail'), '#fefefe', CSSStyleValue);
-}, 'CSSStyleValue.parse[All] returns CSSStyleValue for <color>');
+    verify_parsed_type(generate_property('<length-percentage>'), '10%', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <length-percentage> (10%)');
 
 test(function(){
-    assert_parsed_type(gen_prop('<custom-ident> | <length>', '10px'), 'none', CSSKeywordValue);
-}, 'CSSStyleValue.parse[All] returns CSSKeywordValue for <custom-ident>');
+    verify_parsed_type(generate_property('<length-percentage>'), '10px', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <length-percentage> (10px)');
 
 test(function(){
-    assert_parsed_type(gen_prop('<image> | fail', 'fail'), 'url(thing.png)', CSSImageValue);
-}, 'CSSStyleValue.parse[All] returns CSSImageValue for <image> [url]');
-
-test(function(){
-    assert_parsed_type(gen_prop('<integer> | fail', 'fail'), '100', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnitValue for <integer>');
+    verify_parsed_type(generate_property('<length-percentage>'), 'calc(10px + 10%)', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <length-percentage> (calc(10px + 10%))');
 
 test(function(){
-    assert_parsed_type(gen_prop('<length-percentage> | fail', 'fail'), '10%', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnitValue for <length-percentage> [%]');
+    verify_parsed_type(generate_property('<length>'), '10px', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <length>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<length-percentage> | fail', 'fail'), '10px', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnitValue for <length-percentage> [px]');
+    verify_parsed_type(generate_property('<number>'), '42', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <number>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<length-percentage> | fail', 'fail'), 'calc(10px + 10%)', CSSMathSum);
-}, 'CSSStyleValue.parse[All] returns CSSMathSum for <length-percentage> [px + %]');
+    verify_parsed_type(generate_property('<percentage>'), '10%', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <percentage>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<length> | fail', 'fail'), '10px', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnitValue for <length>');
+    verify_parsed_type(generate_property('<resolution>'), '300dpi', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <resolution>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<number> | fail', 'fail'), '42', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnitValue for <number>');
+    verify_parsed_type(generate_property('<time>'), '42s', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <time>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<percentage> | fail', 'fail'), '10%', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnitValue for <percentage>');
+    verify_parsed_type(generate_property('<transform-function>'), 'matrix(0, 0, 0, 0, 0, 0)', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <transform-function>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<resolution> | fail', 'fail'), '300dpi', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnitValue for <resolution>');
-
-test(function(){
-    assert_parsed_type(gen_prop('<time> | fail', 'fail'), '42s', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns CSSUnitValue for <time>');
+    verify_parsed_type(generate_property('<transform-list>'), 'matrix(0, 0, 0, 0, 0, 0)', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <transform-list>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<url> | fail', 'fail'), 'url(a)', CSSStyleValue);
-}, 'CSSStyleValue.parse[All] returns CSSStyleValue for <url>');
+    verify_parsed_type(generate_property('<url>'), 'url(a)', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <url>');
 
 test(function(){
-    assert_parsed_type(gen_prop('thing1 | THING2 | <url>', 'url(fail)'), 'THING2', CSSKeywordValue);
-}, 'CSSStyleValue.parse[All] returns CSSKeywordValue for ident');
+    verify_parsed_type(generate_property('thing1 | THING2 | <url>'), 'THING2', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax thing1 | THING2 | <url>');
 
 test(function(){
-    assert_parsed_type(gen_prop('<length>+ | fail', 'fail'), '10px 20px', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns list of CSSUnitValues for <length>+');
+    verify_parsed_type(generate_property('<length>+'), '10px 20px', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <length>+');
 
 test(function(){
-    assert_parsed_type(gen_prop('<length># | fail', 'fail'), '10px, 20px', CSSUnitValue);
-}, 'CSSStyleValue.parse[All] returns list of CSSUnitValues for <length>#');
+    verify_parsed_type(generate_property('<length>#'), '10px, 20px', CSSUnparsedValue);
+}, 'CSSStyleValue.parse[All] returns CSSUnparsedValue for syntax <length>#');
 
 // Direct CSSStyleValue objects:
 
-function gen_all_props() {
-    return [
-        gen_prop('*', 'foo'),
-        gen_prop('foo', 'foo'),
-        gen_prop('<angle>', '0deg'),
-        gen_prop('<color>', 'rgb(1, 2, 3)'),
-        gen_prop('<custom-ident>', 'thing'),
-        gen_prop('<image>', 'url(a)'),
-        gen_prop('<integer>', '0'),
-        gen_prop('<length-percentage>', 'calc(10px + 10%)'),
-        gen_prop('<length>', '0px'),
-        gen_prop('<number>', '0.5'),
-        gen_prop('<percentage>', '0%'),
-        gen_prop('<resolution>', '0dpi'),
-        gen_prop('<time>', '0s'),
-        gen_prop('<transform-function>', 'rotateX(0deg)'),
-        gen_prop('<transform-list>', 'rotateX(0deg)'),
-        gen_prop('<url>', 'url(a)')
-    ];
-}
+test_specified_maps(function(map){
+    for (let syntax of all_syntaxes()) {
+        let name = generate_property(syntax);
 
-test(function(){
-    let props0 = gen_all_props();
-    let props1 = gen_all_props();
-
-    for (let i = 0; i < props0.length; i++) {
-        let prop0 = props0[i];
-        let prop1 = props1[i];
-
-        // Abuse computedStyleMap to get the initialValue (just to get some
-        // value that will parse for prop0/1's syntax).
-        let initialValue = target.computedStyleMap().get(prop0);
+        let initialValue = target.computedStyleMap().get(name);
 
         // We only care about direct CSSStyleValue instances in this test.
         // Ultimately, in some future version of CSS TypedOM, we may have no
         // direct CSSStyleValue instances at all, which is fine.
         if (initialValue.constructor !== CSSStyleValue) {
             continue;
         }
 
-        let value = CSSStyleValue.parse(prop0, initialValue.toString());
+        // Verify that direct CSSStyleValues are rejected by set(). Two things
+        // should prevent this: 1) direct CSSStyleValues are not
+        // CSSUnparsedValues, and 2) direct CSSStyleValues are only valid for
+        // the property they were reified from.
+        verify_map_not_set(map, generate_property(syntax), initialValue);
+    }
+}, 'Direct CSSStyleValue may not be set');
+
+// StylePropertyMap iteration
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('*'), 'foo');
+}, 'Specified * is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('foo'), 'foo');
+}, 'Specified foo is reified CSSUnparsedValue by iterator');
 
-        // A value parsed for prop0 must be assignable to prop0.
-        target.attributeStyleMap.clear();
-        target.attributeStyleMap.set(prop0, value); // Don't throw.
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<angle>'), '10deg');
+}, 'Specified <angle> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<color>'), 'green');
+}, 'Specified <color> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<custom-ident>'), 'foo');
+}, 'Specified <custom-ident> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<image>'), 'url("a")');
+}, 'Specified <image> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<integer>'), '1');
+}, 'Specified <integer> is reified CSSUnparsedValue by iterator');
 
-        // A value parsed for prop0 must not be assignable to prop1, even if
-        // the properties have compatible syntaxes.
-        assert_throws(new TypeError(), () => {
-            target.attributeStyleMap.clear();
-            target.attributeStyleMap.set(prop1, value);
-        });
-    }
-}, 'Direct CSSStyleValue instances are tied to their associated property');
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<length-percentage>'), 'calc(10% + 10px)');
+}, 'Specified <length-percentage> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<length>'), '10px');
+}, 'Specified <length> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<number>'), '1');
+}, 'Specified <number> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<percentage>'), '10%');
+}, 'Specified <percentage> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<resolution>'), '10dpi');
+}, 'Specified <resolution> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<time>'), '1s');
+}, 'Specified <time> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<transform-function>'), 'matrix(0, 0, 0, 0, 0, 0)');
+}, 'Specified <transform-function> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<transform-list>'), 'matrix(0, 0, 0, 0, 0, 0)');
+}, 'Specified <transform-list> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<url>'), 'url("a")');
+}, 'Specified <url> is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<length>+'), '10px 11px');
+}, 'Specified <length>+ is reified CSSUnparsedValue by iterator');
+
+test_specified_maps(function(map){
+    verify_map_iteration_unparsed(map, generate_property('<length>#'), '10px, 11px');
+}, 'Specified <length># is reified CSSUnparsedValue by iterator');
 
 // StylePropertyMapReadOnly iteration
 
 test(function(){
-    let name = gen_prop('<length>', '10px');
+    let name = generate_property({syntax: '<length>', initialValue: '10px'});
     let result = Array.from(target.computedStyleMap()).filter(e => e[0] == name)[0];
     assert_true(typeof(result) !== 'undefined');
 }, 'Registered property with initial value show up on iteration of computedStyleMap');
 
-// Verifies that iterating a StylePropertyMap[ReadOnly] yields correctly
-// typed objects for a given syntax/value.
-function test_iteration_type_for_property_map(propertyMapName, propertyMap, options) {
-    test(function(){
-        let name = gen_prop(options.syntax, options.initialValue);
-        if (propertyMap instanceof StylePropertyMap) {
-            // Only set the value if the propertyMap is mutable.
-            propertyMap.set(name, options.value);
-        }
-        let result = Array.from(propertyMap).filter(e => e[0] == name)[0];
-        let value = result[1];
-        assert_true(options.expect(value));
-    }, `Iteration on ${propertyMapName} produces correct type for ${options.syntax}`);
-}
+test(function(){
+    verify_computed_iteration_type(generate_property('*'), 'thing', CSSUnparsedValue);
+}, 'Computed * is reified as CSSUnparsedValue by iterator');
 
-function test_iteration_type(options) {
-    test_iteration_type_for_property_map('computedStyleMap', target.computedStyleMap(), options);
-    test_iteration_type_for_property_map('attributeStyleMap', target.attributeStyleMap, options);
-    test_iteration_type_for_property_map('styleMap', style.sheet.rules[0].styleMap, options);
-}
+test(function(){
+    verify_computed_iteration_type(generate_property('<angle>'), '42deg', CSSUnitValue);
+}, 'Computed <angle> is reified as CSSUnitValue by iterator');
 
-test_iteration_type({
-    syntax: '*',
-    initialValue: 'none',
-    value: 'thing',
-    expect: v => v.length == 1 && v[0] instanceof CSSUnparsedValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('<custom-ident>'), 'thing', CSSKeywordValue);
+}, 'Computed <custom-ident> is reified as CSSKeywordValue by iterator');
 
-test_iteration_type({
-    syntax: '<angle>',
-    initialValue: '0deg',
-    value: '42deg',
-    expect: v => v.length == 1 && v[0] instanceof CSSUnitValue,
-});
-
-test_iteration_type({
-    syntax: '<custom-ident>',
-    initialValue: 'none',
-    value: 'thing',
-    expect: v => v.length == 1 && v[0] instanceof CSSKeywordValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('<image>'), 'url(\"a\")', CSSImageValue);
+}, 'Computed <image> is reified as CSSImageValue by iterator');
 
-test_iteration_type({
-    syntax: '<image>',
-    initialValue: 'url(a)',
-    value: 'url(b)',
-    expect: v => v.length == 1 && v[0] instanceof CSSImageValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('<integer>'), '100', CSSUnitValue);
+}, 'Computed <integer> is reified as CSSUnitValue by iterator');
 
-test_iteration_type({
-    syntax: '<integer>',
-    initialValue: '0',
-    value: '100',
-    expect: v => v.length == 1 && v[0] instanceof CSSUnitValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('<length>'), '10px', CSSUnitValue);
+}, 'Computed <length> is reified as CSSUnitValue by iterator');
 
-test_iteration_type({
-    syntax: '<length>',
-    initialValue: '0px',
-    value: '10px',
-    expect: v => v.length == 1 && v[0] instanceof CSSUnitValue,
-});
-
-test_iteration_type({
-    syntax: '<number>',
-    initialValue: '0',
-    value: '42',
-    expect: v => v.length == 1 && v[0] instanceof CSSUnitValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('<number>'), '42', CSSUnitValue);
+}, 'Computed <number> is reified as CSSUnitValue by iterator');
 
-test_iteration_type({
-    syntax: '<percentage>',
-    initialValue: '0%',
-    value: '10%',
-    expect: v => v.length == 1 && v[0] instanceof CSSUnitValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('<percentage>'), '10%', CSSUnitValue);
+}, 'Computed <percentage> is reified as CSSUnitValue by iterator');
 
-test_iteration_type({
-    syntax: '<resolution>',
-    initialValue: '0dpi',
-    value: '300dpi',
-    expect: v => v.length == 1 && v[0] instanceof CSSUnitValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('<resolution>'), '300dppx', CSSUnitValue);
+}, 'Computed <resolution> is reified as CSSUnitValue by iterator');
 
-test_iteration_type({
-    syntax: '<time>',
-    initialValue: '0s',
-    value: '10s',
-    expect: v => v.length == 1 && v[0] instanceof CSSUnitValue,
-});
-
-test_iteration_type({
-    syntax: '<url>',
-    initialValue: 'url(a)',
-    value: 'url(b)',
-    expect: v => v.length == 1 && v[0].constructor === CSSStyleValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('<time>'), '10s', CSSUnitValue);
+}, 'Computed <time> is reified as CSSUnitValue by iterator');
 
-test_iteration_type({
-    syntax: 'none | thing | THING',
-    initialValue: 'none',
-    value: 'THING',
-    expect: v => v.length == 1 && v[0] instanceof CSSKeywordValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('none | thing | THING'), 'THING', CSSKeywordValue);
+}, 'Computed none | thing | THING is reified as CSSKeywordValue by iterator');
 
-test_iteration_type({
-    syntax: '<angle> | <length>',
-    initialValue: '0deg',
-    value: '10px',
-    expect: v => v.length == 1 && v[0] instanceof CSSUnitValue,
-});
+test(function(){
+    verify_computed_iteration_type(generate_property('<angle> | <length>'), '10px', CSSUnitValue);
+}, 'Computed <angle> | <length> is reified as CSSUnitValue by iterator');
 
 </script>
--- a/testing/web-platform/tests/css/css-properties-values-api/var-reference-registered-properties-cycles.html
+++ b/testing/web-platform/tests/css/css-properties-values-api/var-reference-registered-properties-cycles.html
@@ -137,8 +137,46 @@ test(function() {
 
     assert_equals(computedStyle.getPropertyValue('--registered-4-b'), 'meow');
     assert_equals(computedStyle.getPropertyValue('--registered-4-c'), 'circle');
     assert_equals(computedStyle.getPropertyValue('--unregistered-4-b'), 'woof');
     assert_equals(computedStyle.getPropertyValue('--unregistered-4-c'), '');
     assert_equals(computedStyle.transitionProperty, 'water');
 }, "A var() cycle between a syntax:'*' property and an unregistered property is handled correctly.");
 </script>
+
+<style>
+#test5_parent {
+    --registered-5-c:foo;
+    --registered-5-d:bar;
+    --registered-5-e:baz;
+    color: green;
+}
+#test5 {
+    --registered-5-a:var(--registered-5-b,hello);
+    --registered-5-b:var(--registered-5-a,world);
+
+    --registered-5-c:var(--registered-5-a);
+    --registered-5-d:var(--registered-5-b);
+    --registered-5-e:var(--unknown);
+    color: var(--registered-5-e);
+}
+</style>
+<div id=test5_parent>
+    <div id=test5></div>
+</div>
+<script>
+test(function() {
+    CSS.registerProperty({name: '--registered-5-a', syntax: '*', inherits: true});
+    CSS.registerProperty({name: '--registered-5-b', syntax: '*', inherits: true});
+    CSS.registerProperty({name: '--registered-5-c', syntax: '*', inherits: true});
+    CSS.registerProperty({name: '--registered-5-d', syntax: '*', inherits: true});
+    CSS.registerProperty({name: '--registered-5-e', syntax: '*', inherits: true});
+
+    let computedStyle = getComputedStyle(test5);
+    assert_equals(computedStyle.getPropertyValue('--registered-5-a'), '');
+    assert_equals(computedStyle.getPropertyValue('--registered-5-b'), '');
+    assert_equals(computedStyle.getPropertyValue('--registered-5-c'), 'foo');
+    assert_equals(computedStyle.getPropertyValue('--registered-5-d'), 'bar');
+    assert_equals(computedStyle.getPropertyValue('--registered-5-e'), 'baz');
+    assert_equals(computedStyle.getPropertyValue('color'), 'rgb(0, 128, 0)');
+}, "Invalid at computed-value time triggers 'unset' behavior");
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-scrollbars/scrollbars-chrome-bug-001-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<link rel="help" href="https://crbug.com/926167">
+<style>
+
+#container {
+  width: 200px;
+  height: 150px;
+  border: 1px solid black;
+  overflow: scroll;
+}
+#target {
+  width: 100px;
+  height: 50px;
+  background: green;
+  transform: scale(4);
+}
+</style>
+<!--  -->
+<div id="container">
+  <div id="target"></div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-scrollbars/scrollbars-chrome-bug-001.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>CSS Overflow: css-overflow-3</title>
+<link rel="author" href="mailto:atotic@google.com">
+<link rel="help" href="https://crbug.com/926167">
+<link rel="match" href="scrollbars-chrome-bug-001-ref.html">
+<meta name="assert" content="scrollbars keep up to date with a changing transform">
+<style>
+
+#container {
+  width: 200px;
+  height: 150px;
+  border: 1px solid black;
+  overflow: scroll;
+}
+#target {
+  width: 100px;
+  height: 50px;
+  background: green;
+  transform: scale(1);
+}
+</style>
+<!--  -->
+<div id="container">
+  <div id="target"></div>
+</div>
+<script>
+  // 1st transform triggers layer creation, and full layout.
+  // 2nd transform just updates overflow, which does not update scrollbars.
+  // This triggers the bug.
+  document.body.offsetTop;
+  document.querySelector("#target").style.transform = "scale(1.5)";
+  document.body.offsetTop;
+  document.querySelector("#target").style.transform = "scale(4.0)";
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-transforms/perspective-transforms-equivalence-ref.html
@@ -0,0 +1,40 @@
+<!doctype HTML>
+<meta charset="utf8">
+<title>Perspective with transforms equivalencies.</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<style>
+
+#container {
+  transform: translate(-200px, -200px);
+  width: 500px;
+  height: 500px;
+  perspective: 500px;
+}
+
+#container > div {
+  width: 100%;
+  height: 100%;
+  transform-style: preserve-3d;
+  transform: translateZ(-250px) rotateZ(45deg);
+}
+
+#container > div > div {
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  background-color: rgba(3, 121, 255, 0.3);
+  box-sizing: border-box;
+  border: 3px solid black;
+}
+
+#one { transform: rotateY(90deg)  translateZ(250px); }
+</style>
+
+<div id="container">
+  <div>
+    <div id="one"></div>
+    <div id="one"></div>
+    <div id="one"></div>
+    <div id="one"></div>
+  </div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-transforms/perspective-transforms-equivalence.html
@@ -0,0 +1,52 @@
+<!doctype HTML>
+<meta charset="utf8">
+<title>Perspective with transforms equivalencies.</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<link rel="help" href="http://www.w3.org/TR/css-transforms-2/#perspective-property">
+<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#transform-property">
+<link rel="match" href="perspective-transforms-equivalence-ref.html">
+<!--
+Perspective with different transforms can have small anti-aliasing
+pixel differences, so the test should fuzzy patch to the ref.
+-->
+<meta name="fuzzy" content="maxDifference=10;totalPixels=10">
+<style>
+
+#container {
+  transform: translate(-200px, -200px);
+  width: 500px;
+  height: 500px;
+  perspective: 500px;
+}
+
+#container > div {
+  width: 100%;
+  height: 100%;
+  transform-style: preserve-3d;
+  transform: translateZ(-250px) rotateZ(45deg);
+}
+
+#container > div > div {
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  background-color: rgba(3, 121, 255, 0.3);
+  box-sizing: border-box;
+  border: 3px solid black;
+}
+
+/* The following four should be equivalent. */
+#one { transform: rotateY(90deg)  translateZ(250px); }
+#two { transform: rotateZ(90deg) rotateX(90deg) translateZ(250px); }
+#three { transform: rotateY(-90deg) translateZ(-250px); }
+#four { transform: rotateZ(-90deg) rotateX(90deg) translateZ(-250px); }
+</style>
+
+<div id="container">
+  <div>
+    <div id="one"></div>
+    <div id="two"></div>
+    <div id="three"></div>
+    <div id="four"></div>
+  </div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-typed-om/set-var-reference-crash.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>Don't crash when setting a CSSVariableReferenceValue</title>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#cssvariablereferencevalue">
+<link rel="help" href="https://crbug.com/986710<">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  :root { --x: green; }
+</style>
+<div id="target"></div>
+<script>
+  test(function(){
+    let ref = new CSSVariableReferenceValue('--x')
+    let unparsed = new CSSUnparsedValue([' ', ref]);
+    target.attributeStyleMap.set('color', unparsed);
+    assert_equals('rgb(0, 128, 0)', target.computedStyleMap().get('color').toString());
+  }, 'Do not crash when referencing a variable with CSSVariableReferenceValue');
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-typed-om/the-stylepropertymap/computed/get-auto-min-size.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<link rel="help" href="https://drafts.css-houdini.org/css-typed-om-1/#get-a-value-from-a-stylepropertymap">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#valdef-width-auto">
+<meta name="assert" content="Tests computed StylePropertyMap.get of auto minimum sizes." />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../resources/testhelper.js"></script>
+<div style="display: flex;">
+  <div id="flex-inflow"></div>
+  <div id="flex-absolute" style="position: absolute;"></div>
+</div>
+<div style="display: grid;">
+  <div id="grid-inflow"></div>
+  <div id="grid-absolute" style="position: absolute;"></div>
+</div>
+<div id="block-inflow"></div>
+<div id="block-absolute" style="position: absolute;"></div>
+<script>
+'use strict';
+
+test(t => {
+  const targetMap = document.getElementById('flex-inflow').computedStyleMap();
+  assert_style_value_equals(targetMap.get('min-width'), new CSSKeywordValue('auto'));
+  assert_style_value_equals(targetMap.get('min-height'), new CSSKeywordValue('auto'));
+}, 'An inflow flex-item computed StylePropertyMap.get reports the auto minimum size correctly.');
+
+test(t => {
+  const targetMap = document.getElementById('flex-absolute').computedStyleMap();
+  assert_style_value_equals(targetMap.get('min-width'), new CSSKeywordValue('auto'));
+  assert_style_value_equals(targetMap.get('min-height'), new CSSKeywordValue('auto'));
+}, 'An absolute flex-child computed StylePropertyMap.get reports the auto minimum size correctly.');
+
+test(t => {
+  const targetMap = document.getElementById('grid-inflow').computedStyleMap();
+  assert_style_value_equals(targetMap.get('min-width'), new CSSKeywordValue('auto'));
+  assert_style_value_equals(targetMap.get('min-height'), new CSSKeywordValue('auto'));
+}, 'An inflow grid-item computed StylePropertyMap.get reports the auto minimum size correctly.');
+
+test(t => {
+  const targetMap = document.getElementById('grid-absolute').computedStyleMap();
+  assert_style_value_equals(targetMap.get('min-width'), new CSSKeywordValue('auto'));
+  assert_style_value_equals(targetMap.get('min-height'), new CSSKeywordValue('auto'));
+}, 'An absolute grid-child computed StylePropertyMap.get reports the auto minimum size correctly.');
+
+test(t => {
+  const targetMap = document.getElementById('block-inflow').computedStyleMap();
+  assert_style_value_equals(targetMap.get('min-width'), new CSSKeywordValue('auto'));
+  assert_style_value_equals(targetMap.get('min-height'), new CSSKeywordValue('auto'));
+}, 'An inflow block computed StylePropertyMap.get reports the auto minimum size correctly.');
+
+test(t => {
+  const targetMap = document.getElementById('block-absolute').computedStyleMap();
+  assert_style_value_equals(targetMap.get('min-width'), new CSSKeywordValue('auto'));
+  assert_style_value_equals(targetMap.get('min-height'), new CSSKeywordValue('auto'));
+}, 'An absolute block computed StylePropertyMap.get reports the auto minimum size correctly.');
+
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/reference/tcy-white-space-processing-001-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test reference</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+.v-rl {
+  writing-mode: vertical-rl;
+  width: 200px;
+}
+span {
+  -webkit-text-combine: horizontal; /*testing the layout text-combine, not it's support in general*/
+  text-combine-upright: all;
+  white-space: normal;
+}
+#test { color: blue; }
+#ref { color: orange; }
+</style>
+<p>Test passes if the blue and orange lines of text are identical.
+
+<div class=v-rl>
+  <div id=test>あ<span>12</span>い<span>34</span>う<span>5&nbsp;6</span>えお</div>
+  <div id=ref>あ<span>12</span>い<span>34</span>う<span>5&nbsp;6</span>えお</div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/reference/tcy-white-space-processing-002-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test Reference</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+.v-rl {
+  writing-mode: vertical-rl;
+  width: 200px;
+}
+span {
+  -webkit-text-combine: horizontal; /*testing the layout text-combine, not it's support in general*/
+  text-combine-upright: all;
+  white-space: pre;
+}
+#test { color: blue; }
+#ref { color: orange; }
+</style>
+<p>Test passes if the blue and orange lines of text are identical.
+
+<div class=v-rl>
+  <div id=test>あ<span>&nbsp;&nbsp;12</span>い<span>34&nbsp;&nbsp;</span>う<span>5&nbsp;&nbsp;&nbsp;&nbsp;6</span>えお</div>
+  <div id=ref>あ<span>&nbsp;&nbsp;12</span>い<span>34&nbsp;&nbsp;</span>う<span>5&nbsp;&nbsp;&nbsp;&nbsp;6</span>えお</div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/reference/tcy-white-space-processing-003-ref.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test Reference</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+.v-rl {
+  writing-mode: vertical-rl;
+  width: 200px;
+}
+span {
+  display: inline-block;
+  height: 1em;
+}
+#test { color: blue; }
+#test2 { color: brown; }
+#ref { color: orange; }
+.v-rl > div {
+  display: inline-block;
+  border: solid;
+  margin: 0 5px;
+}
+</style>
+<p>Test passes if the blue, orange, brown boxes are identical.
+
+<div class=v-rl>
+  <div id=test>あいう<span></span>えお<span></span></div>
+  <br>
+  <div id=test2>あいう<span></span>えお<span></span></div>
+  <br>
+  <div id=ref>あいう<span></span>えお<span></span></div>
+</div>
new file mode 100644
index 0000000000000000000000000000000000000000..33f2820dafd2599226da0ad8dad2b9dee1f329d1
GIT binary patch
literal 4003
zc$@*F4_xqxP)<h;3K|Lk000e1NJLTq00BY(001Tk0ssI2KHUW~00004XF*Lt006O%
z3;baP00009a7bBm000i_000ie0b|j*_y7O^2XskIMF-#r3==mt;p=VR000j%Nkl<Z
zc-rk<X;>3i7e0xBKo$}eML<A6QP5V!1*Hl>tGHDVT&h;<)7G{6X)CQ?UD|5>?9*1e
zxG#09T?7{hQtA4Lphc~UR>6&>h(U>>3E9{Aek36ilFUq!VQc681x)6ibKY~#%;nyh
zH#7u6fC2>y?HP260{5XT{*PdJv62deLMtbQ4gg6sXGjuCJ@7*+OzP;_2yGn*Vl<*A
zGe+s<t+NJpVK`&Yo)D=p$#b5`52SfOZauUW>e@t7=l}qGL5>7L5CoCr2yA|)E{T|6
z#cwOz7SFQ$s=4v$oXxcV7C+O-tMitG_z)O@mvW{p@Z2Pjc7ZlRUE4?sgK9?7psv0s
zj(jt@C)XRe6L;KKQH)S%xjQ!s=)18M2I;l^O9T-d004H_$OU_^N(`1``o~3I%o`Ez
zM*{$0hsI4`edzoHwGlxiIRaZl?DSt7nhb3IOu{z>UoUu}yAJ>WtA}98f$I&%#?Kh#
zw~wz)>+eqo0H5HvxnC7OZ8YxOI_4oaBXaCKYVv{#HfY%;rQ^@r5hBSE@Dq=goO~y_
zCkFt)FKWWt{D(S1{F}#2{O;n>mE-z!>|h$$<PuhlSb-2{053a)!pHU#dwj>`N+b$n
z!}SA81mSD|0A~02`TGjKNoXX&jt~cb!EmfOl42RtS)JgwvHI5MBmJZ1>@2L5s5K2W
ze}1=OSm=v8E3^oLAli!UBZCv(&nvA{XtnZ(C0Xyp`PkTY&a%~_7u~;m;yXWFe$b#%
zOaA_2|HA%(NnhPjTR-64F=a>b1DQryS918(h;CDbPfW?cu#V}N`w`hY&$mrBcDxQh
zAjuIh{rU}=_UX@e>Q!2~=;H3F-S`u-9vKMmZ{~*?5%>Du;u@JoQJwQzAXAVd!8;4X
zF;^LImK|c@6Nt|F_!xv^7r^bW1c3t<9Vo7rsx=J{u4Jwfg!t3FFjHxtYi!5JO^Sm$
zxv(oeps`Ny+SvFcCpB=;XLmHH%be)Q_`YwPl_3Zs%^TM#ZokNSLDAm(tS{TeHfFFV
zpAe(2NxI4%@gZrs4y(aXdmuh|#_uu&!M2WZ$dibgsf`)D>8GDIhO4=?v2TDSMr?1*
z71MP=k<9iciFX!;V=gg(ksTu8yXa@r@i7R;EC69z$O}8GP!k@5_+$!);Yu6hI!10%
z9M(zM#u!VT;B7c5%W|#;%}I~&w*IL@x1_X=7k<2_2Jr2j-1FM<)Wus*m)7e50K9r;
z+?1b5;kop${B!B?ol$-;LdMVNdO5qy(Na5|)yZ2amKgv5(>lhX7Kq4Iuw!0|<<l&`
zd3Wv8S!0P2+glTSqee%wUC0_XJYc{kJB0RBT=Ua~@i7Y^`*OgHaothNLiEnV)B1U^
z!soy-a+Bh)P6B%STj~U_jrG#n+AAv}ywKZF9lFmycdx8Y3*gmr+37Q%#8&K{H_+dk
z7e09W{7>@Al`igF(0zEmHf}I@L2QLcss{kjiSjp0jScj%*yg7eJhP0CVIAX83q<59
zXiTmT4V7F59S}nNn@?vj88jENh7DI3z{(C0;Q8tP_}B%YU<LAQ7I*2sJRescp}=>H
z+@v_J6R*ZP!SkKL3l2&6w$5&Xt3EZ(4*;M;=iy6s|5hf}sKv$mSB%hR&K#6_@V?%a
zA~q`O6-L{5MG8(Zp8=q|w=H${iJ+Cacb};Z4z|HCtUEo_0uhl2Ja5T7ivX*(wTzP;
zPowi}e2fAJVk>H;ddwOG8W{DcyDOq@P#Zl9+_R(**f++S@%Bv{QlIxH`ci|)ik3w5
zUUf|kAQdKY2W+d-1JIaVVn)5P=HQQ8W3C>*X_*hxXn_B$r{c!3LNSU%eNBFrc<_`M
z7J%yRuT|0SuAMa`l+UCC03bTG9zi_-;LJM4A<rW6^u9}k5aRrkdloLMO@N&pBH?5E
z>H7GDqF}{L8C;i{{{Yp;MseY>8w&I_fYXIpe@EPSmqa92@@^^J58TtFc-qFaPGdJN
zk!H;L;N-PhxlXSV-#oQ(`m|#)YnJviJ>H<WzHZSc`L~~_3<mX+vb=43t79fb`<gC4
z9YcI;3a{7e4a%DQrIEq&iWCm7QjE&=vsWFxQY+VKWi=NLEt|5DnXzeXCmMin)R^$n
zkJcQzaKAxk)Jm#~_Po9NoD6*laBkh%Ax|Rm^wvs@5SRET@hl>&+Wh~CmmS>jm6(3I
zIzGWDXq}TcWq5C#vh2`>8ktrnuf3Y}-YXj_8R%Iyt6y5IX!{3;|9q&_Yb52rZCUhT
z8PdVsz)498(S2j<&R&xhIivj6_Zj1(JJA6ExRImYJouM+W7nvt$ltPHY~L<k006)Z
zA2IKXqQ`p6iK^RsX2zH%44nqPcBDe%csVZdhs&8O1Yy3WedEN%=zU{t&8fAMVmg{O
z|H1`Jw{9BJ=plx69LL;_2ysf6&AzC!B~3d*>^XOk1?S#k8FhXZb|AzVz|Ibl@bUb_
z8sBNT63L^n;oAPii9J{V0KQ>@<(Zd%NVHvu*43U~J+2oQ0Dv7aCgViO(L|IjVvdoQ
z6wEq75QNssZ#YSXNj<(?@pm&X1yi8#kFG=N4JQf|+C5tJZY&ih@ly-TQw8dVOo6Jy
z_SnW0C{Um#)f6aDpxT%M1*(lHP@q7yF$D?~NNVHe*N93YMck`pV2<5oZ`BpYS555K
z)f=T`R`ZY7i*gn1SFWr*-i^r?Iyz$~{?K+|irv+-v}KzoPy6(=c+8P<nOb`H=<Kdc
zs=DmZe&x#AHYhDFlAtOtxD5a?Q<Eb(Oz1V^+qxM5QsI{rGd438O0KMVfFMYdI}ZsO
zQ3M2^5Cl<G<*t7@E|dcR0G!acmp7cMQZ;>4xWkxJ5(GgI#rcH+05JUP8olAsH^VH4
z%>$|`b2rQ!)`M#nUK%#*<DVaB?H*4ZdEloVZzM$c*`7<(TS6vKBRjaIV`yj?mF3wV
zOdAqndU>52I%LXQJASWL8S%Kn4)A{Cp}5U^Gm@iBPd0F)Ccgj6Bb&#h-6PPU5{9&7
z-(o>H2LON*E?B&;L~1}<Pp*t?`8OOLFIW45BtUa%MBz1trhHE_7ifK#9=%ql&??0@
zj;(mU18~Rfsn8$@qO00I2mlzPzBk)bUR)Xk06-skxYmFmh^pk>UOkpvP?(0=HHHJs
zVXJd*JyB^@kIRJb4P`>NxxzYqllt%tpSJxEkz6CYm-$LprVDLM*o2+(3r_c1#=pB`
zGz%c|wS$*La;>`lR_^LyR_!Qku5bdh9Ad?<%fBbls2-i)6vqHyO~`CarP~BLc>AGr
z^N4Q!7ab_BmZ;6jY5^lQm#JD)u8c(aHv&3dt~t{ZZS09g6n0}6>rbU|0Xoksuzp;2
z_BDS1ZhBt55ka)&pFa-(-pR+rMg&1rm*0+HclK)RZ1s(G(V=e?$*n_$W?WS@4yF8a
zMR$O(cdn>xtlNZxqY&o6TOuahYGdOQVJZiJKkHYiwXw@KM6pb-9N}?=9iaJ8=t_&H
zhKGmZ0Dv>qtW-)OfyT$#DZ#cfSGvj_@xdwCkBzM-S4N`z8?KI*tIm)F%nc_GHKH(}
zEIoNv1`s*2msJ6Y)$@f209nC_G9`dl=!BWk0NTRC#m^8>-#MOVocYC?egOJ&hl}df
zRl@9s#M%AX0H7>AaaINpHZ;__VB*swE)1YLJGa6{9wmBGERW{KKOQcaa0|+^>>@cp
zuTjyQ#=m(-ue+l#X-DC4MJT|~p<!m{>Arkl0FXa1>s^pYpz>BuNjF=WD@Mrp8Qn^R
zw>;EcAh#6VmVd+5@$y`7i_Dd36Fk(2!hl{Xk^+DaAEm-Y_vQNlfK(*W1Atff<d=H^
zs0t2WkgCg13e_*ZI%&qNJ^<RnLj~7zkJXQu6U#MwA_ah=>Hbzv=v`)>2LRD^kp^wm
z$FGUtl67whbBD<V6K=sgzHdhs-7T)12Z*XvCIj2LTLjt<rC>LaxpJhL<2uMKMYrYO
zaCN*q7u+Jhjj>j^JrfpU@Pc^&pq8kt>ODr4L=6DEU_Ju?z&kQ^S~!6G_ao=8=bV%!
z%^uJ(!qnNn{qKW4kA}}3!Zi;S=m!At-;3>>QD%?jlCqrN%qAFqfqnp>tXCM^<EpJh
z=cr}%Qjvlk#B07S5jRTFZTUA`9k1pT+`@0;7Sf19ot`e>0#p>;v(96b<>xB_{F2gR
zOj8tQRC-znfHZI8`h!ms=EQQqyXTZ?;Q*TJzdRf~H_kl0W5rAv$p*Oh`)wOV9L2@A
zqHvwzrJS)L+sR969+;rfOxpq2Y{aC*vjFb?dQ*m2_n|jD*K^q=6)~<nfhPpo4>j=7
z(bF}kGS}DSXFZBdCGKZSl%m`6Z@4;M%_+Erv*Cou&&~~se5>GzPOrFs`pt--R}1C%
zirbpIJI41(UU#BIB-84YbvJT1j0^Cec=*1K=-Th@u^ga3w>;}Fu~MsgeDk<z^>r_5
zO;34oX`pF`WNN<YJk`~VPyp~AlZCo<sPAkW#RBLtduKuUQ?*_ztG$-<(Zt|@$wz8*
zF0L3m^VUrh^1@d;0YG@hxu-h4yh^wrENEV#9C5h78}AJeHfP^OkzA{KeB=1a!CeM@
zT&5w&6-IyrzRH9|0#&7(M+7{-aQ`3G4H`|u{o;d*`Ui~ITuOMQx@Ag{$%*PSD&vRC
zBAM3gWaCP;_U@L!yxwmdD6W=j4Vq__g}dfN03F5E?Jos^0~Q@DzTcqH%0yQ(-yIzt
z#bFY5#=>MXtW=Y(5oHH~qrFpArSQY)mYq^o$j}+<bE{OgNj*2eD*&)lPFYqdm6w(W
z14HoLLxb(6YlU$A%;Dy3PhbVdPI)iujsjn>3isQFticjCfj&!Je)#pFLFT0+X5i5I
z-&SgzEb_|AzJGV}fNo6FvPr+x^*`6@(EGa1xxxt0{*b59;Sy+&T;01cA&dn8zzR!P
zX!ng%*yA*NDS9OT=19lu=%w!xI*k@ehzV{rPa9LR0TljaAX|1zTe?2>rMj<g?i|*7
z-z-bL;Y5Lgi&p_}-uTbY{w>uS4Jz@C><<_2V$NGMpjE#enrdST|FS0Jrxr*GQu*$_
zGUfN;p3If}V{`lQnH?Cc$jMu3)3bhB^Sn>1hDA-PDNtzl_&=W`?uITdc%lFR002ov
JPDHLkV1nf;u*LuY
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/tcy-white-space-processing-001.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Writing Modes Test: white-space:normal space processing in text-combine-horizontal</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-4/#text-combine-layout">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-rules">
+<link rel="match" href="reference/tcy-white-space-processing-001-ref.html">
+<meta name="assert" content="Spaces with white-space:normal in a text-combine horizontal is trimmed at the start and end, and collapsed in the middle.">
+<style>
+.v-rl {
+  writing-mode: vertical-rl;
+  width: 200px;
+}
+span {
+  -webkit-text-combine: horizontal; /*testing the layout text-combine, not it's support in general*/
+  text-combine-upright: all;
+  white-space: normal;
+}
+#test { color: blue; }
+#ref { color: orange; }
+</style>
+<p>Test passes if the blue and orange lines of text are identical.
+
+<div class=v-rl>
+  <div id=test>あ<span>  12</span>い<span>34  </span>う<span>5    6</span>えお</div>
+  <div id=ref>あ<span>12</span>い<span>34</span>う<span>5&nbsp;6</span>えお</div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/tcy-white-space-processing-002.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Writing Modes Test: white-space:pre space processing in text-combine-horizontal</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-4/#text-combine-layout">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-rules">
+<link rel="match" href="reference/tcy-white-space-processing-002-ref.html">
+<meta name="assert" content="Spaces with white-space:pre in a text-combine-upright are preserved">
+<style>
+.v-rl {
+  writing-mode: vertical-rl;
+  width: 200px;
+}
+span {
+  -webkit-text-combine: horizontal; /*testing the layout text-combine, not it's support in general*/
+  text-combine-upright: all;
+  white-space: pre;
+}
+#test { color: blue; }
+#ref { color: orange; }
+</style>
+<p>Test passes if the blue and orange lines of text are identical.
+
+<div class=v-rl>
+  <div id=test>あ<span>  12</span>い<span>34  </span>う<span>5    6</span>えお</div>
+  <div id=ref>あ<span>&nbsp;&nbsp;12</span>い<span>34&nbsp;&nbsp;</span>う<span>5&nbsp;&nbsp;&nbsp;&nbsp;6</span>えお</div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/tcy-white-space-processing-003.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Writing Modes Test: white space only text-combine-horizontal</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-4/#text-combine-layout">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-rules">
+<link rel="match" href="reference/tcy-white-space-processing-003-ref.html">
+<meta name="assert" content="a text-combine-upright with only white-space is preserved as a 1em square, including at the end of the containing line, regardless of the value of the white-space property">
+<style>
+.v-rl {
+  writing-mode: vertical-rl;
+  width: 200px;
+}
+#test span {
+  -webkit-text-combine: horizontal; /*testing the layout text-combine, not it's support in general*/
+  text-combine-upright: all;
+}
+#test2 span {
+  -webkit-text-combine: horizontal; /*testing the layout text-combine, not it's support in general*/
+  text-combine-upright: all;
+  white-space: pre;
+}
+#ref span {
+  display: inline-block;
+  height: 1em;
+}
+#test { color: blue; }
+#test2 { color: brown; }
+#ref { color: orange; }
+.v-rl > div {
+  display: inline-block;
+  border: solid;
+  margin: 0 5px;
+}
+</style>
+<p>Test passes if the blue, orange, brown boxes are identical.
+
+<div class=v-rl>
+  <div id=test>あいう<span> </span>えお<span> </span></div>
+  <br>
+  <div id=test2>あいう<span> </span>えお<span> </span></div>
+  <br>
+  <div id=ref>あいう<span></span>えお<span></span></div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/wm-propagation-001-ref.html
@@ -0,0 +1,22 @@
+<html>
+  <meta chartset=utf-8>
+  <title>Test Reference</title>
+  <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+html {
+  writing-mode: vertical-rl;
+}
+body {
+  writing-mode: vertical-rl;
+  width: 0; height: 0;
+}
+html::before {
+  content: "This text must be vertical.";
+}
+html::after {
+  content: "This text must be horizontal.";
+  display: block;
+  writing-mode: horizontal-tb;
+}
+</style>
+<body></body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/wm-propagation-001.html
@@ -0,0 +1,30 @@
+<html>
+  <meta chartset=utf-8>
+  <title>CSS-Writing Modes Test: propagation of the writing-mode property from body to root</title>
+  <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+  <link rel=help href="https://drafts.csswg.org/css-writing-modes-3/#principal-flow">
+  <link rel="match" href="wm-propagation-001-ref.html">
+  <meta name=assert content="the writing mode of the body must be propagated to the root, but the computed value must not change.">
+<style>
+html {
+  writing-mode: horizontal-tb;
+}
+body {
+  writing-mode: vertical-rl;
+  width: 0; height: 0;
+}
+html::before {
+  content: "This text must be vertical.";
+  /* This is inline content of the root,
+     and should therefore be vertical,
+     as the root's used value is vertical */
+}
+html::after {
+  content: "This text must be horizontal.";
+  display: block;
+  /* This is a block level element,
+     with it's own writing mode inherited from the root,
+     horizontal since the root's computed value should be horizontal*/
+}
+</style>
+<body></body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/wm-propagation-002-ref.html
@@ -0,0 +1,21 @@
+<html>
+  <meta chartset=utf-8>
+  <title>Test reference</title>
+  <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+<style>
+html {
+  direction: rtl;
+}
+body {
+  height: 0;
+}
+html::before {
+  content: "This text must be on the right";
+}
+html::after {
+  content: "This text must be on the left";
+  display: block;
+  direction: ltr;
+}
+</style>
+<body></body>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/wm-propagation-002.html
@@ -0,0 +1,21 @@
+<html>
+  <meta chartset=utf-8>
+  <title>CSS-Writing Modes Test: propagation of the direction property from body to root</title>
+  <link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net">
+  <link rel=help href="https://drafts.csswg.org/css-writing-modes-3/#principal-flow">
+  <link rel="match" href="wm-propagation-002-ref.html">
+  <meta name=assert content="the 'direction' of the body must be propagated to the root, but the computed value must not change.">
+<style>
+body {
+  direction: rtl;
+  height: 0;
+}
+html::before {
+  content: "This text must be on the right";
+}
+html::after {
+  content: "This text must be on the left";
+  display: block;
+}
+</style>
+<body></body>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-003-ref.xht
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
- <head>
-
-  <title>CSS Reftest Reference</title>
-
-  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
-
-  <meta content="image" name="flags" />
-
-  <style type="text/css"><![CDATA[
-  img
-    {
-      vertical-align: top;
-    }
-
-  img + img
-    {
-      padding-left: 1em;
-    }
-  ]]></style>
- </head>
-
- <body>
-
-  <div><img src="support/swatch-orange.png" width="100" height="100" alt="Image download support must be enabled" /><img src="support/wm-propagation-body-003-exp-res.png" width="340" height="37" alt="Image download support must be enabled" /></div>
-
-  <!--
-  The image says:
-  Test passes if there is an orange square
-  in the <strong>upper-left corner</strong> of the page.
-  -->
-
- </body>
-</html>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-006.xht
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
- <head>
-
-  <title>CSS Writing Modes Test: 'writing-mode: vertical-rl' set to body element propagates to viewport</title>
-
-  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
-  <link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#principal-flow" title="8. The Principal Writing Mode" />
-  <link rel="bookmark" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1102175" title="Bug 1102175: &lt;body&gt; with writing-mode: vertical-rl does not align children to the right " />
-  <link rel="match" href="block-flow-direction-025-ref.xht" />
-
-  <meta name="flags" content="image" />
-  <meta name="assert" content="This test checks that when the root element has a &lt;body&gt; child element, then the principal writing mode is instead taken from the values of writing-mode and direction on the first such child element instead of taken from the root element." />
-
-  <style type="text/css"><![CDATA[
-  html
-    {
-      writing-mode: horizontal-tb;
-    }
-
-  body
-    {
-      writing-mode: vertical-rl;
-    }
-
-  div
-    {
-      background-color: blue;
-      height: 100px;
-      width: 100px;
-    }
-  ]]></style>
-
- </head>
-
- <body>
-
-  <div></div>
-
-  <p><img src="support/block-flow-direction-025-exp-res.png" width="359" height="36" alt="Image download support must be enabled" /></p>
-
-  <!--
-  The image says:
-  Test passes if there is a blue square in the
-  <strong>upper-right corner</strong> of the page.
-  -->
-
- </body>
-</html>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-008.xht
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
- <head>
-
-  <title>CSS Writing Modes Test: 'writing-mode: sideways-rl' set to body element propagates to viewport</title>
-
-  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
-  <link rel="help" href="https://www.w3.org/TR/css-writing-modes-4/#principal-flow" title="8. The Principal Writing Mode" />
-  <link rel="match" href="block-flow-direction-025-ref.xht" />
-
-  <meta name="flags" content="image" />
-  <meta name="assert" content="This test checks that when the root element has a &lt;body&gt; child element, then the principal writing mode is instead taken from the values of writing-mode and direction on the first such child element instead of taken from the root element." />
-
-  <style type="text/css"><![CDATA[
-  html
-    {
-      writing-mode: horizontal-tb;
-    }
-
-  body
-    {
-      writing-mode: sideways-rl;
-    }
-
-  div
-    {
-      background-color: blue;
-      height: 100px;
-      width: 100px;
-    }
-  ]]></style>
- </head>
-
- <body>
-
-  <div></div>
-
-  <p><img src="support/block-flow-direction-025-exp-res.png" width="359" height="36" alt="Image download support must be enabled" /></p>
-
-  <!--
-  The image says:
-  Test passes if there is a blue square in the
-  <strong>upper-right corner</strong> of the page.
-  -->
-
- </body>
-</html>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-010.xht
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
- <head>
-
-  <title>CSS Writing Modes Test: 'writing-mode: horizontal-tb' set to body element propagates to viewport</title>
-
-  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
-  <link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#principal-flow" title="8. The Principal Writing Mode" />
-  <link rel="match" href="wm-propagation-body-003-ref.xht" />
-
-  <meta name="flags" content="image" />
-  <meta name="assert" content="This test checks that when the root element has a &lt;body&gt; child element, then the principal writing mode is instead taken from the values of writing-mode and direction on the first such child element instead of taken from the root element." />
-
-  <style type="text/css"><![CDATA[
-  html
-    {
-      writing-mode: vertical-rl;
-    }
-
-  body
-    {
-      writing-mode: horizontal-tb;
-    }
-
-  img#orange-square
-    {
-      height: 100px;
-      padding-right: 1em;
-      vertical-align: top;
-      width: 100px;
-    }
-  ]]></style>
- </head>
-
- <body>
-
-  <div><img id="orange-square" src="support/swatch-orange.png" alt="Image download support must be enabled" /><img src="support/wm-propagation-body-003-exp-res.png" width="340" height="37" alt="Image download support must be enabled" /></div>
-
-  <!--
-  The image says:
-  Test passes if there is an orange square
-  in the <strong>upper-left corner</strong> of the page.
-  -->
-
- </body>
-</html>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-011.xht
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
- <head>
-
-  <title>CSS Writing Modes Test: 'writing-mode: vertical-lr' set to body element propagates to viewport</title>
-
-  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
-  <link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#principal-flow" title="8. The Principal Writing Mode" />
-  <link rel="match" href="wm-propagation-body-003-ref.xht" />
-
-  <meta name="flags" content="image" />
-  <meta name="assert" content="This test checks that when the root element has a &lt;body&gt; child element, then the principal writing mode is instead taken from the values of writing-mode and direction on the first such child element instead of taken from the root element." />
-
-  <style type="text/css"><![CDATA[
-  html
-    {
-      writing-mode: vertical-rl;
-    }
-
-  body
-    {
-      writing-mode: vertical-lr;
-    }
-
-  div
-    {
-      background-color: orange;
-      height: 100px;
-      width: 100px;
-    }
-  ]]></style>
- </head>
-
- <body>
-
-  <div></div>
-
-  <p><img src="support/wm-propagation-body-003-exp-res.png" width="340" height="37" alt="Image download support must be enabled" /></p>
-
-  <!--
-  The image says:
-  Test passes if there is an orange square
-  in the <strong>upper-left corner</strong> of the page.
-  -->
-
- </body>
-</html>
deleted file mode 100644
--- a/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-015.xht
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
- <head>
-
-  <title>CSS Writing Modes Test: 'writing-mode: vertical-rl' set to body element propagates to viewport</title>
-
-  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
-  <link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#principal-flow" title="8. The Principal Writing Mode" />
-  <link rel="match" href="block-flow-direction-025-ref.xht" />
-
-  <meta name="flags" content="image" />
-  <meta name="assert" content="This test checks that when the root element has a &lt;body&gt; child element, then the principal writing mode is instead taken from the values of writing-mode and direction on the first such child element instead of taken from the root element." />
-
-  <style type="text/css"><![CDATA[
-  html
-    {
-      writing-mode: vertical-lr;
-    }
-
-  body
-    {
-      writing-mode: vertical-rl;
-    }
-
-  div
-    {
-      background-color: blue;
-      height: 100px;
-      width: 100px;
-    }
-  ]]></style>
-
- </head>
-
- <body>
-
-  <div></div>
-
-  <p><img src="support/block-flow-direction-025-exp-res.png" width="359" height="36" alt="Image download support must be enabled" /></p>
-
-  <!--
-  The image says:
-  Test passes if there is a blue square in the
-  <strong>upper-right corner</strong> of the page.
-  -->
-
- </body>
-</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-032.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+
+  <meta charset="UTF-8">
+
+  <title>CSS Writing Modes Test: 'writing-mode: vertical-rl' set to &lt;body&gt; element propagates to viewport</title>
+
+  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+  <link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#principal-flow" title="8. The Principal Writing Mode">
+  <!--
+  Issue 3066: [css-writing-modes] Does vertical writing mode of an HTML body
+  element cause an orthogonal flow?
+  https://github.com/w3c/csswg-drafts/issues/3066
+  -->
+  <link rel="match" href="block-flow-direction-025-ref.xht">
+
+  <meta name="flags" content="">
+  <meta name="assert" content="This test checks that when the root element has a &lt;body&gt; child element, then the principal writing mode is instead taken from the values of writing-mode and direction on the first such child element instead of taken from the root element. Also, a small script in this test verifies that the computed value of 'writing-mode' of the root element itself is not affected by such propagation.">
+
+  <!--
+  Tests 032 to 035: html's writing-mode is not specified
+
+  Tests 036 to 039: html's writing-mode is specified as horizontal-tb
+
+  Tests 040 to 043: html's writing-mode is specified as vertical-rl
+
+  Tests 044 to 047: html's writing-mode is specified as vertical-lr
+
+  Tests 048 to 051: html's writing-mode is specified as sideways-rl
+
+  Tests 052 to 055: html's writing-mode is specified as sideways-lr
+  -->
+
+  <style>
+  body
+    {
+      writing-mode: vertical-rl;
+    }
+
+  div
+    {
+      background-color: blue;
+      height: 100px;
+      width: 100px;
+    }
+
+  h1#second-test-condition
+    {
+      background-color: red;
+      color: yellow;
+    }
+  </style>
+
+  <script>
+  function verifyComputedValueDocRoot()
+  {
+  if(getComputedStyle(document.documentElement)["writing-mode"] == "horizontal-tb")
+    {
+    document.getElementById("second-test-condition").style.display = "none";
+    };
+
+    /*
+    If the computed value of 'writing-mode' of the root element
+    itself is not affected by such propagation, then the big FAIL
+    word will not be displayed.
+    */
+  }
+  </script>
+
+ <body onload="verifyComputedValueDocRoot();">
+
+  <div></div>
+
+  <p><img src="support/block-flow-direction-025-exp-res.png" width="359" height="36" alt="Image download support must be enabled">
+
+  <!--
+  The image says:
+  Test passes if there is a blue square in the
+  <strong>upper-right corner</strong> of the page.
+  -->
+
+  <h1 id="second-test-condition">FAIL</h1>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-033-ref.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+
+  <meta charset="UTF-8">
+
+  <title>CSS Reftest Reference</title>
+
+  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+
+  <style>
+  img
+    {
+      vertical-align: top;
+    }
+
+  img + img
+    {
+      padding-left: 1em;
+    }
+  </style>
+
+  <div><img src="support/swatch-orange.png" width="100" height="100" alt="Image download support must be enabled"><img src="support/wm-propagation-body-003-exp-res.png" width="340" height="37" alt="Image download support must be enabled"></div>
+
+  <!--
+  The image says:
+  Test passes if there is an orange square
+  in the <strong>upper-left corner</strong> of the page.
+  -->
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-033.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+
+  <meta charset="UTF-8">
+
+  <title>CSS Writing Modes Test: 'writing-mode: vertical-lr' set to &lt;body&gt; element propagates to viewport</title>
+
+  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+  <link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#principal-flow" title="8. The Principal Writing Mode">
+  <!--
+  Issue 3066: [css-writing-modes] Does vertical writing mode of an HTML body
+  element cause an orthogonal flow?
+  https://github.com/w3c/csswg-drafts/issues/3066
+  -->
+  <link rel="match" href="wm-propagation-body-033-ref.html">
+
+  <meta name="flags" content="">
+  <meta name="assert" content="This test checks that when the root element has a &lt;body&gt; child element, then the principal writing mode is instead taken from the values of writing-mode and direction on the first such child element instead of taken from the root element. Also, a small script in this test verifies that the computed value of 'writing-mode' of the root element itself is not affected by such propagation.">
+
+  <!--
+  Tests 032 to 035: html's writing-mode is not specified
+
+  Tests 036 to 039: html's writing-mode is specified as horizontal-tb
+
+  Tests 040 to 043: html's writing-mode is specified as vertical-rl
+
+  Tests 044 to 047: html's writing-mode is specified as vertical-lr
+
+  Tests 048 to 051: html's writing-mode is specified as sideways-rl
+
+  Tests 052 to 055: html's writing-mode is specified as sideways-lr
+  -->
+
+  <style>
+  html::before
+    {
+      background-color: orange;
+      content: "";
+      display: block;
+      height: 100px;
+      margin-left: 8px;
+      margin-top: 8px;
+      margin-right: 1em;
+      width: 100px;
+    }
+
+  body
+    {
+      writing-mode: vertical-lr;
+    }
+
+  h1#second-test-condition
+    {
+      background-color: red;
+      color: yellow;
+    }
+  </style>
+
+  <script>
+  function verifyComputedValueDocRoot()
+  {
+  if(getComputedStyle(document.documentElement)["writing-mode"] == "horizontal-tb")
+    {
+    document.getElementById("second-test-condition").style.display = "none";
+    };
+
+    /*
+    If the computed value of 'writing-mode' of the root element
+    itself is not affected by such propagation, then the big FAIL
+    word will not be displayed.
+    */
+  }
+  </script>
+
+ <body onload="verifyComputedValueDocRoot();">
+
+  <div><img src="support/wm-propagation-body-003-exp-res.png" width="340" height="37" alt="Image download support must be enabled"></div>
+
+  <!--
+  The image says:
+  Test passes if there is an orange square
+  in the <strong>upper-left corner</strong> of the page.
+  -->
+
+  <h1 id="second-test-condition">FAIL</h1>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-034.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+
+  <meta charset="UTF-8">
+
+  <title>CSS Writing Modes Test: 'writing-mode: sideways-rl' set to &lt;body&gt; element propagates to viewport</title>
+
+  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+  <link rel="help" href="https://www.w3.org/TR/css-writing-modes-4/#principal-flow" title="8. The Principal Writing Mode">
+  <!--
+  Issue 3066: [css-writing-modes] Does vertical writing mode of an HTML body
+  element cause an orthogonal flow?
+  https://github.com/w3c/csswg-drafts/issues/3066
+  -->
+  <link rel="match" href="block-flow-direction-025-ref.xht">
+
+  <meta name="flags" content="">
+  <meta name="assert" content="This test checks that when the root element has a &lt;body&gt; child element, then the principal writing mode is instead taken from the values of writing-mode and direction on the first such child element instead of taken from the root element. Also, a small script in this test verifies that the computed value of 'writing-mode' of the root element itself is not affected by such propagation.">
+
+  <!--
+  Tests 032 to 035: html's writing-mode is not specified
+
+  Tests 036 to 039: html's writing-mode is specified as horizontal-tb
+
+  Tests 040 to 043: html's writing-mode is specified as vertical-rl
+
+  Tests 044 to 047: html's writing-mode is specified as vertical-lr
+
+  Tests 048 to 051: html's writing-mode is specified as sideways-rl
+
+  Tests 052 to 055: html's writing-mode is specified as sideways-lr
+  -->
+
+  <style>
+  body
+    {
+      writing-mode: sideways-rl;
+    }
+
+  div
+    {
+      background-color: blue;
+      height: 100px;
+      width: 100px;
+    }
+
+  h1#second-test-condition
+    {
+      background-color: red;
+      color: yellow;
+    }
+  </style>
+
+  <script>
+  function verifyComputedValueDocRoot()
+  {
+  if(getComputedStyle(document.documentElement)["writing-mode"] == "horizontal-tb")
+    {
+    document.getElementById("second-test-condition").style.display = "none";
+    };
+
+    /*
+    If the computed value of 'writing-mode' of the root element
+    itself is not affected by such propagation, then the big FAIL
+    word will not be displayed.
+    */
+  }
+  </script>
+
+ <body onload="verifyComputedValueDocRoot();">
+
+  <div></div>
+
+  <p><img src="support/block-flow-direction-025-exp-res.png" width="359" height="36" alt="Image download support must be enabled">
+
+  <!--
+  The image says:
+  Test passes if there is a blue square in the
+  <strong>upper-right corner</strong> of the page.
+  -->
+
+  <h1 id="second-test-condition">FAIL</h1>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-writing-modes/wm-propagation-body-035-ref.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+
+  <meta charset="UTF-8">
+
+  <title>CSS Reftest Reference</title>
+
+  <link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/">
+
+  <style>
+  div
+    {
+      bottom: 8px;
+      left: auto;
+      position: absolute;
+    }
+
+  img