diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs
index cd18f86ee6a..963f7f83165 100644
--- a/components/script/dom/htmliframeelement.rs
+++ b/components/script/dom/htmliframeelement.rs
@@ -544,6 +544,11 @@ impl HTMLIFrameElementMethods for HTMLIFrameElement {
// https://html.spec.whatwg.org/multipage/#dom-dim-height
make_dimension_setter!(SetHeight, "height");
+ // https://html.spec.whatwg.org/multipage/#other-elements,-attributes-and-apis:attr-iframe-frameborder
+ make_getter!(FrameBorder, "frameborder");
+ // https://html.spec.whatwg.org/multipage/#other-elements,-attributes-and-apis:attr-iframe-frameborder
+ make_setter!(SetFrameBorder, "frameborder");
+
// check-tidy: no specs after this line
fn SetMozprivatebrowsing(&self, value: bool) {
let element = self.upcast::();
diff --git a/components/script/dom/webidls/HTMLIFrameElement.webidl b/components/script/dom/webidls/HTMLIFrameElement.webidl
index ced089391d2..d12935c7811 100644
--- a/components/script/dom/webidls/HTMLIFrameElement.webidl
+++ b/components/script/dom/webidls/HTMLIFrameElement.webidl
@@ -23,7 +23,7 @@ interface HTMLIFrameElement : HTMLElement {
partial interface HTMLIFrameElement {
// attribute DOMString align;
// attribute DOMString scrolling;
- // attribute DOMString frameBorder;
+ attribute DOMString frameBorder;
// attribute DOMString longDesc;
//[TreatNullAs=EmptyString] attribute DOMString marginHeight;
diff --git a/resources/presentational-hints.css b/resources/presentational-hints.css
index 8c701ec0405..84157dcb4bd 100644
--- a/resources/presentational-hints.css
+++ b/resources/presentational-hints.css
@@ -133,7 +133,7 @@ hr[color], hr[noshade] { border-style: solid; }
-iframe[frameborder=0], iframe[frameborder=no i] { border: none; }
+iframe[frameborder="0"], iframe[frameborder=no i] { border: none; }
applet[align=left i], embed[align=left i], iframe[align=left i], img[type=image i][align=left i], object[align=left i] {
float: left;
diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini
index 67181fad83d..d9e3bda0495 100644
--- a/tests/wpt/metadata/html/dom/interfaces.html.ini
+++ b/tests/wpt/metadata/html/dom/interfaces.html.ini
@@ -1689,9 +1689,6 @@
[HTMLIFrameElement interface: attribute scrolling]
expected: FAIL
- [HTMLIFrameElement interface: attribute frameBorder]
- expected: FAIL
-
[HTMLIFrameElement interface: attribute longDesc]
expected: FAIL
diff --git a/tests/wpt/metadata/html/dom/reflection-embedded.html.ini b/tests/wpt/metadata/html/dom/reflection-embedded.html.ini
index 9086f7a8d02..a7016569e17 100644
--- a/tests/wpt/metadata/html/dom/reflection-embedded.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-embedded.html.ini
@@ -2445,135 +2445,6 @@
[iframe.scrolling: IDL set to object "test-valueOf" followed by IDL get]
expected: FAIL
- [iframe.frameBorder: typeof IDL attribute]
- expected: FAIL
-
- [iframe.frameBorder: IDL get with DOM attribute unset]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to "" followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to undefined followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to 7 followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to 1.5 followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to true followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to false followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to object "[object Object\]" followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to NaN followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to Infinity followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to -Infinity followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to "\\0" followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to null followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to object "test-toString" followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: setAttribute() to object "test-valueOf" followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to "" followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to undefined followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to undefined followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to 7 followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to 7 followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to 1.5 followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to 1.5 followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to true followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to true followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to false followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to false followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to object "[object Object\]" followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to object "[object Object\]" followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to NaN followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to NaN followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to Infinity followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to Infinity followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to -Infinity followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to -Infinity followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to "\\0" followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to null followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to null followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to object "test-toString" followed by getAttribute()]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to object "test-toString" followed by IDL get]
- expected: FAIL
-
- [iframe.frameBorder: IDL set to object "test-valueOf" followed by IDL get]
- expected: FAIL
-
[iframe.longDesc: typeof IDL attribute]
expected: FAIL
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index 1be92d74c52..f5149986b21 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -1916,6 +1916,18 @@
"url": "/_mozilla/css/iframe/bg_color.html"
}
],
+ "css/iframe/frameborder_a.html": [
+ {
+ "path": "css/iframe/frameborder_a.html",
+ "references": [
+ [
+ "/_mozilla/css/iframe/frameborder_ref.html",
+ "=="
+ ]
+ ],
+ "url": "/_mozilla/css/iframe/frameborder_a.html"
+ }
+ ],
"css/iframe/hide_after_load.html": [
{
"path": "css/iframe/hide_after_load.html",
@@ -15764,6 +15776,18 @@
"url": "/_mozilla/css/iframe/bg_color.html"
}
],
+ "css/iframe/frameborder_a.html": [
+ {
+ "path": "css/iframe/frameborder_a.html",
+ "references": [
+ [
+ "/_mozilla/css/iframe/frameborder_ref.html",
+ "=="
+ ]
+ ],
+ "url": "/_mozilla/css/iframe/frameborder_a.html"
+ }
+ ],
"css/iframe/hide_after_load.html": [
{
"path": "css/iframe/hide_after_load.html",
diff --git a/tests/wpt/mozilla/tests/css/iframe/frameborder_a.html b/tests/wpt/mozilla/tests/css/iframe/frameborder_a.html
new file mode 100644
index 00000000000..c81be895aa0
--- /dev/null
+++ b/tests/wpt/mozilla/tests/css/iframe/frameborder_a.html
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/tests/wpt/mozilla/tests/css/iframe/frameborder_ref.html b/tests/wpt/mozilla/tests/css/iframe/frameborder_ref.html
new file mode 100644
index 00000000000..713df0ad4ae
--- /dev/null
+++ b/tests/wpt/mozilla/tests/css/iframe/frameborder_ref.html
@@ -0,0 +1,5 @@
+
+
+
+
+