Skip to content

Commit 293a88d

Browse files
committed
Implement CSSNamespaceRule
1 parent 1cb46f7 commit 293a88d

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

node/src/stylesheet.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,10 @@ fn css_rule_to_js_unknown(rule: &CssRule<'static>, env: Env, css_rule: CSSRule)
231231
let rule = CSSImportRule::new(css_rule);
232232
unsafe { napi::bindgen_prelude::ToNapiValue::to_napi_value(env.raw(), rule)? }
233233
}
234+
CssRule::Namespace(_) => {
235+
let rule = CSSNamespaceRule::new(css_rule);
236+
unsafe { napi::bindgen_prelude::ToNapiValue::to_napi_value(env.raw(), rule)? }
237+
}
234238
_ => unreachable!(),
235239
};
236240

@@ -1287,6 +1291,42 @@ impl CSSImportRule {
12871291
// TODO: styleSheet?
12881292
}
12891293

1294+
#[napi(js_name = "CSSNamespaceRule")]
1295+
struct CSSNamespaceRule {
1296+
rule: CSSRule,
1297+
}
1298+
1299+
#[napi]
1300+
impl CSSNamespaceRule {
1301+
#[napi(constructor)]
1302+
pub fn constructor() {
1303+
unreachable!()
1304+
}
1305+
1306+
fn new(rule: CSSRule) -> Self {
1307+
Self { rule }
1308+
}
1309+
1310+
#[napi(getter, js_name = "namespaceURI")]
1311+
pub fn namespace_uri(&self) -> &str {
1312+
match self.rule.rule() {
1313+
CssRule::Namespace(namespace) => namespace.url.as_ref(),
1314+
_ => unreachable!(),
1315+
}
1316+
}
1317+
1318+
#[napi(getter)]
1319+
pub fn prefix(&self) -> &str {
1320+
match self.rule.rule() {
1321+
CssRule::Namespace(namespace) => match &namespace.prefix {
1322+
Some(prefix) => prefix.as_ref(),
1323+
None => "",
1324+
},
1325+
_ => unreachable!(),
1326+
}
1327+
}
1328+
}
1329+
12901330
fn extend_lifetime<T: ?Sized>(string: &T) -> &'static T {
12911331
unsafe { std::mem::transmute::<&T, &'static T>(string) }
12921332
}

node/test/cssom.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const { suite } = require('uvu');
2-
const { CSSStyleSheet, CSSStyleRule, CSSRuleList, CSSRule, CSSGroupingRule, CSSConditionRule, CSSMediaRule, CSSStyleDeclaration, MediaList, CSSSupportsRule, CSSKeyframesRule, CSSKeyframeRule, CSSImportRule } = require('../');
2+
const { CSSStyleSheet, CSSStyleRule, CSSRuleList, CSSRule, CSSGroupingRule, CSSConditionRule, CSSMediaRule, CSSStyleDeclaration, MediaList, CSSSupportsRule, CSSKeyframesRule, CSSKeyframeRule, CSSImportRule, CSSNamespaceRule } = require('../');
33
const assert = require('assert');
44

55
Object.setPrototypeOf(CSSStyleRule.prototype, CSSRule.prototype);
@@ -26,6 +26,9 @@ Object.setPrototypeOf(CSSKeyframeRule, CSSRule);
2626
Object.setPrototypeOf(CSSImportRule.prototype, CSSRule.prototype);
2727
Object.setPrototypeOf(CSSImportRule, CSSRule);
2828

29+
Object.setPrototypeOf(CSSNamespaceRule.prototype, CSSRule.prototype);
30+
Object.setPrototypeOf(CSSNamespaceRule, CSSRule);
31+
2932
function run(name, fn) {
3033
let test = suite(name);
3134
fn(test);
@@ -788,6 +791,24 @@ run('CSSImportRule', test => {
788791
});
789792
});
790793

794+
run('CSSNamespaceRule', test => {
795+
let stylesheet = new CSSStyleSheet();
796+
stylesheet.replaceSync(`
797+
@namespace "http://toto.example.org";
798+
@namespace toto "http://toto.example.org";
799+
`);
800+
801+
test('namespaceURI', () => {
802+
assert.equal(stylesheet.cssRules.item(0).namespaceURI, 'http://toto.example.org');
803+
assert.equal(stylesheet.cssRules.item(1).namespaceURI, 'http://toto.example.org');
804+
});
805+
806+
test('prefix', () => {
807+
assert.equal(stylesheet.cssRules.item(0).prefix, '');
808+
assert.equal(stylesheet.cssRules.item(1).prefix, 'toto');
809+
});
810+
});
811+
791812
// setTimeout(() => {
792813
// console.log("GC")
793814
// global.gc();

0 commit comments

Comments
 (0)