diff --git a/javascript/packages/rewriter/test/action-view-tag-helper-to-html.test.ts b/javascript/packages/rewriter/test/action-view-tag-helper-to-html.test.ts
index 9b0b61db2..4d24d860d 100644
--- a/javascript/packages/rewriter/test/action-view-tag-helper-to-html.test.ts
+++ b/javascript/packages/rewriter/test/action-view-tag-helper-to-html.test.ts
@@ -655,7 +655,7 @@ describe("ActionViewTagHelperToHTMLRewriter", () => {
test("javascript_include_tag with defer", () => {
expect(transform(`<%= javascript_include_tag "application", defer: true %>`)).toBe(
- ``
+ ``
)
})
@@ -670,7 +670,7 @@ describe("ActionViewTagHelperToHTMLRewriter", () => {
test("javascript_include_tag with nonce true resolves to content_security_policy_nonce", () => {
expect(transform(`<%= javascript_include_tag "application", nonce: true %>`)).toBe(
- ``
+ ``
)
})
@@ -682,13 +682,13 @@ describe("ActionViewTagHelperToHTMLRewriter", () => {
test("javascript_include_tag with interpolated nonce", () => {
expect(transform('<%= javascript_include_tag "application", nonce: "static-#{dynamic}" %>')).toBe(
- ''
+ ''
)
})
test("javascript_include_tag with data attributes", () => {
expect(transform(`<%= javascript_include_tag "application", data: { turbo_track: "reload" } %>`)).toBe(
- ``
+ ``
)
})
@@ -718,25 +718,25 @@ describe("ActionViewTagHelperToHTMLRewriter", () => {
test("javascript_include_tag with URL and nonce", () => {
expect(transform(`<%= javascript_include_tag "http://www.example.com/xmlhr.js", nonce: true %>`)).toBe(
- ``
+ ``
)
})
test("javascript_include_tag with URL and async", () => {
expect(transform(`<%= javascript_include_tag "http://www.example.com/xmlhr.js", async: true %>`)).toBe(
- ``
+ ``
)
})
test("javascript_include_tag with URL and defer", () => {
expect(transform(`<%= javascript_include_tag "http://www.example.com/xmlhr.js", defer: true %>`)).toBe(
- ``
+ ``
)
})
test("javascript_include_tag with defer as string", () => {
expect(transform(`<%= javascript_include_tag "application", defer: "true" %>`)).toBe(
- ``
+ ``
)
})
diff --git a/src/analyze/action_view/tag_helpers.c b/src/analyze/action_view/tag_helpers.c
index e4065363e..493afd93d 100644
--- a/src/analyze/action_view/tag_helpers.c
+++ b/src/analyze/action_view/tag_helpers.c
@@ -433,11 +433,51 @@ static AST_NODE_T* remove_attribute_by_name(hb_array_T* attributes, const char*
return NULL;
}
+static void remove_asset_tag_non_html_options(hb_array_T* attributes) {
+ if (!attributes) { return; }
+
+ remove_attribute_by_name(attributes, "extname");
+ remove_attribute_by_name(attributes, "host");
+ remove_attribute_by_name(attributes, "protocol");
+ remove_attribute_by_name(attributes, "skip-pipeline");
+ remove_attribute_by_name(attributes, "nopush");
+ remove_attribute_by_name(attributes, "preload-links-header");
+}
+
+static AST_NODE_T* extract_crossorigin_attribute(hb_array_T* attributes, hb_allocator_T* allocator) {
+ AST_NODE_T* node = remove_attribute_by_name(attributes, "crossorigin");
+
+ if (!node || node->type != AST_HTML_ATTRIBUTE_NODE) { return node; }
+
+ AST_HTML_ATTRIBUTE_NODE_T* attribute = (AST_HTML_ATTRIBUTE_NODE_T*) node;
+
+ if (!attribute->value || !attribute->value->children || hb_array_size(attribute->value->children) != 1) {
+ return node;
+ }
+
+ AST_NODE_T* value = (AST_NODE_T*) hb_array_get(attribute->value->children, 0);
+
+ if (!value || value->type != AST_LITERAL_NODE) { return node; }
+
+ AST_LITERAL_NODE_T* literal = (AST_LITERAL_NODE_T*) value;
+
+ if (!hb_string_equals(literal->content, hb_string("true"))) { return node; }
+
+ return (AST_NODE_T*) create_html_attribute_node(
+ "crossorigin",
+ "anonymous",
+ attribute->base.location.start,
+ attribute->base.location.end,
+ allocator
+ );
+}
+
static hb_array_T* prepend_stylesheet_link_tag_attributes(
hb_array_T* attributes,
tag_helper_parse_context_T* parse_context,
pm_node_t* source_argument,
const char* path_options,
+ AST_NODE_T* crossorigin_attribute,
hb_allocator_T* allocator
) {
bool source_is_string = (source_argument->type == PM_STRING_NODE);
@@ -485,6 +525,7 @@ static hb_array_T* prepend_stylesheet_link_tag_attributes(
hb_allocator_dealloc(allocator, source_value);
if (href_attribute) { attributes = prepend_attribute(attributes, (AST_NODE_T*) href_attribute, allocator); }
+ if (crossorigin_attribute) { attributes = prepend_attribute(attributes, crossorigin_attribute, allocator); }
AST_NODE_T* rel_attribute = remove_attribute_by_name(attributes, "rel");
@@ -535,6 +576,7 @@ static AST_NODE_T* transform_tag_helper_with_attributes(
}
char* path_options = NULL;
+ AST_NODE_T* crossorigin_attribute = NULL;
if (attributes && handler->name && strcmp(handler->name, "javascript_include_tag") == 0) {
path_options = extract_path_options_from_keyword_hash(
@@ -543,10 +585,8 @@ static AST_NODE_T* transform_tag_helper_with_attributes(
allocator
);
- remove_attribute_by_name(attributes, "extname");
- remove_attribute_by_name(attributes, "host");
- remove_attribute_by_name(attributes, "protocol");
- remove_attribute_by_name(attributes, "skip-pipeline");
+ remove_asset_tag_non_html_options(attributes);
+ crossorigin_attribute = extract_crossorigin_attribute(attributes, allocator);
}
if (attributes && handler->name && strcmp(handler->name, "stylesheet_link_tag") == 0) {
@@ -556,10 +596,8 @@ static AST_NODE_T* transform_tag_helper_with_attributes(
allocator
);
- remove_attribute_by_name(attributes, "extname");
- remove_attribute_by_name(attributes, "host");
- remove_attribute_by_name(attributes, "protocol");
- remove_attribute_by_name(attributes, "skip-pipeline");
+ remove_asset_tag_non_html_options(attributes);
+ crossorigin_attribute = extract_crossorigin_attribute(attributes, allocator);
}
if (attributes && handler->name && strcmp(handler->name, "image_tag") == 0) {
@@ -748,7 +786,8 @@ static AST_NODE_T* transform_tag_helper_with_attributes(
? create_html_attribute_node("src", source_attribute_value, source_start, source_end, allocator)
: create_html_attribute_with_ruby_literal("src", source_attribute_value, source_start, source_end, allocator);
- if (source_attribute) { hb_array_append(attributes, (AST_NODE_T*) source_attribute); }
+ if (crossorigin_attribute) { attributes = prepend_attribute(attributes, crossorigin_attribute, allocator); }
+ if (source_attribute) { attributes = prepend_attribute(attributes, (AST_NODE_T*) source_attribute, allocator); }
if (source_attribute_value != source_value) { hb_allocator_dealloc(allocator, source_attribute_value); }
hb_allocator_dealloc(allocator, source_value);
@@ -806,8 +845,14 @@ static AST_NODE_T* transform_tag_helper_with_attributes(
if (first_argument->type != PM_KEYWORD_HASH_NODE) {
if (!attributes) { attributes = hb_array_init(4, allocator); }
- attributes =
- prepend_stylesheet_link_tag_attributes(attributes, parse_context, first_argument, path_options, allocator);
+ attributes = prepend_stylesheet_link_tag_attributes(
+ attributes,
+ parse_context,
+ first_argument,
+ path_options,
+ crossorigin_attribute,
+ allocator
+ );
}
}
@@ -958,12 +1003,69 @@ static size_t count_asset_tag_sources(pm_call_node_t* call_node) {
return count;
}
+static bool asset_tag_sources_are_equal(pm_node_t* left, pm_node_t* right) {
+ bool left_is_string = (left->type == PM_STRING_NODE);
+ bool right_is_string = (right->type == PM_STRING_NODE);
+
+ if (left_is_string != right_is_string) { return false; }
+
+ if (left_is_string) {
+ pm_string_t* left_string = &((pm_string_node_t*) left)->unescaped;
+ pm_string_t* right_string = &((pm_string_node_t*) right)->unescaped;
+ size_t length = pm_string_length(left_string);
+
+ return length == pm_string_length(right_string)
+ && memcmp(pm_string_source(left_string), pm_string_source(right_string), length) == 0;
+ }
+
+ size_t left_length = left->location.end - left->location.start;
+ size_t right_length = right->location.end - right->location.start;
+
+ return left_length == right_length && memcmp(left->location.start, right->location.start, left_length) == 0;
+}
+
+static size_t collect_unique_asset_tag_sources(pm_call_node_t* call_node, pm_node_t** sources, size_t capacity) {
+ size_t total = count_asset_tag_sources(call_node);
+ size_t unique = 0;
+
+ for (size_t i = 0; i < total && unique < capacity; i++) {
+ pm_node_t* source = call_node->arguments->arguments.nodes[i];
+ bool seen = false;
+
+ for (size_t j = 0; j < unique; j++) {
+ if (asset_tag_sources_are_equal(sources[j], source)) {
+ seen = true;
+ break;
+ }
+ }
+
+ if (!seen) { sources[unique++] = source; }
+ }
+
+ return unique;
+}
+
+static size_t count_unique_asset_tag_sources(pm_call_node_t* call_node) {
+ size_t total = count_asset_tag_sources(call_node);
+
+ if (total == 0) { return 0; }
+
+ pm_node_t** sources = malloc(sizeof(pm_node_t*) * total);
+ if (!sources) { return total; }
+
+ size_t unique = collect_unique_asset_tag_sources(call_node, sources, total);
+ free(sources);
+
+ return unique;
+}
+
static AST_NODE_T* create_javascript_include_tag_element(
AST_ERB_CONTENT_NODE_T* erb_node,
tag_helper_parse_context_T* parse_context,
pm_node_t* source_argument,
hb_array_T* shared_attributes,
const char* path_options,
+ AST_NODE_T* crossorigin_attribute,
hb_allocator_T* allocator
) {
position_T tag_name_start, tag_name_end;
@@ -1008,13 +1110,14 @@ static AST_NODE_T* create_javascript_include_tag_element(
hb_allocator_dealloc(allocator, quoted_source);
}
- hb_array_T* attributes = hb_array_init(hb_array_size(shared_attributes) + 1, allocator);
+ hb_array_T* attributes = hb_array_init(hb_array_size(shared_attributes) + 2, allocator);
AST_HTML_ATTRIBUTE_NODE_T* source_attribute =
is_url
? create_html_attribute_node("src", source_attribute_value, source_start, source_end, allocator)
: create_html_attribute_with_ruby_literal("src", source_attribute_value, source_start, source_end, allocator);
if (source_attribute) { hb_array_append(attributes, source_attribute); }
+ if (crossorigin_attribute) { hb_array_append(attributes, crossorigin_attribute); }
for (size_t i = 0; i < hb_array_size(shared_attributes); i++) {
hb_array_append(attributes, hb_array_get(shared_attributes, i));
@@ -1068,6 +1171,11 @@ static hb_array_T* transform_javascript_include_tag_multi_source(
if (source_count == 0) { return NULL; }
+ pm_node_t** sources = hb_allocator_alloc(allocator, sizeof(pm_node_t*) * source_count);
+ if (!sources) { return NULL; }
+
+ size_t unique_count = collect_unique_asset_tag_sources(call_node, sources, source_count);
+
hb_array_T* shared_attributes = extract_html_attributes_from_call_node(
call_node,
parse_context->prism_source,
@@ -1081,21 +1189,21 @@ static hb_array_T* transform_javascript_include_tag_multi_source(
char* path_options =
extract_path_options_from_keyword_hash(call_node, JAVASCRIPT_INCLUDE_TAG_PATH_OPTIONS, allocator);
- remove_attribute_by_name(shared_attributes, "extname");
- remove_attribute_by_name(shared_attributes, "host");
- remove_attribute_by_name(shared_attributes, "protocol");
- remove_attribute_by_name(shared_attributes, "skip-pipeline");
+ remove_asset_tag_non_html_options(shared_attributes);
+
+ AST_NODE_T* crossorigin_attribute = extract_crossorigin_attribute(shared_attributes, allocator);
- hb_array_T* elements = hb_array_init(source_count * 2, allocator);
+ hb_array_T* elements = hb_array_init(unique_count * 2, allocator);
- for (size_t i = 0; i < source_count; i++) {
- pm_node_t* source_arg = call_node->arguments->arguments.nodes[i];
+ for (size_t i = 0; i < unique_count; i++) {
+ pm_node_t* source_arg = sources[i];
AST_NODE_T* element = create_javascript_include_tag_element(
erb_node,
parse_context,
source_arg,
shared_attributes,
path_options,
+ crossorigin_attribute,
allocator
);
@@ -1116,6 +1224,8 @@ static hb_array_T* transform_javascript_include_tag_multi_source(
}
}
+ hb_allocator_dealloc(allocator, sources);
+
return elements;
}
@@ -1125,6 +1235,7 @@ static AST_NODE_T* create_stylesheet_link_tag_element(
pm_node_t* source_argument,
hb_array_T* shared_attributes,
const char* path_options,
+ AST_NODE_T* crossorigin_attribute,
hb_allocator_T* allocator
) {
position_T tag_name_start, tag_name_end;
@@ -1138,14 +1249,20 @@ static AST_NODE_T* create_stylesheet_link_tag_element(
token_T* tag_name_token = create_synthetic_token(allocator, "link", TOKEN_IDENTIFIER, tag_name_start, tag_name_end);
- hb_array_T* attributes = hb_array_init(hb_array_size(shared_attributes) + 2, allocator);
+ hb_array_T* attributes = hb_array_init(hb_array_size(shared_attributes) + 3, allocator);
for (size_t i = 0; i < hb_array_size(shared_attributes); i++) {
hb_array_append(attributes, hb_array_get(shared_attributes, i));
}
- attributes =
- prepend_stylesheet_link_tag_attributes(attributes, parse_context, source_argument, path_options, allocator);
+ attributes = prepend_stylesheet_link_tag_attributes(
+ attributes,
+ parse_context,
+ source_argument,
+ path_options,
+ crossorigin_attribute,
+ allocator
+ );
AST_ERB_OPEN_TAG_NODE_T* open_tag_node = ast_erb_open_tag_node_init(
erb_node->tag_opening,
@@ -1184,6 +1301,11 @@ static hb_array_T* transform_stylesheet_link_tag_multi_source(
if (source_count == 0) { return NULL; }
+ pm_node_t** sources = hb_allocator_alloc(allocator, sizeof(pm_node_t*) * source_count);
+ if (!sources) { return NULL; }
+
+ size_t unique_count = collect_unique_asset_tag_sources(call_node, sources, source_count);
+
hb_array_T* shared_attributes = extract_html_attributes_from_call_node(
call_node,
parse_context->prism_source,
@@ -1196,21 +1318,21 @@ static hb_array_T* transform_stylesheet_link_tag_multi_source(
resolve_nonce_attribute(shared_attributes, allocator);
char* path_options = extract_path_options_from_keyword_hash(call_node, STYLESHEET_LINK_TAG_PATH_OPTIONS, allocator);
- remove_attribute_by_name(shared_attributes, "extname");
- remove_attribute_by_name(shared_attributes, "host");
- remove_attribute_by_name(shared_attributes, "protocol");
- remove_attribute_by_name(shared_attributes, "skip-pipeline");
+ remove_asset_tag_non_html_options(shared_attributes);
+
+ AST_NODE_T* crossorigin_attribute = extract_crossorigin_attribute(shared_attributes, allocator);
- hb_array_T* elements = hb_array_init(source_count * 2, allocator);
+ hb_array_T* elements = hb_array_init(unique_count * 2, allocator);
- for (size_t i = 0; i < source_count; i++) {
- pm_node_t* source_arg = call_node->arguments->arguments.nodes[i];
+ for (size_t i = 0; i < unique_count; i++) {
+ pm_node_t* source_arg = sources[i];
AST_NODE_T* element = create_stylesheet_link_tag_element(
erb_node,
parse_context,
source_arg,
shared_attributes,
path_options,
+ crossorigin_attribute,
allocator
);
@@ -1231,6 +1353,8 @@ static hb_array_T* transform_stylesheet_link_tag_multi_source(
}
}
+ hb_allocator_dealloc(allocator, sources);
+
return elements;
}
@@ -1788,7 +1912,7 @@ void transform_tag_helper_array(hb_array_T* array, analyze_ruby_context_T* conte
bool is_multi_source_asset_tag = (strcmp(parse_context->matched_handler->name, "javascript_include_tag") == 0
|| strcmp(parse_context->matched_handler->name, "stylesheet_link_tag") == 0)
&& parse_context->info->call_node
- && count_asset_tag_sources(parse_context->info->call_node) > 1;
+ && count_unique_asset_tag_sources(parse_context->info->call_node) > 1;
if (is_multi_source_asset_tag) {
hb_array_T* multi = strcmp(parse_context->matched_handler->name, "stylesheet_link_tag") == 0
diff --git a/test/analyze/action_view/asset_tag_helper/javascript_include_tag_test.rb b/test/analyze/action_view/asset_tag_helper/javascript_include_tag_test.rb
index 188567b96..260b7c56b 100644
--- a/test/analyze/action_view/asset_tag_helper/javascript_include_tag_test.rb
+++ b/test/analyze/action_view/asset_tag_helper/javascript_include_tag_test.rb
@@ -125,5 +125,29 @@ class JavaScriptIncludeTagTest < Minitest::Spec
<%= javascript_include_tag "application", skip_pipeline: true %>
HTML
end
+
+ test "javascript_include_tag with duplicate sources" do
+ assert_parsed_snapshot(<<~HTML, action_view_helpers: true)
+ <%= javascript_include_tag "application", "application" %>
+ HTML
+ end
+
+ test "javascript_include_tag with crossorigin true" do
+ assert_parsed_snapshot(<<~HTML, action_view_helpers: true)
+ <%= javascript_include_tag "application", crossorigin: true %>
+ HTML
+ end
+
+ test "javascript_include_tag with nopush" do
+ assert_parsed_snapshot(<<~HTML, action_view_helpers: true)
+ <%= javascript_include_tag "application", nopush: true %>
+ HTML
+ end
+
+ test "javascript_include_tag with preload_links_header" do
+ assert_parsed_snapshot(<<~HTML, action_view_helpers: true)
+ <%= javascript_include_tag "application", preload_links_header: false %>
+ HTML
+ end
end
end
diff --git a/test/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test.rb b/test/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test.rb
index b12839c14..6e1f8b4d4 100644
--- a/test/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test.rb
+++ b/test/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test.rb
@@ -113,5 +113,29 @@ class StylesheetLinkTagTest < Minitest::Spec
<%= stylesheet_link_tag "application", "admin", media: "all" %>
HTML
end
+
+ test "stylesheet_link_tag with duplicate sources" do
+ assert_parsed_snapshot(<<~HTML, action_view_helpers: true)
+ <%= stylesheet_link_tag "application", "application" %>
+ HTML
+ end
+
+ test "stylesheet_link_tag with crossorigin true" do
+ assert_parsed_snapshot(<<~HTML, action_view_helpers: true)
+ <%= stylesheet_link_tag "application", crossorigin: true %>
+ HTML
+ end
+
+ test "stylesheet_link_tag with nopush" do
+ assert_parsed_snapshot(<<~HTML, action_view_helpers: true)
+ <%= stylesheet_link_tag "application", nopush: true %>
+ HTML
+ end
+
+ test "stylesheet_link_tag with preload_links_header" do
+ assert_parsed_snapshot(<<~HTML, action_view_helpers: true)
+ <%= stylesheet_link_tag "application", preload_links_header: false %>
+ HTML
+ end
end
end
diff --git a/test/engine/action_view/javascript_include_tag_test.rb b/test/engine/action_view/javascript_include_tag_test.rb
index ac6545ee4..5563037a2 100644
--- a/test/engine/action_view/javascript_include_tag_test.rb
+++ b/test/engine/action_view/javascript_include_tag_test.rb
@@ -11,7 +11,7 @@ class JavascriptIncludeTagTest < Minitest::Spec
assert_optimized_snapshot('<%= javascript_include_tag "application" %>')
end
- # TODO: Attribute ordering (defer before src) and boolean attribute style (defer vs defer="defer")
+ # TODO: Boolean attribute style (defer vs defer="defer")
test "javascript_include_tag with defer" do
assert_optimized_mismatch_snapshot('<%= javascript_include_tag "application", defer: true %>')
end
@@ -20,14 +20,41 @@ class JavascriptIncludeTagTest < Minitest::Spec
assert_optimized_snapshot('<%= javascript_include_tag "http://www.example.com/xmlhr.js" %>')
end
- # TODO: Boolean attribute style (async vs async="async") and attribute ordering
+ # TODO: Boolean attribute style (async vs async="async")
test "javascript_include_tag with URL and async" do
assert_optimized_mismatch_snapshot('<%= javascript_include_tag "http://www.example.com/xmlhr.js", async: true %>')
end
- # TODO: Attribute ordering (data-turbo-track before src vs after)
test "javascript_include_tag with data attributes" do
- assert_optimized_mismatch_snapshot('<%= javascript_include_tag "application", data: { turbo_track: "reload" } %>')
+ assert_optimized_snapshot('<%= javascript_include_tag "application", data: { turbo_track: "reload" } %>')
+ end
+
+ test "javascript_include_tag with duplicate sources" do
+ assert_optimized_snapshot('<%= javascript_include_tag "application", "application" %>')
+ end
+
+ test "javascript_include_tag with duplicate sources among distinct ones" do
+ assert_optimized_snapshot('<%= javascript_include_tag "application", "vendor", "application" %>')
+ end
+
+ test "javascript_include_tag with crossorigin true" do
+ assert_optimized_snapshot('<%= javascript_include_tag "application", crossorigin: true %>')
+ end
+
+ test "javascript_include_tag with crossorigin string" do
+ assert_optimized_snapshot('<%= javascript_include_tag "application", crossorigin: "use-credentials" %>')
+ end
+
+ test "javascript_include_tag with nopush" do
+ assert_optimized_snapshot('<%= javascript_include_tag "application", nopush: true %>')
+ end
+
+ test "javascript_include_tag with preload_links_header" do
+ assert_optimized_snapshot('<%= javascript_include_tag "application", preload_links_header: false %>')
+ end
+
+ test "javascript_include_tag with integrity" do
+ assert_optimized_snapshot('<%= javascript_include_tag "application", integrity: "sha256-abc" %>')
end
end
end
diff --git a/test/engine/action_view/stylesheet_link_tag_test.rb b/test/engine/action_view/stylesheet_link_tag_test.rb
index 5508299b5..30470a468 100644
--- a/test/engine/action_view/stylesheet_link_tag_test.rb
+++ b/test/engine/action_view/stylesheet_link_tag_test.rb
@@ -60,6 +60,34 @@ class StylesheetLinkTagTest < Minitest::Spec
test "stylesheet_link_tag with multiple sources and media" do
assert_optimized_snapshot('<%= stylesheet_link_tag "application", "admin", media: "all" %>')
end
+
+ test "stylesheet_link_tag with duplicate sources" do
+ assert_optimized_snapshot('<%= stylesheet_link_tag "application", "application" %>')
+ end
+
+ test "stylesheet_link_tag with duplicate sources among distinct ones" do
+ assert_optimized_snapshot('<%= stylesheet_link_tag "application", "admin", "application" %>')
+ end
+
+ test "stylesheet_link_tag with crossorigin true" do
+ assert_optimized_snapshot('<%= stylesheet_link_tag "application", crossorigin: true %>')
+ end
+
+ test "stylesheet_link_tag with crossorigin string" do
+ assert_optimized_snapshot('<%= stylesheet_link_tag "application", crossorigin: "use-credentials", media: "all" %>')
+ end
+
+ test "stylesheet_link_tag with nopush" do
+ assert_optimized_snapshot('<%= stylesheet_link_tag "application", nopush: true %>')
+ end
+
+ test "stylesheet_link_tag with preload_links_header" do
+ assert_optimized_snapshot('<%= stylesheet_link_tag "application", preload_links_header: false %>')
+ end
+
+ test "stylesheet_link_tag with integrity" do
+ assert_optimized_snapshot('<%= stylesheet_link_tag "application", integrity: "sha256-abc" %>')
+ end
end
end
end
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0003_javascript_include_tag_with_defer_3bfdc4f61b770eb2a3dc138c52381ba7-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0003_javascript_include_tag_with_defer_3bfdc4f61b770eb2a3dc138c52381ba7-ef4af315cb33925c38d24ea3c2e8a1cd.txt
index 3587353d9..6c3d28f65 100644
--- a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0003_javascript_include_tag_with_defer_3bfdc4f61b770eb2a3dc138c52381ba7-ef4af315cb33925c38d24ea3c2e8a1cd.txt
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0003_javascript_include_tag_with_defer_3bfdc4f61b770eb2a3dc138c52381ba7-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -14,36 +14,36 @@ options: {action_view_helpers: true}
│ │ ├── tag_closing: "%>" (location: (1:54)-(1:56))
│ │ ├── tag_name: "script" (location: (1:4)-(1:26))
│ │ └── children: (2 items)
- │ │ ├── @ HTMLAttributeNode (location: (1:42)-(1:47))
+ │ │ ├── @ HTMLAttributeNode (location: (1:27)-(1:40))
│ │ │ ├── name:
- │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:42)-(1:47))
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
│ │ │ │ └── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:42)-(1:47))
- │ │ │ │ └── content: "defer"
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "src"
│ │ │ │
│ │ │ │
- │ │ │ ├── equals: ∅
- │ │ │ └── value: ∅
+ │ │ │ ├── equals: ":" (location: (1:27)-(1:40))
+ │ │ │ └── value:
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
+ │ │ │ ├── open_quote: ∅
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "javascript_path(\"application\")"
+ │ │ │ │
+ │ │ │ ├── close_quote: ∅
+ │ │ │ └── quoted: true
│ │ │
- │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:40))
+ │ │ │
+ │ │ └── @ HTMLAttributeNode (location: (1:42)-(1:47))
│ │ ├── name:
- │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:42)-(1:47))
│ │ │ └── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "src"
+ │ │ │ └── @ LiteralNode (location: (1:42)-(1:47))
+ │ │ │ └── content: "defer"
│ │ │
│ │ │
- │ │ ├── equals: ":" (location: (1:27)-(1:40))
- │ │ └── value:
- │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
- │ │ ├── open_quote: ∅
- │ │ ├── children: (1 item)
- │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "javascript_path(\"application\")"
- │ │ │
- │ │ ├── close_quote: ∅
- │ │ └── quoted: true
- │ │
+ │ │ ├── equals: ∅
+ │ │ └── value: ∅
│ │
│ │
│ ├── tag_name: "script" (location: (1:4)-(1:26))
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0004_javascript_include_tag_with_nonce_true_4e9ac675501ab7d7b7f4b9cd0c549e49-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0004_javascript_include_tag_with_nonce_true_4e9ac675501ab7d7b7f4b9cd0c549e49-ef4af315cb33925c38d24ea3c2e8a1cd.txt
index d7056cdd9..a0dbe38f7 100644
--- a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0004_javascript_include_tag_with_nonce_true_4e9ac675501ab7d7b7f4b9cd0c549e49-ef4af315cb33925c38d24ea3c2e8a1cd.txt
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0004_javascript_include_tag_with_nonce_true_4e9ac675501ab7d7b7f4b9cd0c549e49-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -14,41 +14,41 @@ options: {action_view_helpers: true}
│ │ ├── tag_closing: "%>" (location: (1:54)-(1:56))
│ │ ├── tag_name: "script" (location: (1:4)-(1:26))
│ │ └── children: (2 items)
- │ │ ├── @ HTMLAttributeNode (location: (1:42)-(1:53))
+ │ │ ├── @ HTMLAttributeNode (location: (1:27)-(1:40))
│ │ │ ├── name:
- │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:42)-(1:47))
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
│ │ │ │ └── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:42)-(1:47))
- │ │ │ │ └── content: "nonce"
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "src"
│ │ │ │
│ │ │ │
- │ │ │ ├── equals: ": " (location: (1:47)-(1:49))
+ │ │ │ ├── equals: ":" (location: (1:27)-(1:40))
│ │ │ └── value:
- │ │ │ └── @ HTMLAttributeValueNode (location: (1:49)-(1:53))
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
│ │ │ ├── open_quote: ∅
│ │ │ ├── children: (1 item)
- │ │ │ │ └── @ RubyLiteralNode (location: (1:49)-(1:53))
- │ │ │ │ └── content: "content_security_policy_nonce"
+ │ │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "javascript_path(\"application\")"
│ │ │ │
│ │ │ ├── close_quote: ∅
│ │ │ └── quoted: true
│ │ │
│ │ │
- │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:40))
+ │ │ └── @ HTMLAttributeNode (location: (1:42)-(1:53))
│ │ ├── name:
- │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:42)-(1:47))
│ │ │ └── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "src"
+ │ │ │ └── @ LiteralNode (location: (1:42)-(1:47))
+ │ │ │ └── content: "nonce"
│ │ │
│ │ │
- │ │ ├── equals: ":" (location: (1:27)-(1:40))
+ │ │ ├── equals: ": " (location: (1:47)-(1:49))
│ │ └── value:
- │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
+ │ │ └── @ HTMLAttributeValueNode (location: (1:49)-(1:53))
│ │ ├── open_quote: ∅
│ │ ├── children: (1 item)
- │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "javascript_path(\"application\")"
+ │ │ │ └── @ RubyLiteralNode (location: (1:49)-(1:53))
+ │ │ │ └── content: "content_security_policy_nonce"
│ │ │
│ │ ├── close_quote: ∅
│ │ └── quoted: true
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_fd42b1b34d860b548fb70621782b3714-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_fd42b1b34d860b548fb70621782b3714-ef4af315cb33925c38d24ea3c2e8a1cd.txt
index dcdf24b7d..3ecd6ba25 100644
--- a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_fd42b1b34d860b548fb70621782b3714-ef4af315cb33925c38d24ea3c2e8a1cd.txt
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_fd42b1b34d860b548fb70621782b3714-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -14,43 +14,43 @@ options: {action_view_helpers: true}
│ │ ├── tag_closing: "%>" (location: (1:74)-(1:76))
│ │ ├── tag_name: "script" (location: (1:4)-(1:26))
│ │ └── children: (2 items)
- │ │ ├── @ HTMLAttributeNode (location: (1:50)-(1:71))
+ │ │ ├── @ HTMLAttributeNode (location: (1:27)-(1:40))
│ │ │ ├── name:
- │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:50)-(1:61))
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
│ │ │ │ └── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:50)-(1:61))
- │ │ │ │ └── content: "data-turbo-track"
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "src"
│ │ │ │
│ │ │ │
- │ │ │ ├── equals: ": " (location: (1:61)-(1:63))
+ │ │ │ ├── equals: ":" (location: (1:27)-(1:40))
│ │ │ └── value:
- │ │ │ └── @ HTMLAttributeValueNode (location: (1:63)-(1:71))
- │ │ │ ├── open_quote: """ (location: (1:63)-(1:64))
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
+ │ │ │ ├── open_quote: ∅
│ │ │ ├── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:64)-(1:70))
- │ │ │ │ └── content: "reload"
+ │ │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "javascript_path(\"application\")"
│ │ │ │
- │ │ │ ├── close_quote: """ (location: (1:70)-(1:71))
+ │ │ │ ├── close_quote: ∅
│ │ │ └── quoted: true
│ │ │
│ │ │
- │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:40))
+ │ │ └── @ HTMLAttributeNode (location: (1:50)-(1:71))
│ │ ├── name:
- │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:50)-(1:61))
│ │ │ └── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "src"
+ │ │ │ └── @ LiteralNode (location: (1:50)-(1:61))
+ │ │ │ └── content: "data-turbo-track"
│ │ │
│ │ │
- │ │ ├── equals: ":" (location: (1:27)-(1:40))
+ │ │ ├── equals: ": " (location: (1:61)-(1:63))
│ │ └── value:
- │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
- │ │ ├── open_quote: ∅
+ │ │ └── @ HTMLAttributeValueNode (location: (1:63)-(1:71))
+ │ │ ├── open_quote: """ (location: (1:63)-(1:64))
│ │ ├── children: (1 item)
- │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "javascript_path(\"application\")"
+ │ │ │ └── @ LiteralNode (location: (1:64)-(1:70))
+ │ │ │ └── content: "reload"
│ │ │
- │ │ ├── close_quote: ∅
+ │ │ ├── close_quote: """ (location: (1:70)-(1:71))
│ │ └── quoted: true
│ │
│ │
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0011_javascript_include_tag_with_URL_and_nonce_e6e5ca2ea1add00d7447893972171cd4-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0011_javascript_include_tag_with_URL_and_nonce_e6e5ca2ea1add00d7447893972171cd4-ef4af315cb33925c38d24ea3c2e8a1cd.txt
index 392f5f341..c5cdcc24b 100644
--- a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0011_javascript_include_tag_with_URL_and_nonce_e6e5ca2ea1add00d7447893972171cd4-ef4af315cb33925c38d24ea3c2e8a1cd.txt
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0011_javascript_include_tag_with_URL_and_nonce_e6e5ca2ea1add00d7447893972171cd4-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -14,43 +14,43 @@ options: {action_view_helpers: true}
│ │ ├── tag_closing: "%>" (location: (1:74)-(1:76))
│ │ ├── tag_name: "script" (location: (1:4)-(1:26))
│ │ └── children: (2 items)
- │ │ ├── @ HTMLAttributeNode (location: (1:62)-(1:73))
+ │ │ ├── @ HTMLAttributeNode (location: (1:27)-(1:60))
│ │ │ ├── name:
- │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:62)-(1:67))
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:60))
│ │ │ │ └── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:62)-(1:67))
- │ │ │ │ └── content: "nonce"
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
+ │ │ │ │ └── content: "src"
│ │ │ │
│ │ │ │
- │ │ │ ├── equals: ": " (location: (1:67)-(1:69))
+ │ │ │ ├── equals: "=" (location: (1:27)-(1:60))
│ │ │ └── value:
- │ │ │ └── @ HTMLAttributeValueNode (location: (1:69)-(1:73))
- │ │ │ ├── open_quote: ∅
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:60))
+ │ │ │ ├── open_quote: """ (location: (1:27)-(1:27))
│ │ │ ├── children: (1 item)
- │ │ │ │ └── @ RubyLiteralNode (location: (1:69)-(1:73))
- │ │ │ │ └── content: "content_security_policy_nonce"
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
+ │ │ │ │ └── content: "http://www.example.com/xmlhr.js"
│ │ │ │
- │ │ │ ├── close_quote: ∅
+ │ │ │ ├── close_quote: """ (location: (1:60)-(1:60))
│ │ │ └── quoted: true
│ │ │
│ │ │
- │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:60))
+ │ │ └── @ HTMLAttributeNode (location: (1:62)-(1:73))
│ │ ├── name:
- │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:60))
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:62)-(1:67))
│ │ │ └── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
- │ │ │ └── content: "src"
+ │ │ │ └── @ LiteralNode (location: (1:62)-(1:67))
+ │ │ │ └── content: "nonce"
│ │ │
│ │ │
- │ │ ├── equals: "=" (location: (1:27)-(1:60))
+ │ │ ├── equals: ": " (location: (1:67)-(1:69))
│ │ └── value:
- │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:60))
- │ │ ├── open_quote: """ (location: (1:27)-(1:27))
+ │ │ └── @ HTMLAttributeValueNode (location: (1:69)-(1:73))
+ │ │ ├── open_quote: ∅
│ │ ├── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
- │ │ │ └── content: "http://www.example.com/xmlhr.js"
+ │ │ │ └── @ RubyLiteralNode (location: (1:69)-(1:73))
+ │ │ │ └── content: "content_security_policy_nonce"
│ │ │
- │ │ ├── close_quote: """ (location: (1:60)-(1:60))
+ │ │ ├── close_quote: ∅
│ │ └── quoted: true
│ │
│ │
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0012_javascript_include_tag_with_URL_and_async_66c17a6412db1cd30d6f46bdbfc20e71-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0012_javascript_include_tag_with_URL_and_async_66c17a6412db1cd30d6f46bdbfc20e71-ef4af315cb33925c38d24ea3c2e8a1cd.txt
index 77c2ad935..956352d5c 100644
--- a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0012_javascript_include_tag_with_URL_and_async_66c17a6412db1cd30d6f46bdbfc20e71-ef4af315cb33925c38d24ea3c2e8a1cd.txt
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0012_javascript_include_tag_with_URL_and_async_66c17a6412db1cd30d6f46bdbfc20e71-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -14,36 +14,36 @@ options: {action_view_helpers: true}
│ │ ├── tag_closing: "%>" (location: (1:74)-(1:76))
│ │ ├── tag_name: "script" (location: (1:4)-(1:26))
│ │ └── children: (2 items)
- │ │ ├── @ HTMLAttributeNode (location: (1:62)-(1:67))
+ │ │ ├── @ HTMLAttributeNode (location: (1:27)-(1:60))
│ │ │ ├── name:
- │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:62)-(1:67))
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:60))
│ │ │ │ └── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:62)-(1:67))
- │ │ │ │ └── content: "async"
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
+ │ │ │ │ └── content: "src"
│ │ │ │
│ │ │ │
- │ │ │ ├── equals: ∅
- │ │ │ └── value: ∅
+ │ │ │ ├── equals: "=" (location: (1:27)-(1:60))
+ │ │ │ └── value:
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:60))
+ │ │ │ ├── open_quote: """ (location: (1:27)-(1:27))
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
+ │ │ │ │ └── content: "http://www.example.com/xmlhr.js"
+ │ │ │ │
+ │ │ │ ├── close_quote: """ (location: (1:60)-(1:60))
+ │ │ │ └── quoted: true
│ │ │
- │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:60))
+ │ │ │
+ │ │ └── @ HTMLAttributeNode (location: (1:62)-(1:67))
│ │ ├── name:
- │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:60))
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:62)-(1:67))
│ │ │ └── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
- │ │ │ └── content: "src"
+ │ │ │ └── @ LiteralNode (location: (1:62)-(1:67))
+ │ │ │ └── content: "async"
│ │ │
│ │ │
- │ │ ├── equals: "=" (location: (1:27)-(1:60))
- │ │ └── value:
- │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:60))
- │ │ ├── open_quote: """ (location: (1:27)-(1:27))
- │ │ ├── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
- │ │ │ └── content: "http://www.example.com/xmlhr.js"
- │ │ │
- │ │ ├── close_quote: """ (location: (1:60)-(1:60))
- │ │ └── quoted: true
- │ │
+ │ │ ├── equals: ∅
+ │ │ └── value: ∅
│ │
│ │
│ ├── tag_name: "script" (location: (1:4)-(1:26))
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0013_javascript_include_tag_with_URL_and_defer_dd8c527689fccedcd61334018c4747bd-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0013_javascript_include_tag_with_URL_and_defer_dd8c527689fccedcd61334018c4747bd-ef4af315cb33925c38d24ea3c2e8a1cd.txt
index 730e14c14..4c88209c8 100644
--- a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0013_javascript_include_tag_with_URL_and_defer_dd8c527689fccedcd61334018c4747bd-ef4af315cb33925c38d24ea3c2e8a1cd.txt
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0013_javascript_include_tag_with_URL_and_defer_dd8c527689fccedcd61334018c4747bd-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -14,36 +14,36 @@ options: {action_view_helpers: true}
│ │ ├── tag_closing: "%>" (location: (1:74)-(1:76))
│ │ ├── tag_name: "script" (location: (1:4)-(1:26))
│ │ └── children: (2 items)
- │ │ ├── @ HTMLAttributeNode (location: (1:62)-(1:67))
+ │ │ ├── @ HTMLAttributeNode (location: (1:27)-(1:60))
│ │ │ ├── name:
- │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:62)-(1:67))
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:60))
│ │ │ │ └── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:62)-(1:67))
- │ │ │ │ └── content: "defer"
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
+ │ │ │ │ └── content: "src"
│ │ │ │
│ │ │ │
- │ │ │ ├── equals: ∅
- │ │ │ └── value: ∅
+ │ │ │ ├── equals: "=" (location: (1:27)-(1:60))
+ │ │ │ └── value:
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:60))
+ │ │ │ ├── open_quote: """ (location: (1:27)-(1:27))
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
+ │ │ │ │ └── content: "http://www.example.com/xmlhr.js"
+ │ │ │ │
+ │ │ │ ├── close_quote: """ (location: (1:60)-(1:60))
+ │ │ │ └── quoted: true
│ │ │
- │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:60))
+ │ │ │
+ │ │ └── @ HTMLAttributeNode (location: (1:62)-(1:67))
│ │ ├── name:
- │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:60))
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:62)-(1:67))
│ │ │ └── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
- │ │ │ └── content: "src"
+ │ │ │ └── @ LiteralNode (location: (1:62)-(1:67))
+ │ │ │ └── content: "defer"
│ │ │
│ │ │
- │ │ ├── equals: "=" (location: (1:27)-(1:60))
- │ │ └── value:
- │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:60))
- │ │ ├── open_quote: """ (location: (1:27)-(1:27))
- │ │ ├── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:60))
- │ │ │ └── content: "http://www.example.com/xmlhr.js"
- │ │ │
- │ │ ├── close_quote: """ (location: (1:60)-(1:60))
- │ │ └── quoted: true
- │ │
+ │ │ ├── equals: ∅
+ │ │ └── value: ∅
│ │
│ │
│ ├── tag_name: "script" (location: (1:4)-(1:26))
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0017_javascript_include_tag_with_defer_as_string_4c048dd6a94063b7c42f5a763359f534-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0017_javascript_include_tag_with_defer_as_string_4c048dd6a94063b7c42f5a763359f534-ef4af315cb33925c38d24ea3c2e8a1cd.txt
index 68d2786f3..fdd989e18 100644
--- a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0017_javascript_include_tag_with_defer_as_string_4c048dd6a94063b7c42f5a763359f534-ef4af315cb33925c38d24ea3c2e8a1cd.txt
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0017_javascript_include_tag_with_defer_as_string_4c048dd6a94063b7c42f5a763359f534-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -14,43 +14,43 @@ options: {action_view_helpers: true}
│ │ ├── tag_closing: "%>" (location: (1:56)-(1:58))
│ │ ├── tag_name: "script" (location: (1:4)-(1:26))
│ │ └── children: (2 items)
- │ │ ├── @ HTMLAttributeNode (location: (1:42)-(1:55))
+ │ │ ├── @ HTMLAttributeNode (location: (1:27)-(1:40))
│ │ │ ├── name:
- │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:42)-(1:47))
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
│ │ │ │ └── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:42)-(1:47))
- │ │ │ │ └── content: "defer"
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "src"
│ │ │ │
│ │ │ │
- │ │ │ ├── equals: ": " (location: (1:47)-(1:49))
+ │ │ │ ├── equals: ":" (location: (1:27)-(1:40))
│ │ │ └── value:
- │ │ │ └── @ HTMLAttributeValueNode (location: (1:49)-(1:55))
- │ │ │ ├── open_quote: """ (location: (1:49)-(1:50))
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
+ │ │ │ ├── open_quote: ∅
│ │ │ ├── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:50)-(1:54))
- │ │ │ │ └── content: "true"
+ │ │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "javascript_path(\"application\")"
│ │ │ │
- │ │ │ ├── close_quote: """ (location: (1:54)-(1:55))
+ │ │ │ ├── close_quote: ∅
│ │ │ └── quoted: true
│ │ │
│ │ │
- │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:40))
+ │ │ └── @ HTMLAttributeNode (location: (1:42)-(1:55))
│ │ ├── name:
- │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:42)-(1:47))
│ │ │ └── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "src"
+ │ │ │ └── @ LiteralNode (location: (1:42)-(1:47))
+ │ │ │ └── content: "defer"
│ │ │
│ │ │
- │ │ ├── equals: ":" (location: (1:27)-(1:40))
+ │ │ ├── equals: ": " (location: (1:47)-(1:49))
│ │ └── value:
- │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
- │ │ ├── open_quote: ∅
+ │ │ └── @ HTMLAttributeValueNode (location: (1:49)-(1:55))
+ │ │ ├── open_quote: """ (location: (1:49)-(1:50))
│ │ ├── children: (1 item)
- │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "javascript_path(\"application\")"
+ │ │ │ └── @ LiteralNode (location: (1:50)-(1:54))
+ │ │ │ └── content: "true"
│ │ │
- │ │ ├── close_quote: ∅
+ │ │ ├── close_quote: """ (location: (1:54)-(1:55))
│ │ └── quoted: true
│ │
│ │
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0018_javascript_include_tag_with_interpolated_nonce_648fad9a18f31eddcce31571252a280c-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0018_javascript_include_tag_with_interpolated_nonce_648fad9a18f31eddcce31571252a280c-ef4af315cb33925c38d24ea3c2e8a1cd.txt
index d180179bb..94579b455 100644
--- a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0018_javascript_include_tag_with_interpolated_nonce_648fad9a18f31eddcce31571252a280c-ef4af315cb33925c38d24ea3c2e8a1cd.txt
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0018_javascript_include_tag_with_interpolated_nonce_648fad9a18f31eddcce31571252a280c-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -14,47 +14,47 @@ options: {action_view_helpers: true}
│ │ ├── tag_closing: "%>" (location: (1:69)-(1:71))
│ │ ├── tag_name: "script" (location: (1:4)-(1:26))
│ │ └── children: (2 items)
- │ │ ├── @ HTMLAttributeNode (location: (1:42)-(1:68))
+ │ │ ├── @ HTMLAttributeNode (location: (1:27)-(1:40))
│ │ │ ├── name:
- │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:42)-(1:68))
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
│ │ │ │ └── children: (1 item)
- │ │ │ │ └── @ LiteralNode (location: (1:42)-(1:68))
- │ │ │ │ └── content: "nonce"
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "src"
│ │ │ │
│ │ │ │
- │ │ │ ├── equals: "=" (location: (1:42)-(1:68))
+ │ │ │ ├── equals: ":" (location: (1:27)-(1:40))
│ │ │ └── value:
- │ │ │ └── @ HTMLAttributeValueNode (location: (1:42)-(1:68))
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
│ │ │ ├── open_quote: ∅
- │ │ │ ├── children: (2 items)
- │ │ │ │ ├── @ LiteralNode (location: (1:42)-(1:68))
- │ │ │ │ │ └── content: "static-"
- │ │ │ │ │
- │ │ │ │ └── @ RubyLiteralNode (location: (1:42)-(1:68))
- │ │ │ │ └── content: "dynamic"
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "javascript_path(\"application\")"
│ │ │ │
│ │ │ ├── close_quote: ∅
- │ │ │ └── quoted: false
+ │ │ │ └── quoted: true
│ │ │
│ │ │
- │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:40))
+ │ │ └── @ HTMLAttributeNode (location: (1:42)-(1:68))
│ │ ├── name:
- │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:42)-(1:68))
│ │ │ └── children: (1 item)
- │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "src"
+ │ │ │ └── @ LiteralNode (location: (1:42)-(1:68))
+ │ │ │ └── content: "nonce"
│ │ │
│ │ │
- │ │ ├── equals: ":" (location: (1:27)-(1:40))
+ │ │ ├── equals: "=" (location: (1:42)-(1:68))
│ │ └── value:
- │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
+ │ │ └── @ HTMLAttributeValueNode (location: (1:42)-(1:68))
│ │ ├── open_quote: ∅
- │ │ ├── children: (1 item)
- │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
- │ │ │ └── content: "javascript_path(\"application\")"
+ │ │ ├── children: (2 items)
+ │ │ │ ├── @ LiteralNode (location: (1:42)-(1:68))
+ │ │ │ │ └── content: "static-"
+ │ │ │ │
+ │ │ │ └── @ RubyLiteralNode (location: (1:42)-(1:68))
+ │ │ │ └── content: "dynamic"
│ │ │
│ │ ├── close_quote: ∅
- │ │ └── quoted: true
+ │ │ └── quoted: false
│ │
│ │
│ │
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0021_javascript_include_tag_with_duplicate_sources_bd40c8356f8a8e208dbb85ccdd00636c-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0021_javascript_include_tag_with_duplicate_sources_bd40c8356f8a8e208dbb85ccdd00636c-ef4af315cb33925c38d24ea3c2e8a1cd.txt
new file mode 100644
index 000000000..3b2bcf2a5
--- /dev/null
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0021_javascript_include_tag_with_duplicate_sources_bd40c8356f8a8e208dbb85ccdd00636c-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -0,0 +1,48 @@
+---
+source: "Analyze::ActionView::AssetTagHelper::JavaScriptIncludeTagTest#test_0021_javascript_include_tag with duplicate sources"
+input: |2-
+<%= javascript_include_tag "application", "application" %>
+options: {action_view_helpers: true}
+---
+@ DocumentNode (location: (1:0)-(2:0))
+└── children: (2 items)
+ ├── @ HTMLElementNode (location: (1:0)-(1:58))
+ │ ├── open_tag:
+ │ │ └── @ ERBOpenTagNode (location: (1:0)-(1:58))
+ │ │ ├── tag_opening: "<%=" (location: (1:0)-(1:3))
+ │ │ ├── content: " javascript_include_tag "application", "application" " (location: (1:3)-(1:56))
+ │ │ ├── tag_closing: "%>" (location: (1:56)-(1:58))
+ │ │ ├── tag_name: "script" (location: (1:4)-(1:26))
+ │ │ └── children: (1 item)
+ │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:40))
+ │ │ ├── name:
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
+ │ │ │ └── children: (1 item)
+ │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
+ │ │ │ └── content: "src"
+ │ │ │
+ │ │ │
+ │ │ ├── equals: ":" (location: (1:27)-(1:40))
+ │ │ └── value:
+ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
+ │ │ ├── open_quote: ∅
+ │ │ ├── children: (1 item)
+ │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
+ │ │ │ └── content: "javascript_path(\"application\")"
+ │ │ │
+ │ │ ├── close_quote: ∅
+ │ │ └── quoted: true
+ │ │
+ │ │
+ │ │
+ │ ├── tag_name: "script" (location: (1:4)-(1:26))
+ │ ├── body: []
+ │ ├── close_tag:
+ │ │ └── @ HTMLVirtualCloseTagNode (location: (1:58)-(1:58))
+ │ │ └── tag_name: "script" (location: (1:4)-(1:26))
+ │ │
+ │ ├── is_void: false
+ │ └── element_source: "ActionView::Helpers::AssetTagHelper#javascript_include_tag"
+ │
+ └── @ HTMLTextNode (location: (1:58)-(2:0))
+ └── content: "\n"
\ No newline at end of file
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0022_javascript_include_tag_with_crossorigin_true_954526241fd342c7d04115eb521b4d94-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0022_javascript_include_tag_with_crossorigin_true_954526241fd342c7d04115eb521b4d94-ef4af315cb33925c38d24ea3c2e8a1cd.txt
new file mode 100644
index 000000000..54ff9aa9c
--- /dev/null
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0022_javascript_include_tag_with_crossorigin_true_954526241fd342c7d04115eb521b4d94-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -0,0 +1,68 @@
+---
+source: "Analyze::ActionView::AssetTagHelper::JavaScriptIncludeTagTest#test_0022_javascript_include_tag with crossorigin true"
+input: |2-
+<%= javascript_include_tag "application", crossorigin: true %>
+options: {action_view_helpers: true}
+---
+@ DocumentNode (location: (1:0)-(2:0))
+└── children: (2 items)
+ ├── @ HTMLElementNode (location: (1:0)-(1:62))
+ │ ├── open_tag:
+ │ │ └── @ ERBOpenTagNode (location: (1:0)-(1:62))
+ │ │ ├── tag_opening: "<%=" (location: (1:0)-(1:3))
+ │ │ ├── content: " javascript_include_tag "application", crossorigin: true " (location: (1:3)-(1:60))
+ │ │ ├── tag_closing: "%>" (location: (1:60)-(1:62))
+ │ │ ├── tag_name: "script" (location: (1:4)-(1:26))
+ │ │ └── children: (2 items)
+ │ │ ├── @ HTMLAttributeNode (location: (1:27)-(1:40))
+ │ │ │ ├── name:
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
+ │ │ │ │ └── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "src"
+ │ │ │ │
+ │ │ │ │
+ │ │ │ ├── equals: ":" (location: (1:27)-(1:40))
+ │ │ │ └── value:
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
+ │ │ │ ├── open_quote: ∅
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
+ │ │ │ │ └── content: "javascript_path(\"application\")"
+ │ │ │ │
+ │ │ │ ├── close_quote: ∅
+ │ │ │ └── quoted: true
+ │ │ │
+ │ │ │
+ │ │ └── @ HTMLAttributeNode (location: (1:42)-(1:59))
+ │ │ ├── name:
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:42)-(1:59))
+ │ │ │ └── children: (1 item)
+ │ │ │ └── @ LiteralNode (location: (1:42)-(1:59))
+ │ │ │ └── content: "crossorigin"
+ │ │ │
+ │ │ │
+ │ │ ├── equals: "=" (location: (1:42)-(1:59))
+ │ │ └── value:
+ │ │ └── @ HTMLAttributeValueNode (location: (1:42)-(1:59))
+ │ │ ├── open_quote: """ (location: (1:42)-(1:42))
+ │ │ ├── children: (1 item)
+ │ │ │ └── @ LiteralNode (location: (1:42)-(1:59))
+ │ │ │ └── content: "anonymous"
+ │ │ │
+ │ │ ├── close_quote: """ (location: (1:59)-(1:59))
+ │ │ └── quoted: true
+ │ │
+ │ │
+ │ │
+ │ ├── tag_name: "script" (location: (1:4)-(1:26))
+ │ ├── body: []
+ │ ├── close_tag:
+ │ │ └── @ HTMLVirtualCloseTagNode (location: (1:62)-(1:62))
+ │ │ └── tag_name: "script" (location: (1:4)-(1:26))
+ │ │
+ │ ├── is_void: false
+ │ └── element_source: "ActionView::Helpers::AssetTagHelper#javascript_include_tag"
+ │
+ └── @ HTMLTextNode (location: (1:62)-(2:0))
+ └── content: "\n"
\ No newline at end of file
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0023_javascript_include_tag_with_nopush_d3d6cc332ae87006b7b58e2d3b233ba1-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0023_javascript_include_tag_with_nopush_d3d6cc332ae87006b7b58e2d3b233ba1-ef4af315cb33925c38d24ea3c2e8a1cd.txt
new file mode 100644
index 000000000..723089592
--- /dev/null
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0023_javascript_include_tag_with_nopush_d3d6cc332ae87006b7b58e2d3b233ba1-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -0,0 +1,48 @@
+---
+source: "Analyze::ActionView::AssetTagHelper::JavaScriptIncludeTagTest#test_0023_javascript_include_tag with nopush"
+input: |2-
+<%= javascript_include_tag "application", nopush: true %>
+options: {action_view_helpers: true}
+---
+@ DocumentNode (location: (1:0)-(2:0))
+└── children: (2 items)
+ ├── @ HTMLElementNode (location: (1:0)-(1:57))
+ │ ├── open_tag:
+ │ │ └── @ ERBOpenTagNode (location: (1:0)-(1:57))
+ │ │ ├── tag_opening: "<%=" (location: (1:0)-(1:3))
+ │ │ ├── content: " javascript_include_tag "application", nopush: true " (location: (1:3)-(1:55))
+ │ │ ├── tag_closing: "%>" (location: (1:55)-(1:57))
+ │ │ ├── tag_name: "script" (location: (1:4)-(1:26))
+ │ │ └── children: (1 item)
+ │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:40))
+ │ │ ├── name:
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
+ │ │ │ └── children: (1 item)
+ │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
+ │ │ │ └── content: "src"
+ │ │ │
+ │ │ │
+ │ │ ├── equals: ":" (location: (1:27)-(1:40))
+ │ │ └── value:
+ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
+ │ │ ├── open_quote: ∅
+ │ │ ├── children: (1 item)
+ │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
+ │ │ │ └── content: "javascript_path(\"application\")"
+ │ │ │
+ │ │ ├── close_quote: ∅
+ │ │ └── quoted: true
+ │ │
+ │ │
+ │ │
+ │ ├── tag_name: "script" (location: (1:4)-(1:26))
+ │ ├── body: []
+ │ ├── close_tag:
+ │ │ └── @ HTMLVirtualCloseTagNode (location: (1:57)-(1:57))
+ │ │ └── tag_name: "script" (location: (1:4)-(1:26))
+ │ │
+ │ ├── is_void: false
+ │ └── element_source: "ActionView::Helpers::AssetTagHelper#javascript_include_tag"
+ │
+ └── @ HTMLTextNode (location: (1:57)-(2:0))
+ └── content: "\n"
\ No newline at end of file
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0024_javascript_include_tag_with_preload_links_header_c203847d9d6d6a557481aba978b4b840-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0024_javascript_include_tag_with_preload_links_header_c203847d9d6d6a557481aba978b4b840-ef4af315cb33925c38d24ea3c2e8a1cd.txt
new file mode 100644
index 000000000..b748a3353
--- /dev/null
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/java_script_include_tag_test/test_0024_javascript_include_tag_with_preload_links_header_c203847d9d6d6a557481aba978b4b840-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -0,0 +1,48 @@
+---
+source: "Analyze::ActionView::AssetTagHelper::JavaScriptIncludeTagTest#test_0024_javascript_include_tag with preload_links_header"
+input: |2-
+<%= javascript_include_tag "application", preload_links_header: false %>
+options: {action_view_helpers: true}
+---
+@ DocumentNode (location: (1:0)-(2:0))
+└── children: (2 items)
+ ├── @ HTMLElementNode (location: (1:0)-(1:72))
+ │ ├── open_tag:
+ │ │ └── @ ERBOpenTagNode (location: (1:0)-(1:72))
+ │ │ ├── tag_opening: "<%=" (location: (1:0)-(1:3))
+ │ │ ├── content: " javascript_include_tag "application", preload_links_header: false " (location: (1:3)-(1:70))
+ │ │ ├── tag_closing: "%>" (location: (1:70)-(1:72))
+ │ │ ├── tag_name: "script" (location: (1:4)-(1:26))
+ │ │ └── children: (1 item)
+ │ │ └── @ HTMLAttributeNode (location: (1:27)-(1:40))
+ │ │ ├── name:
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:27)-(1:40))
+ │ │ │ └── children: (1 item)
+ │ │ │ └── @ LiteralNode (location: (1:27)-(1:40))
+ │ │ │ └── content: "src"
+ │ │ │
+ │ │ │
+ │ │ ├── equals: ":" (location: (1:27)-(1:40))
+ │ │ └── value:
+ │ │ └── @ HTMLAttributeValueNode (location: (1:27)-(1:40))
+ │ │ ├── open_quote: ∅
+ │ │ ├── children: (1 item)
+ │ │ │ └── @ RubyLiteralNode (location: (1:27)-(1:40))
+ │ │ │ └── content: "javascript_path(\"application\")"
+ │ │ │
+ │ │ ├── close_quote: ∅
+ │ │ └── quoted: true
+ │ │
+ │ │
+ │ │
+ │ ├── tag_name: "script" (location: (1:4)-(1:26))
+ │ ├── body: []
+ │ ├── close_tag:
+ │ │ └── @ HTMLVirtualCloseTagNode (location: (1:72)-(1:72))
+ │ │ └── tag_name: "script" (location: (1:4)-(1:26))
+ │ │
+ │ ├── is_void: false
+ │ └── element_source: "ActionView::Helpers::AssetTagHelper#javascript_include_tag"
+ │
+ └── @ HTMLTextNode (location: (1:72)-(2:0))
+ └── content: "\n"
\ No newline at end of file
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0019_stylesheet_link_tag_with_duplicate_sources_0d72493dc769a417fd1c2d448f6c0324-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0019_stylesheet_link_tag_with_duplicate_sources_0d72493dc769a417fd1c2d448f6c0324-ef4af315cb33925c38d24ea3c2e8a1cd.txt
new file mode 100644
index 000000000..e18b6b84e
--- /dev/null
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0019_stylesheet_link_tag_with_duplicate_sources_0d72493dc769a417fd1c2d448f6c0324-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -0,0 +1,65 @@
+---
+source: "Analyze::ActionView::AssetTagHelper::StylesheetLinkTagTest#test_0019_stylesheet_link_tag with duplicate sources"
+input: |2-
+<%= stylesheet_link_tag "application", "application" %>
+options: {action_view_helpers: true}
+---
+@ DocumentNode (location: (1:0)-(2:0))
+└── children: (2 items)
+ ├── @ HTMLElementNode (location: (1:0)-(1:55))
+ │ ├── open_tag:
+ │ │ └── @ ERBOpenTagNode (location: (1:0)-(1:55))
+ │ │ ├── tag_opening: "<%=" (location: (1:0)-(1:3))
+ │ │ ├── content: " stylesheet_link_tag "application", "application" " (location: (1:3)-(1:53))
+ │ │ ├── tag_closing: "%>" (location: (1:53)-(1:55))
+ │ │ ├── tag_name: "link" (location: (1:4)-(1:23))
+ │ │ └── children: (2 items)
+ │ │ ├── @ HTMLAttributeNode (location: (1:24)-(1:37))
+ │ │ │ ├── name:
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:24)-(1:37))
+ │ │ │ │ └── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ │ └── content: "rel"
+ │ │ │ │
+ │ │ │ │
+ │ │ │ ├── equals: "=" (location: (1:24)-(1:37))
+ │ │ │ └── value:
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:24)-(1:37))
+ │ │ │ ├── open_quote: """ (location: (1:24)-(1:24))
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ │ └── content: "stylesheet"
+ │ │ │ │
+ │ │ │ ├── close_quote: """ (location: (1:37)-(1:37))
+ │ │ │ └── quoted: true
+ │ │ │
+ │ │ │
+ │ │ └── @ HTMLAttributeNode (location: (1:24)-(1:37))
+ │ │ ├── name:
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:24)-(1:37))
+ │ │ │ └── children: (1 item)
+ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ └── content: "href"
+ │ │ │
+ │ │ │
+ │ │ ├── equals: ":" (location: (1:24)-(1:37))
+ │ │ └── value:
+ │ │ └── @ HTMLAttributeValueNode (location: (1:24)-(1:37))
+ │ │ ├── open_quote: ∅
+ │ │ ├── children: (1 item)
+ │ │ │ └── @ RubyLiteralNode (location: (1:24)-(1:37))
+ │ │ │ └── content: "stylesheet_path(\"application\")"
+ │ │ │
+ │ │ ├── close_quote: ∅
+ │ │ └── quoted: true
+ │ │
+ │ │
+ │ │
+ │ ├── tag_name: "link" (location: (1:4)-(1:23))
+ │ ├── body: []
+ │ ├── close_tag: ∅
+ │ ├── is_void: true
+ │ └── element_source: "ActionView::Helpers::AssetTagHelper#stylesheet_link_tag"
+ │
+ └── @ HTMLTextNode (location: (1:55)-(2:0))
+ └── content: "\n"
\ No newline at end of file
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0020_stylesheet_link_tag_with_crossorigin_true_98fa5d1881a2f4df45874ce68bc70db9-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0020_stylesheet_link_tag_with_crossorigin_true_98fa5d1881a2f4df45874ce68bc70db9-ef4af315cb33925c38d24ea3c2e8a1cd.txt
new file mode 100644
index 000000000..0fc3684e9
--- /dev/null
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0020_stylesheet_link_tag_with_crossorigin_true_98fa5d1881a2f4df45874ce68bc70db9-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -0,0 +1,85 @@
+---
+source: "Analyze::ActionView::AssetTagHelper::StylesheetLinkTagTest#test_0020_stylesheet_link_tag with crossorigin true"
+input: |2-
+<%= stylesheet_link_tag "application", crossorigin: true %>
+options: {action_view_helpers: true}
+---
+@ DocumentNode (location: (1:0)-(2:0))
+└── children: (2 items)
+ ├── @ HTMLElementNode (location: (1:0)-(1:59))
+ │ ├── open_tag:
+ │ │ └── @ ERBOpenTagNode (location: (1:0)-(1:59))
+ │ │ ├── tag_opening: "<%=" (location: (1:0)-(1:3))
+ │ │ ├── content: " stylesheet_link_tag "application", crossorigin: true " (location: (1:3)-(1:57))
+ │ │ ├── tag_closing: "%>" (location: (1:57)-(1:59))
+ │ │ ├── tag_name: "link" (location: (1:4)-(1:23))
+ │ │ └── children: (3 items)
+ │ │ ├── @ HTMLAttributeNode (location: (1:24)-(1:37))
+ │ │ │ ├── name:
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:24)-(1:37))
+ │ │ │ │ └── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ │ └── content: "rel"
+ │ │ │ │
+ │ │ │ │
+ │ │ │ ├── equals: "=" (location: (1:24)-(1:37))
+ │ │ │ └── value:
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:24)-(1:37))
+ │ │ │ ├── open_quote: """ (location: (1:24)-(1:24))
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ │ └── content: "stylesheet"
+ │ │ │ │
+ │ │ │ ├── close_quote: """ (location: (1:37)-(1:37))
+ │ │ │ └── quoted: true
+ │ │ │
+ │ │ │
+ │ │ ├── @ HTMLAttributeNode (location: (1:39)-(1:56))
+ │ │ │ ├── name:
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:39)-(1:56))
+ │ │ │ │ └── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:39)-(1:56))
+ │ │ │ │ └── content: "crossorigin"
+ │ │ │ │
+ │ │ │ │
+ │ │ │ ├── equals: "=" (location: (1:39)-(1:56))
+ │ │ │ └── value:
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:39)-(1:56))
+ │ │ │ ├── open_quote: """ (location: (1:39)-(1:39))
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:39)-(1:56))
+ │ │ │ │ └── content: "anonymous"
+ │ │ │ │
+ │ │ │ ├── close_quote: """ (location: (1:56)-(1:56))
+ │ │ │ └── quoted: true
+ │ │ │
+ │ │ │
+ │ │ └── @ HTMLAttributeNode (location: (1:24)-(1:37))
+ │ │ ├── name:
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:24)-(1:37))
+ │ │ │ └── children: (1 item)
+ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ └── content: "href"
+ │ │ │
+ │ │ │
+ │ │ ├── equals: ":" (location: (1:24)-(1:37))
+ │ │ └── value:
+ │ │ └── @ HTMLAttributeValueNode (location: (1:24)-(1:37))
+ │ │ ├── open_quote: ∅
+ │ │ ├── children: (1 item)
+ │ │ │ └── @ RubyLiteralNode (location: (1:24)-(1:37))
+ │ │ │ └── content: "stylesheet_path(\"application\")"
+ │ │ │
+ │ │ ├── close_quote: ∅
+ │ │ └── quoted: true
+ │ │
+ │ │
+ │ │
+ │ ├── tag_name: "link" (location: (1:4)-(1:23))
+ │ ├── body: []
+ │ ├── close_tag: ∅
+ │ ├── is_void: true
+ │ └── element_source: "ActionView::Helpers::AssetTagHelper#stylesheet_link_tag"
+ │
+ └── @ HTMLTextNode (location: (1:59)-(2:0))
+ └── content: "\n"
\ No newline at end of file
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0021_stylesheet_link_tag_with_nopush_19a6168a87c1f7201d8121ffd643b363-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0021_stylesheet_link_tag_with_nopush_19a6168a87c1f7201d8121ffd643b363-ef4af315cb33925c38d24ea3c2e8a1cd.txt
new file mode 100644
index 000000000..1c4e05d03
--- /dev/null
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0021_stylesheet_link_tag_with_nopush_19a6168a87c1f7201d8121ffd643b363-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -0,0 +1,65 @@
+---
+source: "Analyze::ActionView::AssetTagHelper::StylesheetLinkTagTest#test_0021_stylesheet_link_tag with nopush"
+input: |2-
+<%= stylesheet_link_tag "application", nopush: true %>
+options: {action_view_helpers: true}
+---
+@ DocumentNode (location: (1:0)-(2:0))
+└── children: (2 items)
+ ├── @ HTMLElementNode (location: (1:0)-(1:54))
+ │ ├── open_tag:
+ │ │ └── @ ERBOpenTagNode (location: (1:0)-(1:54))
+ │ │ ├── tag_opening: "<%=" (location: (1:0)-(1:3))
+ │ │ ├── content: " stylesheet_link_tag "application", nopush: true " (location: (1:3)-(1:52))
+ │ │ ├── tag_closing: "%>" (location: (1:52)-(1:54))
+ │ │ ├── tag_name: "link" (location: (1:4)-(1:23))
+ │ │ └── children: (2 items)
+ │ │ ├── @ HTMLAttributeNode (location: (1:24)-(1:37))
+ │ │ │ ├── name:
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:24)-(1:37))
+ │ │ │ │ └── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ │ └── content: "rel"
+ │ │ │ │
+ │ │ │ │
+ │ │ │ ├── equals: "=" (location: (1:24)-(1:37))
+ │ │ │ └── value:
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:24)-(1:37))
+ │ │ │ ├── open_quote: """ (location: (1:24)-(1:24))
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ │ └── content: "stylesheet"
+ │ │ │ │
+ │ │ │ ├── close_quote: """ (location: (1:37)-(1:37))
+ │ │ │ └── quoted: true
+ │ │ │
+ │ │ │
+ │ │ └── @ HTMLAttributeNode (location: (1:24)-(1:37))
+ │ │ ├── name:
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:24)-(1:37))
+ │ │ │ └── children: (1 item)
+ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ └── content: "href"
+ │ │ │
+ │ │ │
+ │ │ ├── equals: ":" (location: (1:24)-(1:37))
+ │ │ └── value:
+ │ │ └── @ HTMLAttributeValueNode (location: (1:24)-(1:37))
+ │ │ ├── open_quote: ∅
+ │ │ ├── children: (1 item)
+ │ │ │ └── @ RubyLiteralNode (location: (1:24)-(1:37))
+ │ │ │ └── content: "stylesheet_path(\"application\")"
+ │ │ │
+ │ │ ├── close_quote: ∅
+ │ │ └── quoted: true
+ │ │
+ │ │
+ │ │
+ │ ├── tag_name: "link" (location: (1:4)-(1:23))
+ │ ├── body: []
+ │ ├── close_tag: ∅
+ │ ├── is_void: true
+ │ └── element_source: "ActionView::Helpers::AssetTagHelper#stylesheet_link_tag"
+ │
+ └── @ HTMLTextNode (location: (1:54)-(2:0))
+ └── content: "\n"
\ No newline at end of file
diff --git a/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0022_stylesheet_link_tag_with_preload_links_header_a54b7e3a25033f3babf07aeedcf19776-ef4af315cb33925c38d24ea3c2e8a1cd.txt b/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0022_stylesheet_link_tag_with_preload_links_header_a54b7e3a25033f3babf07aeedcf19776-ef4af315cb33925c38d24ea3c2e8a1cd.txt
new file mode 100644
index 000000000..6174a1134
--- /dev/null
+++ b/test/snapshots/analyze/action_view/asset_tag_helper/stylesheet_link_tag_test/test_0022_stylesheet_link_tag_with_preload_links_header_a54b7e3a25033f3babf07aeedcf19776-ef4af315cb33925c38d24ea3c2e8a1cd.txt
@@ -0,0 +1,65 @@
+---
+source: "Analyze::ActionView::AssetTagHelper::StylesheetLinkTagTest#test_0022_stylesheet_link_tag with preload_links_header"
+input: |2-
+<%= stylesheet_link_tag "application", preload_links_header: false %>
+options: {action_view_helpers: true}
+---
+@ DocumentNode (location: (1:0)-(2:0))
+└── children: (2 items)
+ ├── @ HTMLElementNode (location: (1:0)-(1:69))
+ │ ├── open_tag:
+ │ │ └── @ ERBOpenTagNode (location: (1:0)-(1:69))
+ │ │ ├── tag_opening: "<%=" (location: (1:0)-(1:3))
+ │ │ ├── content: " stylesheet_link_tag "application", preload_links_header: false " (location: (1:3)-(1:67))
+ │ │ ├── tag_closing: "%>" (location: (1:67)-(1:69))
+ │ │ ├── tag_name: "link" (location: (1:4)-(1:23))
+ │ │ └── children: (2 items)
+ │ │ ├── @ HTMLAttributeNode (location: (1:24)-(1:37))
+ │ │ │ ├── name:
+ │ │ │ │ └── @ HTMLAttributeNameNode (location: (1:24)-(1:37))
+ │ │ │ │ └── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ │ └── content: "rel"
+ │ │ │ │
+ │ │ │ │
+ │ │ │ ├── equals: "=" (location: (1:24)-(1:37))
+ │ │ │ └── value:
+ │ │ │ └── @ HTMLAttributeValueNode (location: (1:24)-(1:37))
+ │ │ │ ├── open_quote: """ (location: (1:24)-(1:24))
+ │ │ │ ├── children: (1 item)
+ │ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ │ └── content: "stylesheet"
+ │ │ │ │
+ │ │ │ ├── close_quote: """ (location: (1:37)-(1:37))
+ │ │ │ └── quoted: true
+ │ │ │
+ │ │ │
+ │ │ └── @ HTMLAttributeNode (location: (1:24)-(1:37))
+ │ │ ├── name:
+ │ │ │ └── @ HTMLAttributeNameNode (location: (1:24)-(1:37))
+ │ │ │ └── children: (1 item)
+ │ │ │ └── @ LiteralNode (location: (1:24)-(1:37))
+ │ │ │ └── content: "href"
+ │ │ │
+ │ │ │
+ │ │ ├── equals: ":" (location: (1:24)-(1:37))
+ │ │ └── value:
+ │ │ └── @ HTMLAttributeValueNode (location: (1:24)-(1:37))
+ │ │ ├── open_quote: ∅
+ │ │ ├── children: (1 item)
+ │ │ │ └── @ RubyLiteralNode (location: (1:24)-(1:37))
+ │ │ │ └── content: "stylesheet_path(\"application\")"
+ │ │ │
+ │ │ ├── close_quote: ∅
+ │ │ └── quoted: true
+ │ │
+ │ │
+ │ │
+ │ ├── tag_name: "link" (location: (1:4)-(1:23))
+ │ ├── body: []
+ │ ├── close_tag: ∅
+ │ ├── is_void: true
+ │ └── element_source: "ActionView::Helpers::AssetTagHelper#stylesheet_link_tag"
+ │
+ └── @ HTMLTextNode (location: (1:69)-(2:0))
+ └── content: "\n"
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_029a0292ef00e4f77031218e43a2d96c.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_029a0292ef00e4f77031218e43a2d96c.txt
index 9df1352f6..164a5d276 100644
--- a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_029a0292ef00e4f77031218e43a2d96c.txt
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_029a0292ef00e4f77031218e43a2d96c.txt
@@ -2,4 +2,4 @@
source: "Engine::ActionView::JavascriptIncludeTagTest#test_0002_javascript_include_tag with defer"
input: "{source: \"<%= javascript_include_tag \\\"application\\\", defer: true %>\", type: \"herb_output\", action_view_helpers: true}"
---
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_3470ae65cf59f3539cdb4e4982ef6c7b.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_3470ae65cf59f3539cdb4e4982ef6c7b.txt
index f3adc90f5..8e3d8b0f0 100644
--- a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_3470ae65cf59f3539cdb4e4982ef6c7b.txt
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_3470ae65cf59f3539cdb4e4982ef6c7b.txt
@@ -2,4 +2,4 @@
source: "Engine::ActionView::JavascriptIncludeTagTest#test_0002_javascript_include_tag with defer"
input: "{source: \"<%= javascript_include_tag \\\"application\\\", defer: true %>\", locals: {}, options: {action_view_helpers: true}}"
---
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_759aa89680eaaac61604470a941729e2.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_759aa89680eaaac61604470a941729e2.txt
index 99dea3e00..6d05aac6a 100644
--- a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_759aa89680eaaac61604470a941729e2.txt
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0002_javascript_include_tag_with_defer_759aa89680eaaac61604470a941729e2.txt
@@ -2,5 +2,5 @@
source: "Engine::ActionView::JavascriptIncludeTagTest#test_0002_javascript_include_tag with defer"
input: "{source: \"<%= javascript_include_tag \\\"application\\\", defer: true %>\", options: {optimize: true}}"
---
-_buf = ::String.new; _buf << ''.freeze;
+_buf = ::String.new; _buf << ''.freeze;
_buf.to_s
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_1f52110d2da9fbf32b149c50db12408b.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_1f52110d2da9fbf32b149c50db12408b.txt
index b73063940..e48d421ef 100644
--- a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_1f52110d2da9fbf32b149c50db12408b.txt
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_1f52110d2da9fbf32b149c50db12408b.txt
@@ -2,4 +2,4 @@
source: "Engine::ActionView::JavascriptIncludeTagTest#test_0004_javascript_include_tag with URL and async"
input: "{source: \"<%= javascript_include_tag \\\"http://www.example.com/xmlhr.js\\\", async: true %>\", type: \"herb_output\", action_view_helpers: true}"
---
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_bdfc713b6f85e86ad8f6ea575d2acbfd.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_bdfc713b6f85e86ad8f6ea575d2acbfd.txt
index 62d8ba25f..c4e223ff4 100644
--- a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_bdfc713b6f85e86ad8f6ea575d2acbfd.txt
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_bdfc713b6f85e86ad8f6ea575d2acbfd.txt
@@ -2,4 +2,4 @@
source: "Engine::ActionView::JavascriptIncludeTagTest#test_0004_javascript_include_tag with URL and async"
input: "{source: \"<%= javascript_include_tag \\\"http://www.example.com/xmlhr.js\\\", async: true %>\", locals: {}, options: {action_view_helpers: true}}"
---
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_c4decc739101f6bdad8460f628ed7a7b.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_c4decc739101f6bdad8460f628ed7a7b.txt
index b0996baef..eb25c8c68 100644
--- a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_c4decc739101f6bdad8460f628ed7a7b.txt
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0004_javascript_include_tag_with_URL_and_async_c4decc739101f6bdad8460f628ed7a7b.txt
@@ -2,5 +2,5 @@
source: "Engine::ActionView::JavascriptIncludeTagTest#test_0004_javascript_include_tag with URL and async"
input: "{source: \"<%= javascript_include_tag \\\"http://www.example.com/xmlhr.js\\\", async: true %>\", options: {optimize: true}}"
---
-_buf = ::String.new; _buf << ''.freeze;
+_buf = ::String.new; _buf << ''.freeze;
_buf.to_s
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_6f8ceebe851605e931ec1544027cdea1.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_6f8ceebe851605e931ec1544027cdea1.txt
index 30163bb18..bc1c298bb 100644
--- a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_6f8ceebe851605e931ec1544027cdea1.txt
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_6f8ceebe851605e931ec1544027cdea1.txt
@@ -2,4 +2,4 @@
source: "Engine::ActionView::JavascriptIncludeTagTest#test_0005_javascript_include_tag with data attributes"
input: "{source: \"<%= javascript_include_tag \\\"application\\\", data: { turbo_track: \\\"reload\\\" } %>\", locals: {}, options: {action_view_helpers: true}}"
---
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_8b6a4cf69c858a6271afcc41219177ba.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_8b6a4cf69c858a6271afcc41219177ba.txt
index 8498b03d6..44804c8ac 100644
--- a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_8b6a4cf69c858a6271afcc41219177ba.txt
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_8b6a4cf69c858a6271afcc41219177ba.txt
@@ -2,4 +2,4 @@
source: "Engine::ActionView::JavascriptIncludeTagTest#test_0005_javascript_include_tag with data attributes"
input: "{source: \"<%= javascript_include_tag \\\"application\\\", data: { turbo_track: \\\"reload\\\" } %>\", type: \"herb_output\", action_view_helpers: true}"
---
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_e378271c4a150a3fd0e5dbd9207c6653.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_e378271c4a150a3fd0e5dbd9207c6653.txt
index 5de9c6e2f..bd5f3f352 100644
--- a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_e378271c4a150a3fd0e5dbd9207c6653.txt
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0005_javascript_include_tag_with_data_attributes_e378271c4a150a3fd0e5dbd9207c6653.txt
@@ -2,5 +2,5 @@
source: "Engine::ActionView::JavascriptIncludeTagTest#test_0005_javascript_include_tag with data attributes"
input: "{source: \"<%= javascript_include_tag \\\"application\\\", data: { turbo_track: \\\"reload\\\" } %>\", options: {optimize: true}}"
---
-_buf = ::String.new; _buf << ''.freeze;
+_buf = ::String.new; _buf << ''.freeze;
_buf.to_s
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0006_javascript_include_tag_with_duplicate_sources_297808e0744cfd8cd50c54ebff35645b.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0006_javascript_include_tag_with_duplicate_sources_297808e0744cfd8cd50c54ebff35645b.txt
new file mode 100644
index 000000000..4fea375eb
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0006_javascript_include_tag_with_duplicate_sources_297808e0744cfd8cd50c54ebff35645b.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0006_javascript_include_tag with duplicate sources"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", \\\"application\\\" %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0006_javascript_include_tag_with_duplicate_sources_5f26181cc072408061b8194b87cc170d.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0006_javascript_include_tag_with_duplicate_sources_5f26181cc072408061b8194b87cc170d.txt
new file mode 100644
index 000000000..bc7de3592
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0006_javascript_include_tag_with_duplicate_sources_5f26181cc072408061b8194b87cc170d.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0006_javascript_include_tag with duplicate sources"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", \\\"application\\\" %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0007_javascript_include_tag_with_duplicate_sources_among_distinct_ones_780d81e6c9ba63735a49327efd4a487d.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0007_javascript_include_tag_with_duplicate_sources_among_distinct_ones_780d81e6c9ba63735a49327efd4a487d.txt
new file mode 100644
index 000000000..b86a6e282
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0007_javascript_include_tag_with_duplicate_sources_among_distinct_ones_780d81e6c9ba63735a49327efd4a487d.txt
@@ -0,0 +1,7 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0007_javascript_include_tag with duplicate sources among distinct ones"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", \\\"vendor\\\", \\\"application\\\" %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << '
+'.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0007_javascript_include_tag_with_duplicate_sources_among_distinct_ones_bfdfa0cd6aa4b9ef187458313c3da2b0.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0007_javascript_include_tag_with_duplicate_sources_among_distinct_ones_bfdfa0cd6aa4b9ef187458313c3da2b0.txt
new file mode 100644
index 000000000..5d044210f
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0007_javascript_include_tag_with_duplicate_sources_among_distinct_ones_bfdfa0cd6aa4b9ef187458313c3da2b0.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0007_javascript_include_tag with duplicate sources among distinct ones"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", \\\"vendor\\\", \\\"application\\\" %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0008_javascript_include_tag_with_crossorigin_true_b09c9fd1a85ea8089378bf46501ac42d.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0008_javascript_include_tag_with_crossorigin_true_b09c9fd1a85ea8089378bf46501ac42d.txt
new file mode 100644
index 000000000..4a37d5ab7
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0008_javascript_include_tag_with_crossorigin_true_b09c9fd1a85ea8089378bf46501ac42d.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0008_javascript_include_tag with crossorigin true"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", crossorigin: true %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0008_javascript_include_tag_with_crossorigin_true_b1158a1b3e2997a5cbe166c09623dad0.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0008_javascript_include_tag_with_crossorigin_true_b1158a1b3e2997a5cbe166c09623dad0.txt
new file mode 100644
index 000000000..e37bfc8e7
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0008_javascript_include_tag_with_crossorigin_true_b1158a1b3e2997a5cbe166c09623dad0.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0008_javascript_include_tag with crossorigin true"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", crossorigin: true %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0009_javascript_include_tag_with_crossorigin_string_95b94394816479663347146ca4ed7c02.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0009_javascript_include_tag_with_crossorigin_string_95b94394816479663347146ca4ed7c02.txt
new file mode 100644
index 000000000..deabf6c20
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0009_javascript_include_tag_with_crossorigin_string_95b94394816479663347146ca4ed7c02.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0009_javascript_include_tag with crossorigin string"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", crossorigin: \\\"use-credentials\\\" %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0009_javascript_include_tag_with_crossorigin_string_c31ce0a08dad2574ba699d82cef413bb.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0009_javascript_include_tag_with_crossorigin_string_c31ce0a08dad2574ba699d82cef413bb.txt
new file mode 100644
index 000000000..39941a1ea
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0009_javascript_include_tag_with_crossorigin_string_c31ce0a08dad2574ba699d82cef413bb.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0009_javascript_include_tag with crossorigin string"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", crossorigin: \\\"use-credentials\\\" %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0010_javascript_include_tag_with_nopush_00e1c50322c275247ff4a62df930b341.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0010_javascript_include_tag_with_nopush_00e1c50322c275247ff4a62df930b341.txt
new file mode 100644
index 000000000..6785fdd35
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0010_javascript_include_tag_with_nopush_00e1c50322c275247ff4a62df930b341.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0010_javascript_include_tag with nopush"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", nopush: true %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0010_javascript_include_tag_with_nopush_56409a5a06bbd7c6943d5f0509948c26.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0010_javascript_include_tag_with_nopush_56409a5a06bbd7c6943d5f0509948c26.txt
new file mode 100644
index 000000000..517470de1
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0010_javascript_include_tag_with_nopush_56409a5a06bbd7c6943d5f0509948c26.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0010_javascript_include_tag with nopush"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", nopush: true %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0011_javascript_include_tag_with_preload_links_header_b540dc522fa7bc7b789ccae7dee27c4d.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0011_javascript_include_tag_with_preload_links_header_b540dc522fa7bc7b789ccae7dee27c4d.txt
new file mode 100644
index 000000000..329571db1
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0011_javascript_include_tag_with_preload_links_header_b540dc522fa7bc7b789ccae7dee27c4d.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0011_javascript_include_tag with preload_links_header"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", preload_links_header: false %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0011_javascript_include_tag_with_preload_links_header_df1d847e85dac73f0c99f93aa725ea7f.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0011_javascript_include_tag_with_preload_links_header_df1d847e85dac73f0c99f93aa725ea7f.txt
new file mode 100644
index 000000000..4d9ce42f8
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0011_javascript_include_tag_with_preload_links_header_df1d847e85dac73f0c99f93aa725ea7f.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0011_javascript_include_tag with preload_links_header"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", preload_links_header: false %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0012_javascript_include_tag_with_integrity_bd834618c20bd1da4c1d9859fe6172c5.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0012_javascript_include_tag_with_integrity_bd834618c20bd1da4c1d9859fe6172c5.txt
new file mode 100644
index 000000000..6e69b88ef
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0012_javascript_include_tag_with_integrity_bd834618c20bd1da4c1d9859fe6172c5.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0012_javascript_include_tag with integrity"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", integrity: \\\"sha256-abc\\\" %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/javascript_include_tag_test/test_0012_javascript_include_tag_with_integrity_c6c97d325088c5ba7e43fc18f8ac589a.txt b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0012_javascript_include_tag_with_integrity_c6c97d325088c5ba7e43fc18f8ac589a.txt
new file mode 100644
index 000000000..1455baee3
--- /dev/null
+++ b/test/snapshots/engine/action_view/javascript_include_tag_test/test_0012_javascript_include_tag_with_integrity_c6c97d325088c5ba7e43fc18f8ac589a.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::JavascriptIncludeTagTest#test_0012_javascript_include_tag with integrity"
+input: "{source: \"<%= javascript_include_tag \\\"application\\\", integrity: \\\"sha256-abc\\\" %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0014_stylesheet_link_tag_with_duplicate_sources_371db3cb72f4f4912711db7ffe93ff40.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0014_stylesheet_link_tag_with_duplicate_sources_371db3cb72f4f4912711db7ffe93ff40.txt
new file mode 100644
index 000000000..40df97a2f
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0014_stylesheet_link_tag_with_duplicate_sources_371db3cb72f4f4912711db7ffe93ff40.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0014_stylesheet_link_tag with duplicate sources"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", \\\"application\\\" %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0014_stylesheet_link_tag_with_duplicate_sources_a395b7c59b8fd5a5823d78d5cf373fd5.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0014_stylesheet_link_tag_with_duplicate_sources_a395b7c59b8fd5a5823d78d5cf373fd5.txt
new file mode 100644
index 000000000..4308a27f0
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0014_stylesheet_link_tag_with_duplicate_sources_a395b7c59b8fd5a5823d78d5cf373fd5.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0014_stylesheet_link_tag with duplicate sources"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", \\\"application\\\" %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0015_stylesheet_link_tag_with_duplicate_sources_among_distinct_ones_8509b7c2eea45f0df83c3f1347f73b36.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0015_stylesheet_link_tag_with_duplicate_sources_among_distinct_ones_8509b7c2eea45f0df83c3f1347f73b36.txt
new file mode 100644
index 000000000..de1aacf3a
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0015_stylesheet_link_tag_with_duplicate_sources_among_distinct_ones_8509b7c2eea45f0df83c3f1347f73b36.txt
@@ -0,0 +1,7 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0015_stylesheet_link_tag with duplicate sources among distinct ones"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", \\\"admin\\\", \\\"application\\\" %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << '
+'.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0015_stylesheet_link_tag_with_duplicate_sources_among_distinct_ones_f043e6f814c59c5f832fd8294359e4b5.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0015_stylesheet_link_tag_with_duplicate_sources_among_distinct_ones_f043e6f814c59c5f832fd8294359e4b5.txt
new file mode 100644
index 000000000..3f7bd0cc9
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0015_stylesheet_link_tag_with_duplicate_sources_among_distinct_ones_f043e6f814c59c5f832fd8294359e4b5.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0015_stylesheet_link_tag with duplicate sources among distinct ones"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", \\\"admin\\\", \\\"application\\\" %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0016_stylesheet_link_tag_with_crossorigin_true_8980ef2d58b4e910dff0f20c9e0f08e7.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0016_stylesheet_link_tag_with_crossorigin_true_8980ef2d58b4e910dff0f20c9e0f08e7.txt
new file mode 100644
index 000000000..9400cf007
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0016_stylesheet_link_tag_with_crossorigin_true_8980ef2d58b4e910dff0f20c9e0f08e7.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0016_stylesheet_link_tag with crossorigin true"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", crossorigin: true %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0016_stylesheet_link_tag_with_crossorigin_true_c980a627035e622344f2ca6857ba4b94.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0016_stylesheet_link_tag_with_crossorigin_true_c980a627035e622344f2ca6857ba4b94.txt
new file mode 100644
index 000000000..0d3bc0a28
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0016_stylesheet_link_tag_with_crossorigin_true_c980a627035e622344f2ca6857ba4b94.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0016_stylesheet_link_tag with crossorigin true"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", crossorigin: true %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0017_stylesheet_link_tag_with_crossorigin_string_02530bb3ad3ffa571f9c972e691aea6d.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0017_stylesheet_link_tag_with_crossorigin_string_02530bb3ad3ffa571f9c972e691aea6d.txt
new file mode 100644
index 000000000..fb942eb45
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0017_stylesheet_link_tag_with_crossorigin_string_02530bb3ad3ffa571f9c972e691aea6d.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0017_stylesheet_link_tag with crossorigin string"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", crossorigin: \\\"use-credentials\\\", media: \\\"all\\\" %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0017_stylesheet_link_tag_with_crossorigin_string_479373671786c3252743c239c2fe6c8c.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0017_stylesheet_link_tag_with_crossorigin_string_479373671786c3252743c239c2fe6c8c.txt
new file mode 100644
index 000000000..10b31b07a
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0017_stylesheet_link_tag_with_crossorigin_string_479373671786c3252743c239c2fe6c8c.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0017_stylesheet_link_tag with crossorigin string"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", crossorigin: \\\"use-credentials\\\", media: \\\"all\\\" %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0018_stylesheet_link_tag_with_nopush_1553578faaa58506899c05d4c5b83e85.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0018_stylesheet_link_tag_with_nopush_1553578faaa58506899c05d4c5b83e85.txt
new file mode 100644
index 000000000..9f79ea229
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0018_stylesheet_link_tag_with_nopush_1553578faaa58506899c05d4c5b83e85.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0018_stylesheet_link_tag with nopush"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", nopush: true %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0018_stylesheet_link_tag_with_nopush_4bf6445c2874a60ed4f69417a53fe737.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0018_stylesheet_link_tag_with_nopush_4bf6445c2874a60ed4f69417a53fe737.txt
new file mode 100644
index 000000000..5a9c803d6
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0018_stylesheet_link_tag_with_nopush_4bf6445c2874a60ed4f69417a53fe737.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0018_stylesheet_link_tag with nopush"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", nopush: true %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0019_stylesheet_link_tag_with_preload_links_header_322655a82bcd8ae278767f0a4f0d5973.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0019_stylesheet_link_tag_with_preload_links_header_322655a82bcd8ae278767f0a4f0d5973.txt
new file mode 100644
index 000000000..f02a813f4
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0019_stylesheet_link_tag_with_preload_links_header_322655a82bcd8ae278767f0a4f0d5973.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0019_stylesheet_link_tag with preload_links_header"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", preload_links_header: false %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0019_stylesheet_link_tag_with_preload_links_header_c23089fa44c50fb85848d3870605ec36.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0019_stylesheet_link_tag_with_preload_links_header_c23089fa44c50fb85848d3870605ec36.txt
new file mode 100644
index 000000000..7213ab0a4
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0019_stylesheet_link_tag_with_preload_links_header_c23089fa44c50fb85848d3870605ec36.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0019_stylesheet_link_tag with preload_links_header"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", preload_links_header: false %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0020_stylesheet_link_tag_with_integrity_a0b1b93d59d62e2ae3c13f6f7913ad00.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0020_stylesheet_link_tag_with_integrity_a0b1b93d59d62e2ae3c13f6f7913ad00.txt
new file mode 100644
index 000000000..4558a0d80
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0020_stylesheet_link_tag_with_integrity_a0b1b93d59d62e2ae3c13f6f7913ad00.txt
@@ -0,0 +1,6 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0020_stylesheet_link_tag with integrity"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", integrity: \\\"sha256-abc\\\" %>\", options: {optimize: true}}"
+---
+_buf = ::String.new; _buf << ''.freeze;
+_buf.to_s
diff --git a/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0020_stylesheet_link_tag_with_integrity_ab1868091f67f212aa3fe9e967954a73.txt b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0020_stylesheet_link_tag_with_integrity_ab1868091f67f212aa3fe9e967954a73.txt
new file mode 100644
index 000000000..730fae2ec
--- /dev/null
+++ b/test/snapshots/engine/action_view/stylesheet_link_tag_test/test_0020_stylesheet_link_tag_with_integrity_ab1868091f67f212aa3fe9e967954a73.txt
@@ -0,0 +1,5 @@
+---
+source: "Engine::ActionView::StylesheetLinkTagTest#test_0020_stylesheet_link_tag with integrity"
+input: "{source: \"<%= stylesheet_link_tag \\\"application\\\", integrity: \\\"sha256-abc\\\" %>\", locals: {}, options: {action_view_helpers: true}}"
+---
+
\ No newline at end of file