From 54248bd2507ced76046e381dd98d552bd0cdb890 Mon Sep 17 00:00:00 2001 From: andycall Date: Mon, 17 Jul 2023 23:19:54 +0800 Subject: [PATCH] fix: fix @font-face url resolve with different url bases. --- .../relative-path-font-face.html.0.png | Bin 0 -> 3429 bytes .../css-fonts/relative-path-font-face.html | 25 ++++++++++++++++++ .../flutter/generated_plugin_registrant.cc | 3 --- .../windows/flutter/generated_plugins.cmake | 1 - webf/lib/src/css/font_face.dart | 10 +++---- webf/lib/src/css/rule_set.dart | 8 +++--- webf/lib/src/dom/document.dart | 2 +- webf/lib/src/dom/style_node_manager.dart | 14 +++++----- 8 files changed, 42 insertions(+), 21 deletions(-) create mode 100644 integration_tests/snapshots/css/css-fonts/relative-path-font-face.html.0.png create mode 100644 integration_tests/specs/css/css-fonts/relative-path-font-face.html 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 0000000000000000000000000000000000000000..048108d441ee39e1dd8f0e23c1d9973750d9c309 GIT binary patch literal 3429 zcmeHK{ZG?p5HH3EVIrGLAc~_4+r&izk#9-cgcr zKe7F0Q%>52w8FU3?)LWUgw5T*-~Qo2u4`-U&QA|ze5m{Q%sI5hM0$s*>rrGDUY}Wc zr7aF;^DHxAeJN777Pn(CqDjUrtZbgdeYq;(?T-MNuB2_}xu2^rODhERmFcBB1b*i? zS)!L+ofd-gPjrYf2^G3)tMe9(&)Q`oib6&lg@lc95#M6okL!E(b0I0 zOyhfB2|QZjgmq72>W#OOGhcDFV|cO3gw?&94h)HZwO&ID`_qT}?^duZ7xAL&J?g*- z7R&p3js!t6QDFIUvdBH2PSO#HM9yz8sbP@gkV@(oNw5XIyrH$VmBiXasjeEsKvYcq zRta(VqVggFpYQBmPp_%>08njPeO#9}vhUBBtZWeu9ikp5Qm(bD_YBiNJ&$FVaz^x0+K^MgB#JlKjTzB}#!-afK2i z|E?Gkt8C;`3&RFc&<^!M`(`8YtCkf4b-!HNOrh)%JQ z58NE)ucB}5Q!16Frrysr107YzZ%0CBEvRJVNj@#yZ0%9GA1_&D;>d)@&Xu>ECV1%t z(?0KN#gTKx0fx^s)~KJFnj*U&eE>n8dA>uNr3v+h9AQ%xngSrVC&?lfN zGt?`QpxJk{dimBhD6%X~r2IMgc*Dg+e58l34!rCxa2a>ktgxrOvE>}2(3kye7C)&) zRURE_Vr&+FM~fQxjv)wkt*bp5^f?$*DyT9_7g&`-hAR*V7*0J*0O&AXB4*NR_@KWE zbpB30o6VNDA;Q5qh8?pqN@D!Pa2eu^4aR&QB9LmfoL^JBzC22zDTtyV+6d8E5FLln ijS$_2|JODQ;J + + + + + + 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;