actionview 5.2.4.4 → 6.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionview might be problematic. Click here for more details.

Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +106 -91
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/lib/action_view.rb +1 -1
  6. data/lib/action_view/buffers.rb +15 -0
  7. data/lib/action_view/context.rb +5 -4
  8. data/lib/action_view/digestor.rb +7 -6
  9. data/lib/action_view/gem_version.rb +4 -4
  10. data/lib/action_view/helpers.rb +0 -2
  11. data/lib/action_view/helpers/asset_tag_helper.rb +4 -27
  12. data/lib/action_view/helpers/asset_url_helper.rb +4 -3
  13. data/lib/action_view/helpers/cache_helper.rb +18 -10
  14. data/lib/action_view/helpers/capture_helper.rb +4 -0
  15. data/lib/action_view/helpers/csrf_helper.rb +1 -1
  16. data/lib/action_view/helpers/date_helper.rb +69 -25
  17. data/lib/action_view/helpers/form_helper.rb +240 -8
  18. data/lib/action_view/helpers/form_options_helper.rb +23 -15
  19. data/lib/action_view/helpers/form_tag_helper.rb +9 -9
  20. data/lib/action_view/helpers/javascript_helper.rb +10 -11
  21. data/lib/action_view/helpers/number_helper.rb +5 -0
  22. data/lib/action_view/helpers/sanitize_helper.rb +3 -3
  23. data/lib/action_view/helpers/tag_helper.rb +7 -6
  24. data/lib/action_view/helpers/tags/base.rb +8 -4
  25. data/lib/action_view/helpers/tags/color_field.rb +1 -1
  26. data/lib/action_view/helpers/tags/translator.rb +1 -6
  27. data/lib/action_view/helpers/text_helper.rb +3 -3
  28. data/lib/action_view/helpers/translation_helper.rb +11 -18
  29. data/lib/action_view/helpers/url_helper.rb +14 -14
  30. data/lib/action_view/log_subscriber.rb +6 -6
  31. data/lib/action_view/lookup_context.rb +4 -4
  32. data/lib/action_view/railtie.rb +18 -0
  33. data/lib/action_view/record_identifier.rb +2 -2
  34. data/lib/action_view/renderer/partial_renderer.rb +2 -2
  35. data/lib/action_view/renderer/partial_renderer/collection_caching.rb +40 -1
  36. data/lib/action_view/renderer/streaming_template_renderer.rb +1 -1
  37. data/lib/action_view/rendering.rb +5 -4
  38. data/lib/action_view/routing_url_for.rb +12 -11
  39. data/lib/action_view/template.rb +25 -8
  40. data/lib/action_view/template/handlers/erb.rb +12 -2
  41. data/lib/action_view/template/resolver.rb +56 -16
  42. data/lib/action_view/test_case.rb +1 -1
  43. data/lib/action_view/testing/resolvers.rb +1 -1
  44. data/lib/assets/compiled/rails-ujs.js +39 -22
  45. metadata +14 -15
  46. data/lib/action_view/helpers/record_tag_helper.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 285d9a982fd985cc0c7b694548154f3e7b52dac3dfa42c9c7dbbd61d07f6ed81
4
- data.tar.gz: e877ec1372d604047b00f5a665397a42952ca07f7ed470a7c64a7c8913630f1e
3
+ metadata.gz: 58d19af0e853c217ca89f2167775195c7a44ebba26e4d9a682aabeb6a25b6af4
4
+ data.tar.gz: 15d2c9faa90c17d33772df3ce0eacccecb090e7310af47ab1d82bca6448a2a11
5
5
  SHA512:
6
- metadata.gz: 6293206a2f96b9a349fe3f40f1f42fa81727e38e8333149b60df3bfd56afb39fced4f23c2643eb6fd477bf5b8095e1b31b70cd8f5abbe9d7c577fab225fadfa5
7
- data.tar.gz: b5bffb0c64df5ba0640b1fbc0d4b75ca3e672f3172a4cd9c97280a35681be4419e82ac93b4093c6b2889c05fb26dd02e651e14c75e0aed98006ddadda2ca181d
6
+ metadata.gz: dc169a10649b5f6cdfb8488bd16cbb7cab049081e7a6c53821cfab497e8035c7843c690e3bffcffc571bf2f610e5f2b7eee80283f622262d5ff9f1f20c8ef210
7
+ data.tar.gz: ed371d7bec363bafe775d5a1ed3d11a1002f96589c142c662afabc1862c71314427fc07004d0bfa4bc2ac5078f0c0b38410ccca1ee738594223a1a3a336ffa14
@@ -1,29 +1,18 @@
1
- ## Rails 5.2.4.4 (September 09, 2020) ##
1
+ ## Rails 6.0.0.beta1 (January 18, 2019) ##
2
2
 
3
- * [CVE-2020-15169] Fix potential XSS vulnerability in the `translate`/`t` helper
3
+ * Remove deprecated `image_alt` helper.
4
4
 
5
- *Jonathan Hefner*
6
-
7
-
8
- ## Rails 5.2.4.3 (May 18, 2020) ##
9
-
10
- * [CVE-2020-8167] Check that request is same-origin prior to including CSRF token in XHRs
11
-
12
-
13
- ## Rails 5.2.4.1 (December 18, 2019) ##
14
-
15
- * No changes.
16
-
17
-
18
- ## Rails 5.2.4 (November 27, 2019) ##
5
+ *Rafael Mendonça França*
19
6
 
20
- * Allow programmatic click events to trigger Rails UJS click handlers.
21
- Programmatic click events (eg. ones generated by `Rails.fire(link, "click")`) don't specify a button. These events were being incorrectly stopped by code meant to ignore scroll wheel and right clicks introduced in #34573.
7
+ * Fix the need of `#protect_against_forgery?` method defined in
8
+ `ActionView::Base` subclasses. This prevents the use of forms and buttons.
22
9
 
23
- *Sudara Williams*
10
+ *Genadi Samokovarov*
24
11
 
12
+ * Fix UJS permanently showing disabled text in a[data-remote][data-disable-with] elements within forms.
13
+ Fixes #33889
25
14
 
26
- ## Rails 5.2.3 (March 27, 2019) ##
15
+ *Wolfgang Hobmaier*
27
16
 
28
17
  * Prevent non-primary mouse keys from triggering Rails UJS click handlers.
29
18
  Firefox fires click events even if the click was triggered by non-primary mouse keys such as right- or scroll-wheel-clicks.
@@ -37,37 +26,50 @@
37
26
 
38
27
  *Wolfgang Hobmaier*
39
28
 
29
+ * Prevent `ActionView::TextHelper#word_wrap` from unexpectedly stripping white space from the _left_ side of lines.
40
30
 
41
- ## Rails 5.2.2.1 (March 11, 2019) ##
31
+ For example, given input like this:
42
32
 
43
- * Only accept formats from registered mime types
33
+ ```
34
+ This is a paragraph with an initial indent,
35
+ followed by additional lines that are not indented,
36
+ and finally terminated with a blockquote:
37
+ "A pithy saying"
38
+ ```
39
+
40
+ Calling `word_wrap` should not trim the indents on the first and last lines.
44
41
 
45
- A lack of filtering on mime types could allow an attacker to read
46
- arbitrary files on the target server or to perform a denial of service
47
- attack.
42
+ Fixes #34487
48
43
 
49
- Fixes CVE-2019-5418
50
- Fixes CVE-2019-5419
44
+ *Lyle Mullican*
51
45
 
52
- *John Hawthorn*, *Eileen M. Uchitelle*, *Aaron Patterson*
46
+ * Add allocations to template rendering instrumentation.
53
47
 
48
+ Adds the allocations for template and partial rendering to the server output on render.
54
49
 
55
- ## Rails 5.2.2 (December 04, 2018) ##
50
+ ```
51
+ Rendered posts/_form.html.erb (Duration: 7.1ms | Allocations: 6004)
52
+ Rendered posts/new.html.erb within layouts/application (Duration: 8.3ms | Allocations: 6654)
53
+ Completed 200 OK in 858ms (Views: 848.4ms | ActiveRecord: 0.4ms | Allocations: 1539564)
54
+ ```
56
55
 
57
- * No changes.
56
+ *Eileen M. Uchitelle*, *Aaron Patterson*
58
57
 
58
+ * Respect the `only_path` option passed to `url_for` when the options are passed in as an array
59
59
 
60
- ## Rails 5.2.1.1 (November 27, 2018) ##
60
+ Fixes #33237.
61
61
 
62
- * No changes.
62
+ *Joel Ambass*
63
63
 
64
+ * Deprecate calling private model methods from view helpers.
64
65
 
65
- ## Rails 5.2.1 (August 07, 2018) ##
66
+ For example, in methods like `options_from_collection_for_select`
67
+ and `collection_select` it is possible to call private methods from
68
+ the objects used.
66
69
 
67
- * Fix leak of `skip_default_ids` and `allow_method_names_outside_object` options
68
- to HTML attributes.
70
+ Fixes #33546.
69
71
 
70
- *Yurii Cherniavskyi*
72
+ *Ana María Martínez Gómez*
71
73
 
72
74
  * Fix issue with `button_to`'s `to_form_params`
73
75
 
@@ -80,97 +82,110 @@
80
82
 
81
83
  *Georgi Georgiev*
82
84
 
83
- * Fix JavaScript views rendering does not work with Firefox when using
84
- Content Security Policy.
85
-
86
- Fixes #32577.
87
-
88
- *Yuji Yaginuma*
89
-
90
- * Add the `nonce: true` option for `javascript_include_tag` helper to
91
- support automatic nonce generation for Content Security Policy.
92
- Works the same way as `javascript_tag nonce: true` does.
85
+ * Mark arrays of translations as trusted safe by using the `_html` suffix.
93
86
 
94
- *Yaroslav Markin*
87
+ Example:
95
88
 
89
+ en:
90
+ foo_html:
91
+ - "One"
92
+ - "<strong>Two</strong>"
93
+ - "Three &#128075; &#128578;"
96
94
 
97
- ## Rails 5.2.0 (April 09, 2018) ##
95
+ *Juan Broullon*
98
96
 
99
- * Pass the `:skip_pipeline` option in `image_submit_tag` when calling `path_to_image`.
97
+ * Add `year_format` option to date_select tag. This option makes it possible to customize year
98
+ names. Lambda should be passed to use this option.
100
99
 
101
- Fixes #32248.
100
+ Example:
102
101
 
103
- *Andrew White*
102
+ date_select('user_birthday', '', start_year: 1998, end_year: 2000, year_format: ->year { "Heisei #{year - 1988}" })
104
103
 
105
- * Allow the use of callable objects as group methods for grouped selects.
104
+ The HTML produced:
106
105
 
107
- Until now, the `option_groups_from_collection_for_select` method was only able to
108
- handle method names as `group_method` and `group_label_method` parameters,
109
- it is now able to receive procs and other callable objects too.
106
+ <select id="user_birthday__1i" name="user_birthday[(1i)]">
107
+ <option value="1998">Heisei 10</option>
108
+ <option value="1999">Heisei 11</option>
109
+ <option value="2000">Heisei 12</option>
110
+ </select>
111
+ /* The rest is omitted */
110
112
 
111
- *Jérémie Bonal*
113
+ *Koki Ryu*
112
114
 
113
- * Add `preload_link_tag` helper.
115
+ * Fix JavaScript views rendering does not work with Firefox when using
116
+ Content Security Policy.
114
117
 
115
- This helper that allows to the browser to initiate early fetch of resources
116
- (different to the specified in `javascript_include_tag` and `stylesheet_link_tag`).
117
- Additionally, this sends Early Hints if supported by browser.
118
+ Fixes #32577.
118
119
 
119
- *Guillermo Iguaran*
120
+ *Yuji Yaginuma*
120
121
 
121
- * Change `form_with` to generates ids by default.
122
+ * Add the `nonce: true` option for `javascript_include_tag` helper to
123
+ support automatic nonce generation for Content Security Policy.
124
+ Works the same way as `javascript_tag nonce: true` does.
122
125
 
123
- When `form_with` was introduced we disabled the automatic generation of ids
124
- that was enabled in `form_for`. This usually is not an good idea since labels don't work
125
- when the input doesn't have an id and it made harder to test with Capybara.
126
+ *Yaroslav Markin*
126
127
 
127
- You can still disable the automatic generation of ids setting `config.action_view.form_with_generates_ids`
128
- to `false.`
128
+ * Remove `ActionView::Helpers::RecordTagHelper`.
129
129
 
130
- *Nick Pezza*
130
+ *Yoshiyuki Hirano*
131
131
 
132
- * Fix issues with `field_error_proc` wrapping `optgroup` and select divider `option`.
132
+ * Disable `ActionView::Template` finalizers in test environment.
133
133
 
134
- Fixes #31088
134
+ Template finalization can be expensive in large view test suites.
135
+ Add a configuration option,
136
+ `action_view.finalize_compiled_template_methods`, and turn it off in
137
+ the test environment.
135
138
 
136
- *Matthias Neumayr*
139
+ *Simon Coffey*
137
140
 
138
- * Remove deprecated Erubis ERB handler.
141
+ * Extract the `confirm` call in its own, overridable method in `rails_ujs`.
139
142
 
140
- *Rafael Mendonça França*
143
+ Example:
141
144
 
142
- * Remove default `alt` text generation.
145
+ Rails.confirm = function(message, element) {
146
+ return (my_bootstrap_modal_confirm(message));
147
+ }
143
148
 
144
- Fixes #30096
149
+ *Mathieu Mahé*
145
150
 
146
- *Cameron Cundiff*
151
+ * Enable select tag helper to mark `prompt` option as `selected` and/or `disabled` for `required`
152
+ field.
147
153
 
148
- * Add `srcset` option to `image_tag` helper.
154
+ Example:
149
155
 
150
- *Roberto Miranda*
156
+ select :post,
157
+ :category,
158
+ ["lifestyle", "programming", "spiritual"],
159
+ { selected: "", disabled: "", prompt: "Choose one" },
160
+ { required: true }
151
161
 
152
- * Fix issues with scopes and engine on `current_page?` method.
162
+ Placeholder option would be selected and disabled.
153
163
 
154
- Fixes #29401.
164
+ The HTML produced:
155
165
 
156
- *Nikita Savrov*
166
+ <select required="required" name="post[category]" id="post_category">
167
+ <option disabled="disabled" selected="selected" value="">Choose one</option>
168
+ <option value="lifestyle">lifestyle</option>
169
+ <option value="programming">programming</option>
170
+ <option value="spiritual">spiritual</option></select>
157
171
 
158
- * Generate field ids in `collection_check_boxes` and `collection_radio_buttons`.
172
+ *Sergey Prikhodko*
159
173
 
160
- This makes sure that the labels are linked up with the fields.
174
+ * Don't enforce UTF-8 by default.
161
175
 
162
- Fixes #29014.
176
+ With the disabling of TLS 1.0 by most major websites, continuing to run
177
+ IE8 or lower becomes increasingly difficult so default to not enforcing
178
+ UTF-8 encoding as it's not relevant to other browsers.
163
179
 
164
- *Yuji Yaginuma*
180
+ *Andrew White*
165
181
 
166
- * Add `:json` type to `auto_discovery_link_tag` to support [JSON Feeds](https://jsonfeed.org/version/1).
182
+ * Change translation key of `submit_tag` from `module_name_class_name` to `module_name/class_name`.
167
183
 
168
- *Mike Gunderloy*
184
+ *Rui Onodera*
169
185
 
170
- * Update `distance_of_time_in_words` helper to display better error messages
171
- for bad input.
186
+ * Rails 6 requires Ruby 2.5.0 or newer.
172
187
 
173
- *Jay Hayes*
188
+ *Jeremy Daer*, *Kasper Timm Hansen*
174
189
 
175
190
 
176
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/actionview/CHANGELOG.md) for previous changes.
191
+ Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/actionview/CHANGELOG.md) for previous changes.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2004-2018 David Heinemeier Hansson
1
+ Copyright (c) 2004-2019 David Heinemeier Hansson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -13,7 +13,7 @@ The latest version of Action View can be installed with RubyGems:
13
13
 
14
14
  Source code can be downloaded as part of the Rails project on GitHub:
15
15
 
16
- * https://github.com/rails/rails/tree/5-2-stable/actionview
16
+ * https://github.com/rails/rails/tree/master/actionview
17
17
 
18
18
 
19
19
  == License
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #--
4
- # Copyright (c) 2004-2018 David Heinemeier Hansson
4
+ # Copyright (c) 2004-2019 David Heinemeier Hansson
5
5
  #
6
6
  # Permission is hereby granted, free of charge, to any person obtaining
7
7
  # a copy of this software and associated documentation files (the
@@ -3,6 +3,21 @@
3
3
  require "active_support/core_ext/string/output_safety"
4
4
 
5
5
  module ActionView
6
+ # Used as a buffer for views
7
+ #
8
+ # The main difference between this and ActiveSupport::SafeBuffer
9
+ # is for the methods `<<` and `safe_expr_append=` the inputs are
10
+ # checked for nil before they are assigned and `to_s` is called on
11
+ # the input. For example:
12
+ #
13
+ # obuf = ActionView::OutputBuffer.new "hello"
14
+ # obuf << 5
15
+ # puts obuf # => "hello5"
16
+ #
17
+ # sbuf = ActiveSupport::SafeBuffer.new "hello"
18
+ # sbuf << 5
19
+ # puts sbuf # => "hello\u0005"
20
+ #
6
21
  class OutputBuffer < ActiveSupport::SafeBuffer #:nodoc:
7
22
  def initialize(*)
8
23
  super
@@ -10,10 +10,11 @@ module ActionView
10
10
  # Action View contexts are supplied to Action Controller to render a template.
11
11
  # The default Action View context is ActionView::Base.
12
12
  #
13
- # In order to work with ActionController, a Context must just include this module.
14
- # The initialization of the variables used by the context (@output_buffer, @view_flow,
15
- # and @virtual_path) is responsibility of the object that includes this module
16
- # (although you can call _prepare_context defined below).
13
+ # In order to work with Action Controller, a Context must just include this
14
+ # module. The initialization of the variables used by the context
15
+ # (@output_buffer, @view_flow, and @virtual_path) is responsibility of the
16
+ # object that includes this module (although you can call _prepare_context
17
+ # defined below).
17
18
  module Context
18
19
  include CompiledTemplates
19
20
  attr_accessor :output_buffer, :view_flow
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "concurrent/map"
4
3
  require "action_view/dependency_tracker"
5
- require "monitor"
6
4
 
7
5
  module ActionView
8
6
  class Digestor
@@ -20,9 +18,12 @@ module ActionView
20
18
  # * <tt>name</tt> - Template name
21
19
  # * <tt>finder</tt> - An instance of <tt>ActionView::LookupContext</tt>
22
20
  # * <tt>dependencies</tt> - An array of dependent views
23
- def digest(name:, finder:, dependencies: [])
24
- dependencies ||= []
25
- cache_key = [ name, finder.rendered_format, dependencies ].flatten.compact.join(".")
21
+ def digest(name:, finder:, dependencies: nil)
22
+ if dependencies.nil? || dependencies.empty?
23
+ cache_key = "#{name}.#{finder.rendered_format}"
24
+ else
25
+ cache_key = [ name, finder.rendered_format, dependencies ].flatten.compact.join(".")
26
+ end
26
27
 
27
28
  # this is a correctly done double-checked locking idiom
28
29
  # (Concurrent::Map's lookups have volatile semantics)
@@ -32,7 +33,7 @@ module ActionView
32
33
  root = tree(name, finder, partial)
33
34
  dependencies.each do |injected_dep|
34
35
  root.children << Injected.new(injected_dep, nil, nil)
35
- end
36
+ end if dependencies
36
37
  finder.digest_cache[cache_key] = root.digest(finder)
37
38
  end
38
39
  end
@@ -7,10 +7,10 @@ module ActionView
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 5
11
- MINOR = 2
12
- TINY = 4
13
- PRE = "4"
10
+ MAJOR = 6
11
+ MINOR = 0
12
+ TINY = 0
13
+ PRE = "beta1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -23,7 +23,6 @@ module ActionView #:nodoc:
23
23
  autoload :JavaScriptHelper, "action_view/helpers/javascript_helper"
24
24
  autoload :NumberHelper
25
25
  autoload :OutputSafetyHelper
26
- autoload :RecordTagHelper
27
26
  autoload :RenderingHelper
28
27
  autoload :SanitizeHelper
29
28
  autoload :TagHelper
@@ -57,7 +56,6 @@ module ActionView #:nodoc:
57
56
  include JavaScriptHelper
58
57
  include NumberHelper
59
58
  include OutputSafetyHelper
60
- include RecordTagHelper
61
59
  include RenderingHelper
62
60
  include SanitizeHelper
63
61
  include TagHelper
@@ -55,7 +55,7 @@ module ActionView
55
55
  # that path.
56
56
  # * <tt>:skip_pipeline</tt> - This option is used to bypass the asset pipeline
57
57
  # when it is set to true.
58
- # * <tt>:nonce<tt> - When set to true, adds an automatic nonce value if
58
+ # * <tt>:nonce</tt> - When set to true, adds an automatic nonce value if
59
59
  # you have Content Security Policy enabled.
60
60
  #
61
61
  # ==== Examples
@@ -98,7 +98,7 @@ module ActionView
98
98
  if tag_options["nonce"] == true
99
99
  tag_options["nonce"] = content_security_policy_nonce
100
100
  end
101
- content_tag("script".freeze, "", tag_options)
101
+ content_tag("script", "", tag_options)
102
102
  }.join("\n").html_safe
103
103
 
104
104
  request.send_early_hints("Link" => early_hints_links.join("\n")) if respond_to?(:request) && request
@@ -333,9 +333,9 @@ module ActionView
333
333
  #
334
334
  # image_tag(user.avatar)
335
335
  # # => <img src="/rails/active_storage/blobs/.../tiger.jpg" />
336
- # image_tag(user.avatar.variant(resize: "100x100"))
336
+ # image_tag(user.avatar.variant(resize_to_fit: [100, 100]))
337
337
  # # => <img src="/rails/active_storage/variants/.../tiger.jpg" />
338
- # image_tag(user.avatar.variant(resize: "100x100"), size: '100')
338
+ # image_tag(user.avatar.variant(resize_to_fit: [100, 100]), size: '100')
339
339
  # # => <img width="100" height="100" src="/rails/active_storage/variants/.../tiger.jpg" />
340
340
  def image_tag(source, options = {})
341
341
  options = options.symbolize_keys
@@ -355,29 +355,6 @@ module ActionView
355
355
  tag("img", options)
356
356
  end
357
357
 
358
- # Returns a string suitable for an HTML image tag alt attribute.
359
- # The +src+ argument is meant to be an image file path.
360
- # The method removes the basename of the file path and the digest,
361
- # if any. It also removes hyphens and underscores from file names and
362
- # replaces them with spaces, returning a space-separated, titleized
363
- # string.
364
- #
365
- # ==== Examples
366
- #
367
- # image_alt('rails.png')
368
- # # => Rails
369
- #
370
- # image_alt('hyphenated-file-name.png')
371
- # # => Hyphenated file name
372
- #
373
- # image_alt('underscored_file_name.png')
374
- # # => Underscored file name
375
- def image_alt(src)
376
- ActiveSupport::Deprecation.warn("image_alt is deprecated and will be removed from Rails 6.0. You must explicitly set alt text on images.")
377
-
378
- File.basename(src, ".*".freeze).sub(/-[[:xdigit:]]{32,64}\z/, "".freeze).tr("-_".freeze, " ".freeze).capitalize
379
- end
380
-
381
358
  # Returns an HTML video tag for the +sources+. If +sources+ is a string,
382
359
  # a single video tag will be returned. If +sources+ is an array, a video
383
360
  # tag with nested source tags for each source will be returned. The