Skip to content

Commit f81b691

Browse files
authored
Merge pull request #843 from Automattic/fix/842-action-reference-elements
2 parents 2030faa + c6c53a1 commit f81b691

2 files changed

Lines changed: 13 additions & 1 deletion

File tree

php-transformer/src/WordPressSitePlan/WordPressSitePlan.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1026,6 +1026,7 @@ private static function assertNoLocalBrowserReferences(string $content, string $
10261026
foreach (self::htmlMarkupNodes($content) as $node) {
10271027
if ('tag' === $node['kind']) foreach ($node['attributes'] as $name => $value) {
10281028
if (!in_array($name, array('xlink:href', 'srcset', 'src', 'href', 'poster', 'action', 'style'), true)) continue;
1029+
if ('action' === $name && 'form' !== $node['name']) continue;
10291030
if ('style' === $name) { $assertCss($value, 'style_attribute'); continue; }
10301031
foreach ('srcset' === $name ? self::srcsetCandidates($value) : array($value) as $candidate) $assertReference($candidate, $name, $node['name']);
10311032
}
@@ -1035,7 +1036,12 @@ private static function assertNoLocalBrowserReferences(string $content, string $
10351036
if (is_array($attributes)) {
10361037
$assertJsonAttributes($attributes, self::jsonUrlIsRoute($node['content']));
10371038
} elseif (preg_match_all('~(?:"|\\\\u0022)(url|src|href|poster|action|srcset)(?:"|\\\\u0022)\s*:\s*(?:"|\\\\u0022)(.*?)(?:"|\\\\u0022)~is', $node['content'], $fields, PREG_SET_ORDER)) {
1038-
foreach ($fields as $field) foreach ('srcset' === strtolower($field[1]) ? self::srcsetCandidates($field[2]) : array($field[2]) as $candidate) $assertReference((string) $candidate, 'json:' . strtolower($field[1]));
1039+
$route = self::jsonUrlIsRoute($node['content']);
1040+
foreach ($fields as $field) {
1041+
$name = strtolower($field[1]);
1042+
$routeField = $route && 'url' === $name ? 'route_url' : (in_array($name, array('href', 'action'), true) ? 'route_' . $name : $name);
1043+
foreach ('srcset' === $name ? self::srcsetCandidates($field[2]) : array($field[2]) as $candidate) $assertReference(str_replace('\\/', '/', (string) $candidate), 'json:' . $routeField);
1044+
}
10391045
}
10401046
}
10411047
}

php-transformer/tests/contract/wordpress-site-plan.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,12 @@
622622
WordPressSitePlan::assertValid($duplicateExternalFirst); $assert(true, 'Validation ignores later duplicate browser attribute values.');
623623
$formAction = $plan; $formAction['pages'][0]['canonical_block_markup'] .= '<form action="back"><button>Back</button></form>'; $formAction['pages'][0]['content_hash'] = WordPressSitePlan::contentHash($formAction['pages'][0]['canonical_block_markup']);
624624
$throws(static fn() => WordPressSitePlan::assertValid($formAction), 'Validation rejects unresolved local form action references.');
625+
$customAction = $plan; $customAction['pages'][0]['canonical_block_markup'] .= '<fb:like action="like"></fb:like>'; $customAction['pages'][0]['content_hash'] = WordPressSitePlan::contentHash($customAction['pages'][0]['canonical_block_markup']);
626+
WordPressSitePlan::assertValid($customAction); $assert(true, 'Validation ignores non-URL action metadata on custom elements.');
627+
$escapedRootReference = $plan; $escapedRootReference['pages'][0]['canonical_block_markup'] .= '<!-- wp:html {\u0022href\u0022:\u0022\/2\/post\/example.html\u0022} /-->'; $escapedRootReference['pages'][0]['content_hash'] = WordPressSitePlan::contentHash($escapedRootReference['pages'][0]['canonical_block_markup']);
628+
WordPressSitePlan::assertValid($escapedRootReference); $assert(true, 'Fallback block-comment validation decodes escaped root-relative references.');
629+
$escapedLocalReference = $plan; $escapedLocalReference['pages'][0]['canonical_block_markup'] .= '<!-- wp:html {\u0022href\u0022:\u0022images\/missing.svg\u0022} /-->'; $escapedLocalReference['pages'][0]['content_hash'] = WordPressSitePlan::contentHash($escapedLocalReference['pages'][0]['canonical_block_markup']);
630+
$throws(static fn() => WordPressSitePlan::assertValid($escapedLocalReference), 'Fallback block-comment validation rejects escaped unresolved local references.');
625631
$semanticAction = $plan; $semanticAction['pages'][0]['canonical_block_markup'] .= '<div data-options="{&quot;action&quot;:&quot;message&quot;}"></div>'; $semanticAction['pages'][0]['content_hash'] = WordPressSitePlan::contentHash($semanticAction['pages'][0]['canonical_block_markup']);
626632
WordPressSitePlan::assertValid($semanticAction); $assert(true, 'Validation does not classify semantic JSON action values as browser references.');
627633
$embeddedIframe = $plan; $embeddedIframe['pages'][0]['canonical_block_markup'] .= '<div data-html="&lt;iframe src=&quot;https://www.youtube.com/embed/hs5KoEYi0R8?feature=oembed&quot;&gt;&lt;/iframe&gt;"></div>'; $embeddedIframe['pages'][0]['content_hash'] = WordPressSitePlan::contentHash($embeddedIframe['pages'][0]['canonical_block_markup']);

0 commit comments

Comments
 (0)