diff --git a/integration_tests/snapshots/css/css-fonts/relative-path-font-face.html.0.png b/integration_tests/snapshots/css/css-fonts/relative-path-font-face.html.0.png new file mode 100644 index 0000000000..048108d441 Binary files /dev/null and b/integration_tests/snapshots/css/css-fonts/relative-path-font-face.html.0.png differ diff --git a/integration_tests/specs/css/css-fonts/relative-path-font-face.html b/integration_tests/specs/css/css-fonts/relative-path-font-face.html new file mode 100644 index 0000000000..f3e4654bd1 --- /dev/null +++ b/integration_tests/specs/css/css-fonts/relative-path-font-face.html @@ -0,0 +1,25 @@ + + + + + + + Document + + + + +
+ AAAAAAAAA +
+ + + \ No newline at end of file diff --git a/integration_tests/windows/flutter/generated_plugin_registrant.cc b/integration_tests/windows/flutter/generated_plugin_registrant.cc index 4b23bc136a..45a0b4000c 100644 --- a/integration_tests/windows/flutter/generated_plugin_registrant.cc +++ b/integration_tests/windows/flutter/generated_plugin_registrant.cc @@ -6,12 +6,9 @@ #include "generated_plugin_registrant.h" -#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { - ConnectivityPlusWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); WebfPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("WebfPlugin")); } diff --git a/integration_tests/windows/flutter/generated_plugins.cmake b/integration_tests/windows/flutter/generated_plugins.cmake index 0a762d1572..e3552774d1 100644 --- a/integration_tests/windows/flutter/generated_plugins.cmake +++ b/integration_tests/windows/flutter/generated_plugins.cmake @@ -3,7 +3,6 @@ # list(APPEND FLUTTER_PLUGIN_LIST - connectivity_plus webf ) diff --git a/webf/lib/src/css/font_face.dart b/webf/lib/src/css/font_face.dart index ef3c402ec5..f0d4da2147 100644 --- a/webf/lib/src/css/font_face.dart +++ b/webf/lib/src/css/font_face.dart @@ -29,16 +29,16 @@ class _Font { } class CSSFontFace { - static Uri? _resolveFontSource(int contextId, String source) { + static Uri? _resolveFontSource(int contextId, String source, String? base) { WebFController controller = WebFController.getControllerOfJSContextId(contextId)!; - String base = controller.url; + base = base ?? controller.url; try { return controller.uriParser!.resolve(Uri.parse(base), Uri.parse(source)); } catch (_) { return null; } } - static void resolveFontFaceRules(CSSFontFaceRule fontFaceRule, int contextId) async { + static void resolveFontFaceRules(CSSFontFaceRule fontFaceRule, int contextId, String? baseHref) async { CSSStyleDeclaration declaration = fontFaceRule.declarations; String fontFamily = declaration.getPropertyValue('fontFamily'); String url = declaration.getPropertyValue('src'); @@ -89,12 +89,12 @@ class CSSFontFace { loader.addFont(bytes); loader.load(); } else { - Uri? uri = _resolveFontSource(contextId, targetFont.src); + Uri? uri = _resolveFontSource(contextId, targetFont.src, baseHref); if (uri == null) return; WebFBundle bundle = WebFBundle.fromUrl(uri.toString()); await bundle.resolve(contextId); assert(bundle.isResolved, 'Failed to obtain $url'); - FontLoader loader = FontLoader(fontFamily); + FontLoader loader = FontLoader(removeQuotationMark(fontFamily)); Future bytes = Future.value(bundle.data?.buffer.asByteData()); loader.addFont(bytes); loader.load(); diff --git a/webf/lib/src/css/rule_set.dart b/webf/lib/src/css/rule_set.dart index 4e81dc3de8..82925c8cfe 100644 --- a/webf/lib/src/css/rule_set.dart +++ b/webf/lib/src/css/rule_set.dart @@ -33,13 +33,13 @@ class RuleSet { int _lastPosition = 0; - void addRules(List rules) { + void addRules(List rules, { required String? baseHref }) { for (CSSRule rule in rules) { - addRule(rule); + addRule(rule, baseHref: baseHref); } } - void addRule(CSSRule rule) { + void addRule(CSSRule rule, { required String? baseHref }) { rule.position = _lastPosition++; if (rule is CSSStyleRule) { for (final selector in rule.selectorGroup.selectors) { @@ -48,7 +48,7 @@ class RuleSet { } else if (rule is CSSKeyframesRule) { keyframesRules[rule.name] = rule; } else if (rule is CSSFontFaceRule) { - CSSFontFace.resolveFontFaceRules(rule, ownerDocument.contextId!); + CSSFontFace.resolveFontFaceRules(rule, ownerDocument.contextId!, baseHref); } else { assert(false, 'Unsupported rule type: ${rule.runtimeType}'); } diff --git a/webf/lib/src/dom/document.dart b/webf/lib/src/dom/document.dart index 3dbf1db096..90bcfd5056 100644 --- a/webf/lib/src/dom/document.dart +++ b/webf/lib/src/dom/document.dart @@ -441,7 +441,7 @@ class Document extends ContainerNode { styleSheets.addAll(sheets.map((e) => e.clone())); ruleSet.reset(); for (var sheet in sheets) { - ruleSet.addRules(sheet.cssRules); + ruleSet.addRules(sheet.cssRules, baseHref: sheet.href); } } diff --git a/webf/lib/src/dom/style_node_manager.dart b/webf/lib/src/dom/style_node_manager.dart index d9d0539c71..2db4228b4c 100644 --- a/webf/lib/src/dom/style_node_manager.dart +++ b/webf/lib/src/dom/style_node_manager.dart @@ -136,20 +136,20 @@ class StyleNodeManager { if (equals(oldSheets[index].cssRules, newSheets[index].cssRules)) { continue; } - ruleSet.addRules(newSheets[index].cssRules); - ruleSet.addRules(oldSheets[index].cssRules); + ruleSet.addRules(newSheets[index].cssRules, baseHref: newSheets[index].href); + ruleSet.addRules(oldSheets[index].cssRules, baseHref: oldSheets[index].href); } if (index == oldSheetsCount) { for (; index < newSheetsCount; index++) { - ruleSet.addRules(newSheets[index].cssRules); + ruleSet.addRules(newSheets[index].cssRules, baseHref: newSheets[index].href); } return ruleSet; } if (index == newSheetsCount) { for (; index < oldSheetsCount; index++) { - ruleSet.addRules(oldSheets[index].cssRules); + ruleSet.addRules(oldSheets[index].cssRules, baseHref: oldSheets[index].href); } return ruleSet; } @@ -166,7 +166,7 @@ class StyleNodeManager { } CSSStyleSheet sheet1 = mergeSorted[index]; if (index == mergeSorted.length - 1 || sheet != sheet1) { - ruleSet.addRules(sheet1.cssRules); + ruleSet.addRules(sheet1.cssRules, baseHref: sheet1.href); continue; } @@ -178,8 +178,8 @@ class StyleNodeManager { continue; } - ruleSet.addRules(sheet1.cssRules); - ruleSet.addRules(sheet2.cssRules); + ruleSet.addRules(sheet1.cssRules, baseHref: sheet1.href); + ruleSet.addRules(sheet2.cssRules, baseHref: sheet2.href); } return ruleSet;