pageflow 17.0.5 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +362 -35
  3. data/README.md +0 -1
  4. data/admins/pageflow/accounts.rb +16 -14
  5. data/admins/pageflow/entry.rb +68 -20
  6. data/admins/pageflow/entry_templates.rb +10 -9
  7. data/admins/pageflow/folder.rb +1 -1
  8. data/admins/pageflow/membership.rb +4 -4
  9. data/admins/pageflow/revisions.rb +5 -5
  10. data/admins/pageflow/site_root_entry.rb +64 -0
  11. data/admins/pageflow/sites.rb +12 -3
  12. data/admins/pageflow/translations.rb +75 -0
  13. data/admins/pageflow/user.rb +21 -35
  14. data/app/assets/javascripts/pageflow/admin/entries.js +30 -5
  15. data/app/assets/javascripts/pageflow/dist/ui.js +2865 -257
  16. data/app/assets/stylesheets/pageflow/admin/entries/index_table.scss +2 -1
  17. data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +2 -1
  18. data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +6 -0
  19. data/app/assets/stylesheets/pageflow/editor/base.scss +2 -0
  20. data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +7 -1
  21. data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +5 -1
  22. data/app/assets/stylesheets/pageflow/editor/files.scss +28 -16
  23. data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +24 -0
  24. data/app/assets/stylesheets/pageflow/editor/info_box.scss +11 -3
  25. data/app/assets/stylesheets/pageflow/editor/list.scss +6 -4
  26. data/app/assets/stylesheets/pageflow/editor/list_search_field.scss +52 -0
  27. data/app/assets/stylesheets/pageflow/editor/outline.scss +0 -13
  28. data/app/assets/stylesheets/pageflow/editor/select_button.scss +1 -1
  29. data/app/assets/stylesheets/pageflow/editor/sortable.scss +12 -0
  30. data/app/assets/stylesheets/pageflow/mixins/buttons.scss +4 -4
  31. data/app/assets/stylesheets/pageflow/ui/forms.scss +4 -0
  32. data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +8 -0
  33. data/app/assets/stylesheets/pageflow/ui/input/file_name_input.scss +37 -0
  34. data/app/assets/stylesheets/pageflow/ui/properties.scss +5 -0
  35. data/app/assets/stylesheets/pageflow/ui.scss +1 -0
  36. data/app/controllers/concerns/pageflow/controller_delegation.rb +1 -1
  37. data/app/controllers/concerns/pageflow/edit_locking.rb +17 -10
  38. data/app/controllers/concerns/pageflow/entry_password_protection.rb +1 -0
  39. data/app/controllers/concerns/pageflow/public_https_mode.rb +2 -1
  40. data/app/controllers/concerns/pageflow/quota_verification.rb +5 -4
  41. data/app/controllers/pageflow/admin/initial_passwords_controller.rb +1 -0
  42. data/app/controllers/pageflow/application_controller.rb +19 -19
  43. data/app/controllers/pageflow/chapters_controller.rb +3 -2
  44. data/app/controllers/pageflow/edit_locks_controller.rb +3 -2
  45. data/app/controllers/pageflow/editor/encoding_confirmations_controller.rb +1 -0
  46. data/app/controllers/pageflow/editor/entries_controller.rb +2 -1
  47. data/app/controllers/pageflow/editor/entry_publications_controller.rb +1 -0
  48. data/app/controllers/pageflow/editor/file_import_controller.rb +3 -3
  49. data/app/controllers/pageflow/editor/files_controller.rb +7 -6
  50. data/app/controllers/pageflow/editor/widgets_controller.rb +1 -0
  51. data/app/controllers/pageflow/entries_controller.rb +77 -17
  52. data/app/controllers/pageflow/feeds_controller.rb +1 -1
  53. data/app/controllers/pageflow/files_controller.rb +1 -0
  54. data/app/controllers/pageflow/pages_controller.rb +4 -2
  55. data/app/controllers/pageflow/revisions_controller.rb +2 -1
  56. data/app/controllers/pageflow/sitemaps_controller.rb +1 -1
  57. data/app/controllers/pageflow/storylines_controller.rb +1 -0
  58. data/app/helpers/pageflow/admin/cutoff_modes_helper.rb +12 -0
  59. data/app/helpers/pageflow/admin/entries_helper.rb +1 -1
  60. data/app/helpers/pageflow/admin/entry_translations_helper.rb +18 -0
  61. data/app/helpers/pageflow/admin/features_helper.rb +1 -1
  62. data/app/helpers/pageflow/admin/form_helper.rb +3 -3
  63. data/app/helpers/pageflow/admin/locales_helper.rb +10 -2
  64. data/app/helpers/pageflow/admin/memberships_helper.rb +32 -32
  65. data/app/helpers/pageflow/admin/revisions_helper.rb +1 -1
  66. data/app/helpers/pageflow/admin/sites_helper.rb +22 -0
  67. data/app/helpers/pageflow/admin/users_helper.rb +7 -5
  68. data/app/helpers/pageflow/admin/widgets_helper.rb +3 -3
  69. data/app/helpers/pageflow/asset_urls_helper.rb +1 -1
  70. data/app/helpers/pageflow/audio_files_helper.rb +5 -2
  71. data/app/helpers/pageflow/background_image_helper.rb +7 -6
  72. data/app/helpers/pageflow/common_entry_seed_helper.rb +2 -4
  73. data/app/helpers/pageflow/editor/config_helper.rb +1 -1
  74. data/app/helpers/pageflow/editor/files_helper.rb +1 -1
  75. data/app/helpers/pageflow/embed_code_helper.rb +3 -3
  76. data/app/helpers/pageflow/entries_helper.rb +58 -34
  77. data/app/helpers/pageflow/entry_json_seed_helper.rb +3 -2
  78. data/app/helpers/pageflow/feeds_helper.rb +2 -2
  79. data/app/helpers/pageflow/file_background_images_helper.rb +2 -2
  80. data/app/helpers/pageflow/file_thumbnails_helper.rb +4 -3
  81. data/app/helpers/pageflow/files_helper.rb +5 -4
  82. data/app/helpers/pageflow/folders_helper.rb +8 -5
  83. data/app/helpers/pageflow/help_entries_helper.rb +2 -2
  84. data/app/helpers/pageflow/hreflang_links_helper.rb +37 -0
  85. data/app/helpers/pageflow/info_box_helper.rb +7 -11
  86. data/app/helpers/pageflow/media_query_helper.rb +3 -3
  87. data/app/helpers/pageflow/navigation_bar_helper.rb +1 -1
  88. data/app/helpers/pageflow/overview_helper.rb +1 -1
  89. data/app/helpers/pageflow/page_types_helper.rb +5 -5
  90. data/app/helpers/pageflow/pages_helper.rb +29 -15
  91. data/app/helpers/pageflow/public_i18n_helper.rb +1 -1
  92. data/app/helpers/pageflow/quota_helper.rb +4 -4
  93. data/app/helpers/pageflow/render_json_helper.rb +6 -3
  94. data/app/helpers/pageflow/revision_file_helper.rb +2 -1
  95. data/app/helpers/pageflow/sites_helper.rb +3 -3
  96. data/app/helpers/pageflow/social_share_helper.rb +24 -10
  97. data/app/helpers/pageflow/social_share_links_helper.rb +12 -9
  98. data/app/helpers/pageflow/structured_data_helper.rb +1 -1
  99. data/app/helpers/pageflow/stub_page_configuration.rb +7 -3
  100. data/app/helpers/pageflow/text_direction_helper.rb +1 -1
  101. data/app/helpers/pageflow/themes_helper.rb +1 -1
  102. data/app/helpers/pageflow/video_files_helper.rb +29 -13
  103. data/app/helpers/pageflow/widgets_helper.rb +7 -6
  104. data/app/inputs/pageflow_permalink_input.rb +3 -2
  105. data/app/jobs/pageflow/application_job.rb +1 -0
  106. data/app/jobs/pageflow/entry_export_import/upload_and_publish_file_job.rb +1 -1
  107. data/app/jobs/pageflow/poll_meta_data_from_zencoder_job.rb +1 -0
  108. data/app/jobs/pageflow/poll_zencoder_job.rb +3 -2
  109. data/app/jobs/pageflow/process_image_or_text_track_job.rb +1 -0
  110. data/app/jobs/pageflow/prune_auto_snapshots_job.rb +1 -0
  111. data/app/jobs/pageflow/request_meta_data_from_zencoder_job.rb +1 -0
  112. data/app/jobs/pageflow/submit_file_to_zencoder_job.rb +1 -0
  113. data/app/mailers/pageflow/user_mailer.rb +1 -0
  114. data/app/models/concerns/pageflow/auto_generated_perma_id.rb +13 -1
  115. data/app/models/concerns/pageflow/entry_publication_states.rb +7 -3
  116. data/app/models/concerns/pageflow/feature_target.rb +8 -4
  117. data/app/models/concerns/pageflow/output_source.rb +3 -3
  118. data/app/models/concerns/pageflow/permalinkable.rb +2 -1
  119. data/app/models/concerns/pageflow/reusable_file.rb +23 -23
  120. data/app/models/concerns/pageflow/serialization_blacklist.rb +1 -1
  121. data/app/models/concerns/pageflow/suspendable.rb +5 -3
  122. data/app/models/concerns/pageflow/theme_referencer.rb +1 -1
  123. data/app/models/concerns/pageflow/translatable.rb +62 -0
  124. data/app/models/concerns/pageflow/uploadable_file.rb +6 -6
  125. data/app/models/pageflow/account.rb +6 -5
  126. data/app/models/pageflow/account_member_query.rb +1 -1
  127. data/app/models/pageflow/account_role_query.rb +1 -1
  128. data/app/models/pageflow/application_query.rb +1 -1
  129. data/app/models/pageflow/application_record.rb +1 -1
  130. data/app/models/pageflow/audio_file.rb +4 -4
  131. data/app/models/pageflow/audio_file_url_templates.rb +1 -1
  132. data/app/models/pageflow/authentication_token.rb +2 -2
  133. data/app/models/pageflow/chapter.rb +6 -1
  134. data/app/models/pageflow/chapter_scaffold.rb +2 -4
  135. data/app/models/pageflow/cname_site_request_scope.rb +1 -1
  136. data/app/models/pageflow/customized_theme.rb +6 -6
  137. data/app/models/pageflow/draft_entry.rb +37 -9
  138. data/app/models/pageflow/edit_lock.rb +19 -21
  139. data/app/models/pageflow/encoding_confirmation.rb +2 -2
  140. data/app/models/pageflow/entries_feed.rb +2 -2
  141. data/app/models/pageflow/entry.rb +44 -30
  142. data/app/models/pageflow/entry_at_revision.rb +5 -1
  143. data/app/models/pageflow/entry_duplicate.rb +8 -5
  144. data/app/models/pageflow/entry_publication.rb +2 -2
  145. data/app/models/pageflow/entry_role_query.rb +4 -4
  146. data/app/models/pageflow/entry_template.rb +4 -4
  147. data/app/models/pageflow/entry_title_or_account_name_query.rb +2 -2
  148. data/app/models/pageflow/entry_translation_group.rb +42 -0
  149. data/app/models/pageflow/file_reuse.rb +2 -2
  150. data/app/models/pageflow/file_usage.rb +10 -3
  151. data/app/models/pageflow/folder.rb +2 -2
  152. data/app/models/pageflow/home_button.rb +7 -7
  153. data/app/models/pageflow/image_file.rb +20 -5
  154. data/app/models/pageflow/image_file_url_templates.rb +1 -1
  155. data/app/models/pageflow/invitation_form.rb +2 -1
  156. data/app/models/pageflow/managed_user_query.rb +1 -1
  157. data/app/models/pageflow/membership.rb +5 -5
  158. data/app/models/pageflow/nested_revision_component_copy.rb +263 -0
  159. data/app/models/pageflow/null_user.rb +1 -1
  160. data/app/models/pageflow/overview_button.rb +1 -1
  161. data/app/models/pageflow/page.rb +7 -3
  162. data/app/models/pageflow/permalink.rb +23 -2
  163. data/app/models/pageflow/permalink_directory.rb +7 -0
  164. data/app/models/pageflow/permalink_redirect.rb +7 -0
  165. data/app/models/pageflow/positioned_file.rb +5 -5
  166. data/app/models/pageflow/potential_entry_translations.rb +55 -0
  167. data/app/models/pageflow/potential_memberships.rb +5 -4
  168. data/app/models/pageflow/published_entry.rb +62 -11
  169. data/app/models/pageflow/revision.rb +24 -15
  170. data/app/models/pageflow/roles.rb +14 -18
  171. data/app/models/pageflow/site.rb +36 -3
  172. data/app/models/pageflow/site_root_entry_form.rb +27 -0
  173. data/app/models/pageflow/sitemaps.rb +10 -1
  174. data/app/models/pageflow/storyline.rb +5 -2
  175. data/app/models/pageflow/storyline_scaffold.rb +1 -1
  176. data/app/models/pageflow/text_track_file.rb +1 -1
  177. data/app/models/pageflow/text_track_file_url_templates.rb +1 -1
  178. data/app/models/pageflow/theme_customization_file.rb +3 -2
  179. data/app/models/pageflow/thumbnail_file_resolver.rb +1 -1
  180. data/app/models/pageflow/url_template.rb +1 -1
  181. data/app/models/pageflow/used_file.rb +7 -3
  182. data/app/models/pageflow/user_name_query.rb +2 -2
  183. data/app/models/pageflow/video_file.rb +22 -15
  184. data/app/models/pageflow/video_file_url_templates.rb +6 -4
  185. data/app/models/pageflow/widget.rb +4 -3
  186. data/app/models/pageflow/with_file_usage_extension.rb +1 -1
  187. data/app/models/pageflow/zencoder_attachment.rb +8 -8
  188. data/app/policies/pageflow/account_policy.rb +3 -1
  189. data/app/policies/pageflow/admin/admin_only_tab_policy.rb +1 -0
  190. data/app/policies/pageflow/admin/entry_tab_policy.rb +1 -0
  191. data/app/policies/pageflow/application_policy.rb +2 -0
  192. data/app/policies/pageflow/entry_policy.rb +7 -1
  193. data/app/policies/pageflow/entry_template_policy.rb +2 -1
  194. data/app/policies/pageflow/file_policy.rb +4 -7
  195. data/app/policies/pageflow/folder_policy.rb +18 -8
  196. data/app/policies/pageflow/membership_policy.rb +6 -4
  197. data/app/policies/pageflow/site_policy.rb +10 -3
  198. data/app/policies/pageflow/user_policy.rb +6 -4
  199. data/app/state_machines/pageflow/image_and_text_track_processing_state_machine.rb +3 -2
  200. data/app/state_machines/pageflow/media_encoding_state_machine.rb +5 -4
  201. data/app/views/admin/accounts/_entry_template_details.html.arb +2 -2
  202. data/app/views/admin/entries/_attributes_table.html.arb +6 -5
  203. data/app/views/admin/entries/_form.html.erb +2 -1
  204. data/app/views/admin/entries/_permalink_inputs.html.erb +9 -2
  205. data/app/views/admin/entry_templates/_form.html.erb +1 -3
  206. data/app/views/admin/site_root_entry/choose.html.erb +19 -0
  207. data/app/views/admin/sites/_fields.html.erb +14 -1
  208. data/app/views/admin/translations/_form.html.erb +31 -0
  209. data/app/views/admin/users/_attributes_table.html.arb +13 -0
  210. data/app/views/components/pageflow/admin/add_membership_button.rb +13 -12
  211. data/app/views/components/pageflow/admin/custom_scopes_renderer.rb +1 -0
  212. data/app/views/components/pageflow/admin/embed_code_field.rb +1 -0
  213. data/app/views/components/pageflow/admin/embedded_index_table.rb +9 -10
  214. data/app/views/components/pageflow/admin/entries_tab.rb +1 -0
  215. data/app/views/components/pageflow/admin/entry_publication_state_indicator.rb +6 -5
  216. data/app/views/components/pageflow/admin/entry_templates_tab.rb +2 -1
  217. data/app/views/components/pageflow/admin/entry_translations_tab.rb +102 -0
  218. data/app/views/components/pageflow/admin/entry_user_badge_list.rb +1 -0
  219. data/app/views/components/pageflow/admin/extensible_attributes_table.rb +9 -8
  220. data/app/views/components/pageflow/admin/features_tab.rb +1 -0
  221. data/app/views/components/pageflow/admin/grouped_folder_list.rb +1 -0
  222. data/app/views/components/pageflow/admin/icon_link_to.rb +1 -0
  223. data/app/views/components/pageflow/admin/members_tab.rb +4 -3
  224. data/app/views/components/pageflow/admin/membership_role_with_tooltip.rb +3 -2
  225. data/app/views/components/pageflow/admin/revisions_tab.rb +14 -10
  226. data/app/views/components/pageflow/admin/sites_tab.rb +1 -0
  227. data/app/views/components/pageflow/admin/tabs_view.rb +1 -0
  228. data/app/views/components/pageflow/admin/timestamp.rb +6 -5
  229. data/app/views/components/pageflow/admin/user_account_badge_list.rb +2 -3
  230. data/app/views/components/pageflow/admin/user_accounts_tab.rb +1 -0
  231. data/app/views/components/pageflow/admin/user_entries_tab.rb +1 -0
  232. data/app/views/components/pageflow/admin/users_tab.rb +1 -0
  233. data/app/views/pageflow/editor/config/_seeds.json.jbuilder +1 -1
  234. data/app/views/pageflow/editor/entries/index.json.jbuilder +1 -1
  235. data/app/views/pageflow/editor/entries/show.json.jbuilder +1 -1
  236. data/app/views/pageflow/editor/entry_publications/check.json.jbuilder +2 -2
  237. data/app/views/pageflow/editor/files/_file.json.jbuilder +5 -13
  238. data/app/views/pageflow/editor/files/create.json.jbuilder +1 -1
  239. data/app/views/pageflow/editor/files/index.json.jbuilder +1 -1
  240. data/app/views/pageflow/editor/sites/_site.json.jbuilder +1 -0
  241. data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +1 -3
  242. data/app/views/pageflow/entries/share_menu/_bluesky_link.html.erb +8 -0
  243. data/app/views/pageflow/entries/share_menu/_threads_link.html.erb +8 -0
  244. data/app/views/pageflow/files/_file.json.jbuilder +3 -3
  245. data/app/views/pageflow/sitemaps/index.xml.builder +9 -1
  246. data/app/views/pageflow/social_share/_entry_meta_tags.html.erb +1 -1
  247. data/app/views/pageflow/social_share/_page_meta_tags.html.erb +1 -1
  248. data/config/initializers/active_admin_patches.rb +3 -6
  249. data/config/initializers/admin_resource_tabs.rb +3 -0
  250. data/config/initializers/paperclip.rb +1 -0
  251. data/config/initializers/symmetric_encryption.rb +1 -1
  252. data/config/initializers/zencoder.rb +24 -13
  253. data/config/locales/de.yml +110 -4
  254. data/config/locales/en.yml +109 -7
  255. data/config/routes.rb +15 -13
  256. data/config/spring.rb +2 -1
  257. data/db/migrate/20140418225525_setup_schema.rb +2 -2
  258. data/db/migrate/20190306161431_copy_file_attributes_of_failed_uploads.rb +2 -2
  259. data/db/migrate/20190820152900_drop_accounts_themes.rb +2 -1
  260. data/db/migrate/20191202145757_create_pageflow_scrolled_sections.rb +11 -11
  261. data/db/migrate/20191202150657_create_pageflow_scrolled_chapters.rb +1 -1
  262. data/db/migrate/20191202154723_create_pageflow_scrolled_content_elements.rb +9 -9
  263. data/db/migrate/20191219143450_add_position_to_content_elements.rb +2 -1
  264. data/db/migrate/20200117133200_change_revision_appearance_option_default_and_null.rb +2 -1
  265. data/db/migrate/20200122115400_create_pageflow_entry_templates.rb +25 -25
  266. data/db/migrate/20200206134400_convert_legacy_scrolled_content_element_types.rb +3 -3
  267. data/db/migrate/20221215120856_associate_entry_templates_with_sites.rb +2 -2
  268. data/db/migrate/20230120092923_create_other_files.rb +2 -1
  269. data/db/migrate/20230419083307_create_pageflow_entry_translation_group.rb +9 -0
  270. data/db/migrate/20240612110434_add_cutoff_mode_name_to_sites.rb +5 -0
  271. data/db/migrate/20240918084059_create_pageflow_permalink_redirects.rb +14 -0
  272. data/db/migrate/20250508172234_ensure_scrolled_entries_have_main_storyline.rb +14 -0
  273. data/db/migrate/20250617090048_add_custom404_entry_to_sites.rb +5 -0
  274. data/db/migrate/20250617100000_add_perma_id_counter_to_entries.rb +28 -0
  275. data/db/migrate/20250722174123_add_perma_id_to_chapters.rb +10 -0
  276. data/db/migrate/20250725080603_add_perma_id_indexes_to_revision_components.rb +13 -0
  277. data/db/migrate/20250726000000_add_display_name_to_file_usages.rb +5 -0
  278. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +3912 -1486
  279. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +468 -1161
  280. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +28125 -22
  281. data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +26589 -19
  282. data/entry_types/paged/app/controllers/pageflow_paged/entries_controller.rb +1 -0
  283. data/entry_types/paged/app/helpers/pageflow_paged/page_background_asset_helper.rb +1 -1
  284. data/entry_types/paged/app/helpers/pageflow_paged/third_party_embed_consent_helper.rb +7 -7
  285. data/entry_types/paged/app/views/pageflow_paged/editor/entries/_seed.json.jbuilder +1 -0
  286. data/entry_types/paged/app/views/pageflow_paged/entries/show.html.erb +1 -0
  287. data/entry_types/paged/lib/pageflow_paged/plugin.rb +4 -0
  288. data/entry_types/paged/lib/pageflow_paged/react/page_type.rb +1 -1
  289. data/entry_types/paged/lib/pageflow_paged/react/widget_type.rb +3 -3
  290. data/entry_types/paged/lib/pageflow_paged.rb +1 -1
  291. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/chapters_controller.rb +5 -3
  292. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +2 -2
  293. data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +2 -2
  294. data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +2 -1
  295. data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +2 -2
  296. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +1 -0
  297. data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +2 -1
  298. data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +60 -6
  299. data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +16 -2
  300. data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +21 -23
  301. data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +16 -1
  302. data/entry_types/scrolled/app/models/pageflow_scrolled/chapter.rb +15 -14
  303. data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +12 -0
  304. data/entry_types/scrolled/app/models/pageflow_scrolled/section.rb +12 -1
  305. data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +19 -1
  306. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/entries/_head.html.erb +1 -0
  307. data/entry_types/scrolled/app/views/pageflow_scrolled/editor/sections/_section_with_content_elements.json.jbuilder +2 -2
  308. data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +2 -0
  309. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +17 -9
  310. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry_translations.json.jbuilder +14 -0
  311. data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +25 -5
  312. data/entry_types/scrolled/app/views/pageflow_scrolled/storylines/_storyline.json.jbuilder +7 -0
  313. data/entry_types/scrolled/config/locales/de.yml +614 -45
  314. data/entry_types/scrolled/config/locales/en.yml +586 -47
  315. data/entry_types/scrolled/config/routes.rb +18 -8
  316. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/install_generator.rb +11 -11
  317. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantDesktop.svg +56 -0
  318. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/theme/logoDarkVariantMobile.svg +22 -0
  319. data/entry_types/scrolled/lib/generators/pageflow_scrolled/install/templates/themes_plugin.rb.tt +26 -11
  320. data/entry_types/scrolled/lib/pageflow_scrolled/additional_packs.rb +27 -8
  321. data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +1 -1
  322. data/entry_types/scrolled/lib/pageflow_scrolled/additional_theme_assets.rb +27 -0
  323. data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +16 -4
  324. data/entry_types/scrolled/lib/pageflow_scrolled/content_element_consent_vendors.rb +1 -1
  325. data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +24 -4
  326. data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +24 -22
  327. data/entry_types/scrolled/lib/pageflow_scrolled.rb +1 -1
  328. data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +6 -5
  329. data/entry_types/scrolled/package/config/webpack.js +22 -0
  330. data/entry_types/scrolled/package/contentElements/hotspots-frontend.css +1 -0
  331. data/entry_types/scrolled/package/contentElements/hotspots-frontend.js +1529 -0
  332. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.css +1 -0
  333. data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.js +59 -0
  334. data/entry_types/scrolled/package/contentElements-editor.js +2075 -321
  335. data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
  336. data/entry_types/scrolled/package/contentElements-frontend.js +1019 -643
  337. data/entry_types/scrolled/package/editor.js +2086 -1091
  338. data/entry_types/scrolled/package/frontend/{EditableInlineText.module-ebd22921.js → FloatingPortalRootProvider-51914be7.js} +1200 -1258
  339. data/entry_types/scrolled/package/frontend/{PhonePlatformContext-4ec6b2de.js → PhonePlatformContext-9f76033e.js} +7 -8
  340. data/entry_types/scrolled/package/frontend/ThemeIcon-81f2f066.js +1932 -0
  341. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-788e9cdb.js +39 -0
  342. data/entry_types/scrolled/package/frontend/{Viewer-1bb5597c.js → Viewer-0345ce57.js} +36 -63
  343. data/entry_types/scrolled/package/frontend/{Viewer-1ecf3375.js → Viewer-cdc549cc.js} +15 -22
  344. data/entry_types/scrolled/package/frontend/{Wavesurfer-7d9cf1b7.js → Wavesurfer-1cdc3925.js} +54 -74
  345. data/entry_types/scrolled/package/frontend/{components-024a9893.js → components-96660ffd.js} +1791 -841
  346. data/entry_types/scrolled/package/frontend/{index-11f32f10.js → index-eb670c2f.js} +11 -18
  347. data/entry_types/scrolled/package/frontend/index.css +1 -1
  348. data/entry_types/scrolled/package/frontend/index.js +517 -903
  349. data/entry_types/scrolled/package/frontend/{createSuper-d0f30da3.js → inherits-539844a6.js} +40 -56
  350. data/entry_types/scrolled/package/frontend/{useContentElementEditorState-4f4c3cf6.js → useContentElementEditorState-77fe6c79.js} +7 -8
  351. data/entry_types/scrolled/package/frontend/usePhonePlatform-c2ba875d.js +8 -0
  352. data/entry_types/scrolled/package/frontend-server.js +0 -1
  353. data/entry_types/scrolled/package/package.json +18 -10
  354. data/entry_types/scrolled/package/testHelpers.js +306 -70
  355. data/entry_types/scrolled/package/values/widgets.module.css +18 -0
  356. data/entry_types/scrolled/package/widgets/consentBar.css +1 -1
  357. data/entry_types/scrolled/package/widgets/consentBar.js +47 -66
  358. data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
  359. data/entry_types/scrolled/package/widgets/defaultNavigation.js +177 -207
  360. data/entry_types/scrolled/package/widgets/excursionDialog.css +1 -0
  361. data/entry_types/scrolled/package/widgets/excursionDialog.js +109 -0
  362. data/entry_types/scrolled/package/widgets/excursionSheet.css +1 -0
  363. data/entry_types/scrolled/package/widgets/excursionSheet.js +262 -0
  364. data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -1
  365. data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +6 -9
  366. data/entry_types/scrolled/package/widgets/iconScrollIndicator.css +1 -0
  367. data/entry_types/scrolled/package/widgets/iconScrollIndicator.js +48 -0
  368. data/entry_types/scrolled/package/widgets/mainStorylineSheet.css +1 -0
  369. data/entry_types/scrolled/package/widgets/mainStorylineSheet.js +144 -0
  370. data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -1
  371. data/entry_types/scrolled/package/widgets/textInlineFileRights.js +26 -9
  372. data/entry_types/scrolled/package/widgets-server.js +1 -0
  373. data/entry_types/scrolled/spec/factories/chapters.rb +14 -1
  374. data/entry_types/scrolled/spec/factories/content_elements.rb +1 -1
  375. data/lib/generators/pageflow/active_admin_initializer/active_admin_initializer_generator.rb +5 -3
  376. data/lib/generators/pageflow/assets/assets_generator.rb +7 -5
  377. data/lib/generators/pageflow/cancan/cancan_generator.rb +2 -1
  378. data/lib/generators/pageflow/cancan/templates/ability.rb +1 -1
  379. data/lib/generators/pageflow/error_pages/error_pages_generator.rb +2 -1
  380. data/lib/generators/pageflow/initializer/initializer_generator.rb +3 -2
  381. data/lib/generators/pageflow/install/install_generator.rb +2 -2
  382. data/lib/generators/pageflow/procfile/procfile_generator.rb +2 -1
  383. data/lib/generators/pageflow/resque/resque_generator.rb +6 -4
  384. data/lib/generators/pageflow/resque/templates/resque.rake +1 -1
  385. data/lib/generators/pageflow/routes/routes_generator.rb +4 -2
  386. data/lib/generators/pageflow/seeds/seeds_generator.rb +3 -2
  387. data/lib/generators/pageflow/seeds/templates/seeds.rb +6 -6
  388. data/lib/generators/pageflow/theme/theme_generator.rb +2 -1
  389. data/lib/generators/pageflow/user/user_generator.rb +2 -1
  390. data/lib/pageflow/ability_mixin.rb +25 -15
  391. data/lib/pageflow/active_admin_patches/views/attributes_table.rb +1 -0
  392. data/lib/pageflow/active_admin_patches/views/pages/base.rb +3 -2
  393. data/lib/pageflow/active_admin_patches/views/table_for.rb +1 -0
  394. data/lib/pageflow/additional_headers.rb +27 -0
  395. data/lib/pageflow/admin/attributes_table_rows.rb +3 -3
  396. data/lib/pageflow/admin/tabs.rb +1 -1
  397. data/lib/pageflow/built_in_file_type.rb +1 -1
  398. data/lib/pageflow/built_in_page_types_plugin.rb +1 -1
  399. data/lib/pageflow/built_in_widget_type.rb +2 -2
  400. data/lib/pageflow/built_in_widget_types_plugin.rb +2 -1
  401. data/lib/pageflow/configuration.rb +141 -18
  402. data/lib/pageflow/cutoff_modes.rb +39 -0
  403. data/lib/pageflow/editor_controller.rb +6 -10
  404. data/lib/pageflow/engine.rb +4 -5
  405. data/lib/pageflow/entry_export_import/attachment_files.rb +1 -1
  406. data/lib/pageflow/entry_export_import/entry_serialization.rb +5 -4
  407. data/lib/pageflow/entry_export_import/file_mappings.rb +1 -0
  408. data/lib/pageflow/entry_export_import/revision_serialization/import.rb +1 -1
  409. data/lib/pageflow/entry_export_import.rb +3 -3
  410. data/lib/pageflow/entry_types.rb +2 -2
  411. data/lib/pageflow/feature.rb +1 -1
  412. data/lib/pageflow/features.rb +4 -6
  413. data/lib/pageflow/file_importers.rb +4 -4
  414. data/lib/pageflow/file_type.rb +3 -3
  415. data/lib/pageflow/file_types.rb +3 -3
  416. data/lib/pageflow/global_config_api.rb +5 -6
  417. data/lib/pageflow/help_entries.rb +7 -7
  418. data/lib/pageflow/help_entry.rb +1 -1
  419. data/lib/pageflow/hooks.rb +1 -1
  420. data/lib/pageflow/nested_revision_component.rb +9 -27
  421. data/lib/pageflow/news_item_api.rb +1 -1
  422. data/lib/pageflow/page_type.rb +2 -3
  423. data/lib/pageflow/page_types.rb +3 -3
  424. data/lib/pageflow/paperclip_interpolations/support.rb +1 -1
  425. data/lib/pageflow/paperclip_processors/vtt.rb +1 -0
  426. data/lib/pageflow/paperclip_processors/webp.rb +2 -2
  427. data/lib/pageflow/partial_editor_fragment_renderer.rb +2 -2
  428. data/lib/pageflow/plugin.rb +1 -2
  429. data/lib/pageflow/quota.rb +9 -5
  430. data/lib/pageflow/quotas.rb +1 -1
  431. data/lib/pageflow/rails_version.rb +1 -0
  432. data/lib/pageflow/react.rb +1 -1
  433. data/lib/pageflow/revision_component.rb +8 -40
  434. data/lib/pageflow/revision_components.rb +16 -6
  435. data/lib/pageflow/seeds.rb +12 -16
  436. data/lib/pageflow/theme.rb +1 -1
  437. data/lib/pageflow/theme_customizations.rb +10 -10
  438. data/lib/pageflow/themes.rb +3 -3
  439. data/lib/pageflow/user_mixin.rb +6 -6
  440. data/lib/pageflow/version.rb +1 -1
  441. data/lib/pageflow/widget_type.rb +4 -4
  442. data/lib/pageflow/widget_types.rb +9 -9
  443. data/lib/pageflow/zencoder_api.rb +32 -42
  444. data/lib/pageflow/zencoder_audio_output_definition.rb +14 -13
  445. data/lib/pageflow/zencoder_meta_data_output_definition.rb +3 -2
  446. data/lib/pageflow/zencoder_output_definition.rb +16 -14
  447. data/lib/pageflow/zencoder_video_output_definition.rb +140 -88
  448. data/lib/pageflow.rb +7 -2
  449. data/lib/tasks/pageflow_tasks.rake +1 -1
  450. data/package/editor.js +954 -868
  451. data/package/frontend.js +113 -387
  452. data/package/package.json +2 -1
  453. data/package/testHelpers.js +10 -56
  454. data/package/ui.js +209 -251
  455. data/spec/factories/accounts.rb +37 -22
  456. data/spec/factories/audio_files.rb +2 -2
  457. data/spec/factories/authentication_tokens.rb +4 -4
  458. data/spec/factories/chapters.rb +4 -4
  459. data/spec/factories/draft_entries.rb +14 -6
  460. data/spec/factories/edit_locks.rb +1 -1
  461. data/spec/factories/entries.rb +28 -19
  462. data/spec/factories/entry_translation_groups.rb +6 -0
  463. data/spec/factories/file_usages.rb +2 -1
  464. data/spec/factories/folders.rb +1 -1
  465. data/spec/factories/image_files.rb +2 -2
  466. data/spec/factories/pages.rb +3 -3
  467. data/spec/factories/published_entries.rb +26 -8
  468. data/spec/factories/revisions.rb +1 -1
  469. data/spec/factories/sites.rb +6 -0
  470. data/spec/factories/test_multi_attachment_files.rb +1 -1
  471. data/spec/factories/text_track_files.rb +1 -1
  472. data/spec/factories/uploadable_files.rb +1 -1
  473. data/spec/factories/users.rb +6 -6
  474. data/spec/factories/video_files.rb +2 -2
  475. data/spec/factories/widgets.rb +1 -1
  476. data/spec/fixtures/7x15_rotated.jpg +0 -0
  477. data/vendor/assets/javascripts/wysihtml-toolbar.js +19288 -0
  478. metadata +98 -45
  479. data/config/initializers/revision_components.rb +0 -5
  480. data/config/locales/twitter_to_x.de.yml +0 -6
  481. data/config/locales/twitter_to_x.en.yml +0 -6
  482. data/entry_types/scrolled/config/locales/twitter_to_x.de.yml +0 -12
  483. data/entry_types/scrolled/config/locales/twitter_to_x.en.yml +0 -12
  484. data/entry_types/scrolled/config/locales/vr_image_projection.de.yml +0 -24
  485. data/entry_types/scrolled/config/locales/vr_image_projection.en.yml +0 -24
  486. data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-b79159cc.js +0 -107
  487. data/entry_types/scrolled/package/frontend/arrowRight-62998af9.js +0 -77
  488. data/entry_types/scrolled/package/frontend/i18n-ce13a8bf.js +0 -1129
data/package/frontend.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import 'core-js/modules/es.array.from';
2
2
  import 'core-js/modules/es.array.includes';
3
+ import 'core-js/modules/es.array.iterator';
3
4
  import 'core-js/modules/es.object.assign';
4
5
  import 'core-js/modules/es.object.entries';
5
6
  import 'core-js/modules/es.object.keys';
@@ -148,17 +149,13 @@ function _slicedToArray(arr, i) {
148
149
  var Persistence = /*#__PURE__*/function () {
149
150
  function Persistence(_ref) {
150
151
  var cookies = _ref.cookies;
151
-
152
152
  _classCallCheck(this, Persistence);
153
-
154
153
  this.cookies = cookies;
155
154
  }
156
-
157
155
  _createClass(Persistence, [{
158
156
  key: "store",
159
157
  value: function store(vendors, signal) {
160
158
  var _this = this;
161
-
162
159
  var vendorsByCookieName = vendors.reduce(function (sorted, vendor) {
163
160
  var cookieName = vendor.cookieName;
164
161
  sorted[cookieName] = sorted[cookieName] || [];
@@ -167,11 +164,9 @@ var Persistence = /*#__PURE__*/function () {
167
164
  }, {});
168
165
  Object.entries(vendorsByCookieName).forEach(function (_ref2) {
169
166
  var _ref3 = _slicedToArray(_ref2, 2),
170
- cookieName = _ref3[0],
171
- vendors = _ref3[1];
172
-
167
+ cookieName = _ref3[0],
168
+ vendors = _ref3[1];
173
169
  var cookieDomain = vendors[0].cookieDomain;
174
-
175
170
  _this.setCookie(cookieName, JSON.stringify(vendors.reduce(function (result, vendor) {
176
171
  result[vendor.cookieKey || vendor.name] = signal === 'accepted' ? true : signal === 'denied' ? false : signal[vendor.name];
177
172
  return result;
@@ -199,7 +194,6 @@ var Persistence = /*#__PURE__*/function () {
199
194
  if (domain && !window.location.hostname.match(new RegExp("".concat(domain, "$")))) {
200
195
  domain = null;
201
196
  }
202
-
203
197
  this.cookies.setItem(name, value, {
204
198
  path: '/',
205
199
  domain: domain,
@@ -210,7 +204,6 @@ var Persistence = /*#__PURE__*/function () {
210
204
  });
211
205
  }
212
206
  }]);
213
-
214
207
  return Persistence;
215
208
  }();
216
209
 
@@ -219,9 +212,8 @@ var cookies = {
219
212
  getItem: function getItem(sKey) {
220
213
  if (!sKey) {
221
214
  return null;
222
- } // eslint-disable-next-line no-useless-escape
223
-
224
-
215
+ }
216
+ // eslint-disable-next-line no-useless-escape
225
217
  return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
226
218
  },
227
219
  setItem: function setItem() {
@@ -232,26 +224,22 @@ var cookies = {
232
224
  if (!this.hasItem(sKey)) {
233
225
  return false;
234
226
  }
235
-
236
227
  document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "");
237
228
  return true;
238
229
  },
239
230
  hasItem: function hasItem(sKey) {
240
231
  if (!sKey) {
241
232
  return false;
242
- } // eslint-disable-next-line no-useless-escape
243
-
244
-
233
+ }
234
+ // eslint-disable-next-line no-useless-escape
245
235
  return new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=").test(document.cookie);
246
236
  },
247
237
  keys: function keys() {
248
238
  // eslint-disable-next-line no-useless-escape
249
239
  var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
250
-
251
240
  for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) {
252
241
  aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]);
253
242
  }
254
-
255
243
  return aKeys;
256
244
  }
257
245
  };
@@ -267,31 +255,26 @@ function setItemCookieString(key, value, expiresOrOptions, path, domain, secure)
267
255
  });
268
256
  }
269
257
  }
270
-
271
258
  function setItemCookieStringWithOptions(key, value, _ref) {
272
259
  var expires = _ref.expires,
273
- path = _ref.path,
274
- domain = _ref.domain,
275
- secure = _ref.secure,
276
- sameSite = _ref.sameSite;
260
+ path = _ref.path,
261
+ domain = _ref.domain,
262
+ secure = _ref.secure,
263
+ sameSite = _ref.sameSite;
277
264
  var expiresPart = "";
278
-
279
265
  if (expires) {
280
266
  switch (expires.constructor) {
281
267
  case Number:
282
268
  expiresPart = expires === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + expires;
283
269
  break;
284
-
285
270
  case String:
286
271
  expiresPart = "; expires=" + expires;
287
272
  break;
288
-
289
273
  case Date:
290
274
  expiresPart = "; expires=" + expires.toUTCString();
291
275
  break;
292
276
  }
293
277
  }
294
-
295
278
  return encodeURIComponent(key) + "=" + encodeURIComponent(value) + expiresPart + (domain ? "; domain=" + domain : "") + (path ? "; path=" + path : "") + (sameSite ? "; SameSite=" + sameSite : "") + (secure ? "; Secure" : "");
296
279
  }
297
280
 
@@ -299,12 +282,9 @@ var supportedParadigms = ['external opt-out', 'opt-in', 'lazy opt-in', 'skip'];
299
282
  var Consent = /*#__PURE__*/function () {
300
283
  function Consent(_ref) {
301
284
  var _this = this;
302
-
303
285
  var cookies = _ref.cookies,
304
- inEditor = _ref.inEditor;
305
-
286
+ inEditor = _ref.inEditor;
306
287
  _classCallCheck(this, Consent);
307
-
308
288
  this.requestedPromise = new Promise(function (resolve) {
309
289
  _this.requestedPromiseResolve = resolve;
310
290
  });
@@ -315,29 +295,24 @@ var Consent = /*#__PURE__*/function () {
315
295
  this.emitter = _objectSpread2({}, BackboneEvents);
316
296
  this.inEditor = inEditor;
317
297
  }
318
-
319
298
  _createClass(Consent, [{
320
299
  key: "registerVendor",
321
300
  value: function registerVendor(name, _ref2) {
322
301
  var displayName = _ref2.displayName,
323
- description = _ref2.description,
324
- paradigm = _ref2.paradigm,
325
- cookieName = _ref2.cookieName,
326
- cookieKey = _ref2.cookieKey,
327
- cookieDomain = _ref2.cookieDomain;
328
-
302
+ description = _ref2.description,
303
+ paradigm = _ref2.paradigm,
304
+ cookieName = _ref2.cookieName,
305
+ cookieKey = _ref2.cookieKey,
306
+ cookieDomain = _ref2.cookieDomain;
329
307
  if (this.vendorRegistrationClosed) {
330
308
  throw new Error("Vendor ".concat(name, " has been registered after ") + 'registration has been closed.');
331
309
  }
332
-
333
310
  if (!name.match(/^[a-z0-9-_]+$/i)) {
334
311
  throw new Error("Invalid vendor name '".concat(name, "'. ") + 'Only letters, numbers, hyphens and underscores are allowed.');
335
312
  }
336
-
337
313
  if (supportedParadigms.indexOf(paradigm) < 0) {
338
314
  throw new Error("unknown paradigm ".concat(paradigm));
339
315
  }
340
-
341
316
  this.vendors.push({
342
317
  displayName: displayName,
343
318
  description: description,
@@ -352,30 +327,24 @@ var Consent = /*#__PURE__*/function () {
352
327
  key: "closeVendorRegistration",
353
328
  value: function closeVendorRegistration() {
354
329
  var _this2 = this;
355
-
356
330
  this.vendorRegistrationClosed = true;
357
-
358
331
  if (!this.getUndecidedOptInVendors().length) {
359
332
  this.triggerDecisionEvents();
360
333
  return;
361
334
  }
362
-
363
335
  var vendors = this.getRequestedVendors();
364
336
  this.requestedPromiseResolve({
365
337
  vendors: this.withState(vendors),
366
338
  acceptAll: function acceptAll() {
367
339
  _this2.persistence.store(vendors, 'accepted');
368
-
369
340
  _this2.triggerDecisionEvents();
370
341
  },
371
342
  denyAll: function denyAll() {
372
343
  _this2.persistence.store(vendors, 'denied');
373
-
374
344
  _this2.triggerDecisionEvents();
375
345
  },
376
346
  save: function save(vendorConsent) {
377
347
  _this2.persistence.store(vendors, vendorConsent);
378
-
379
348
  _this2.triggerDecisionEvents();
380
349
  }
381
350
  });
@@ -384,10 +353,8 @@ var Consent = /*#__PURE__*/function () {
384
353
  key: "relevantVendors",
385
354
  value: function relevantVendors() {
386
355
  var _this3 = this;
387
-
388
356
  var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
389
- additionalVendorNames = _ref3.include;
390
-
357
+ additionalVendorNames = _ref3.include;
391
358
  return this.withState(this.vendors.filter(function (vendor) {
392
359
  return (additionalVendorNames === null || additionalVendorNames === void 0 ? void 0 : additionalVendorNames.includes(vendor.name)) || vendor.paradigm === 'opt-in' || vendor.paradigm === 'external opt-out' || vendor.paradigm === 'lazy opt-in' && _this3.persistence.read(vendor) !== 'undecided';
393
360
  }), {
@@ -398,13 +365,10 @@ var Consent = /*#__PURE__*/function () {
398
365
  key: "require",
399
366
  value: function require(vendorName) {
400
367
  var _this4 = this;
401
-
402
368
  if (this.inEditor) {
403
369
  return Promise.resolve('fulfilled');
404
370
  }
405
-
406
371
  var vendor = this.findVendor(vendorName, 'require consent for');
407
-
408
372
  switch (vendor.paradigm) {
409
373
  case 'opt-in':
410
374
  case 'lazy opt-in':
@@ -413,29 +377,23 @@ var Consent = /*#__PURE__*/function () {
413
377
  _this4.emitter.once("".concat(vendor.name, ":accepted"), function () {
414
378
  return resolve('fulfilled');
415
379
  });
416
-
417
380
  _this4.emitter.once("".concat(vendor.name, ":denied"), function () {
418
381
  return resolve('failed');
419
382
  });
420
383
  });
421
384
  }
422
-
423
385
  if (this.persistence.read(vendor) === 'accepted') {
424
386
  return Promise.resolve('fulfilled');
425
387
  } else {
426
388
  return Promise.resolve('failed');
427
389
  }
428
-
429
390
  case 'external opt-out':
430
391
  if (this.persistence.read(vendor) === 'denied') {
431
392
  return Promise.resolve('failed');
432
393
  }
433
-
434
394
  return Promise.resolve('fulfilled');
435
-
436
395
  case 'skip':
437
396
  return Promise.resolve('fulfilled');
438
-
439
397
  default:
440
398
  // should not be used
441
399
  return null;
@@ -445,13 +403,10 @@ var Consent = /*#__PURE__*/function () {
445
403
  key: "requireAccepted",
446
404
  value: function requireAccepted(vendorName) {
447
405
  var _this5 = this;
448
-
449
406
  if (this.inEditor) {
450
407
  return Promise.resolve('fulfilled');
451
408
  }
452
-
453
409
  var vendor = this.findVendor(vendorName, 'require consent for');
454
-
455
410
  if (vendor.paradigm === 'opt-in' || vendor.paradigm === 'lazy opt-in') {
456
411
  if (this.getUndecidedOptInVendors().length || this.persistence.read(vendor) !== 'accepted') {
457
412
  return new Promise(function (resolve) {
@@ -460,7 +415,6 @@ var Consent = /*#__PURE__*/function () {
460
415
  });
461
416
  });
462
417
  }
463
-
464
418
  return Promise.resolve('fulfilled');
465
419
  } else {
466
420
  return this.require(vendorName);
@@ -495,7 +449,6 @@ var Consent = /*#__PURE__*/function () {
495
449
  key: "getUndecidedOptInVendors",
496
450
  value: function getUndecidedOptInVendors() {
497
451
  var _this6 = this;
498
-
499
452
  return this.vendors.filter(function (vendor) {
500
453
  return vendor.paradigm === 'opt-in' && _this6.persistence.read(vendor) === 'undecided';
501
454
  });
@@ -504,7 +457,6 @@ var Consent = /*#__PURE__*/function () {
504
457
  key: "triggerDecisionEvents",
505
458
  value: function triggerDecisionEvents() {
506
459
  var _this7 = this;
507
-
508
460
  this.vendors.filter(function (vendor) {
509
461
  return vendor.paradigm !== 'skip';
510
462
  }).forEach(function (vendor) {
@@ -517,24 +469,19 @@ var Consent = /*#__PURE__*/function () {
517
469
  var vendor = this.vendors.find(function (vendor) {
518
470
  return vendor.name === vendorName;
519
471
  });
520
-
521
472
  if (!vendor) {
522
473
  throw new Error("Cannot ".concat(actionForErrorMessage, " unknown vendor \"").concat(vendorName, "\". ") + 'Consider using consent.registerVendor.');
523
474
  }
524
-
525
475
  return vendor;
526
476
  }
527
477
  }, {
528
478
  key: "withState",
529
479
  value: function withState(vendors) {
530
480
  var _this8 = this;
531
-
532
481
  var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
533
- applyDefaults = _ref4.applyDefaults;
534
-
482
+ applyDefaults = _ref4.applyDefaults;
535
483
  return vendors.map(function (vendor) {
536
484
  var state = _this8.persistence.read(vendor);
537
-
538
485
  return _objectSpread2(_objectSpread2({}, vendor), {}, {
539
486
  state: state === 'undecided' && applyDefaults ? _this8.getDefaultState(vendor) : state
540
487
  });
@@ -546,14 +493,11 @@ var Consent = /*#__PURE__*/function () {
546
493
  if (vendor.paradigm === 'external opt-out') {
547
494
  return 'accepted';
548
495
  }
549
-
550
496
  return 'undecided';
551
497
  }
552
498
  }]);
553
-
554
499
  return Consent;
555
500
  }();
556
-
557
501
  Consent.create = function () {
558
502
  var inEditor = typeof PAGEFLOW_EDITOR !== 'undefined' && PAGEFLOW_EDITOR;
559
503
  return new Consent({
@@ -617,19 +561,27 @@ var Agent = function Agent(userAgent) {
617
561
  // - Edge also reports to be a Safari, but also reports to be Chrome
618
562
  return matches(/Safari\//i) && !matches(/Chrome/i);
619
563
  },
620
-
621
564
  /**
622
565
  * Returns true on iOS Safari.
623
566
  * @return {boolean}
624
567
  */
625
568
  matchesMobileSafari: function matchesMobileSafari() {
626
- var matchers = [/iPod/i, /iPad/i, /iPhone/i];
627
- return matchers.some(function (matcher) {
628
- return userAgent.match(matcher);
629
- }) && !window.MSStream || //IE exclusion from being detected as an iOS device;
630
- matchesiPadSafari13AndAbove();
569
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
570
+ osVersions = _ref.osVersions;
571
+ var deviceMatchers = [/iPod/i, /iPad/i, /iPhone/i];
572
+ if (osVersions) {
573
+ return deviceMatchers.some(function (matcher) {
574
+ return userAgent.match(matcher);
575
+ }) && osVersions.some(function (osVersion) {
576
+ return userAgent.includes(osVersion.replace('.', '_'));
577
+ });
578
+ } else {
579
+ return matchesiPadSafari13AndAbove() || deviceMatchers.some(function (matcher) {
580
+ return userAgent.match(matcher);
581
+ }) && !window.MSStream // IE exclusion from being detected as an iOS device;
582
+ ;
583
+ }
631
584
  },
632
-
633
585
  /**
634
586
  * Returns true on Android.
635
587
  * @return {boolean}
@@ -637,7 +589,6 @@ var Agent = function Agent(userAgent) {
637
589
  matchesAndroid: function matchesAndroid() {
638
590
  return matches(/Android/i);
639
591
  },
640
-
641
592
  /**
642
593
  * Returns true on iOS or Android.
643
594
  * @return {boolean}
@@ -648,7 +599,6 @@ var Agent = function Agent(userAgent) {
648
599
  return userAgent.match(matcher);
649
600
  }) || matchesiPadSafari13AndAbove();
650
601
  },
651
-
652
602
  /**
653
603
  * Returns true on Internet Explorser version 9, 10 and 11.
654
604
  * @return {boolean}
@@ -656,7 +606,6 @@ var Agent = function Agent(userAgent) {
656
606
  matchesIEUpTo11: function matchesIEUpTo11() {
657
607
  return userAgent.match(/Trident\//);
658
608
  },
659
-
660
609
  /**
661
610
  * Returns true in InApp browser of Facebook app.
662
611
  * @return {boolean}
@@ -685,7 +634,6 @@ var Agent = function Agent(userAgent) {
685
634
  return this.matchesEdge() && !this.matchesMobilePlatform();
686
635
  }
687
636
  },
688
-
689
637
  /**
690
638
  * Returns true on Google Chrome.
691
639
  * @return {boolean}
@@ -694,7 +642,6 @@ var Agent = function Agent(userAgent) {
694
642
  // - Edge also reports to be a Chrome
695
643
  return matches(/Chrome\//i) && !matches(/Edg/i);
696
644
  },
697
-
698
645
  /**
699
646
  * Returns true on Firefox.
700
647
  * @return {boolean}
@@ -702,7 +649,6 @@ var Agent = function Agent(userAgent) {
702
649
  matchesFirefox: function matchesFirefox() {
703
650
  return matches(/Firefox\//i) && !matches(/Seamonkey/i);
704
651
  },
705
-
706
652
  /**
707
653
  * Returns true on Microsoft Edge.
708
654
  * @return {boolean}
@@ -711,21 +657,19 @@ var Agent = function Agent(userAgent) {
711
657
  return matches(/Edg\//i);
712
658
  }
713
659
  };
714
-
715
660
  function matches(exp) {
716
661
  return !!userAgent.match(exp);
717
662
  }
718
-
719
663
  function matchesMinVersion(exp, version) {
720
664
  var match = userAgent.match(exp);
721
665
  return match && match[1] && parseInt(match[1], 10) >= version;
722
- } //After ios13 update, iPad reports the same user string
666
+ }
667
+
668
+ //After ios13 update, iPad reports the same user string
723
669
  //as Safari on Dekstop MacOS.
724
670
  //At the time of this writing there are no other devices
725
671
  //with multi-touch support other than IOS/iPadOS
726
672
  //See: https://stackoverflow.com/a/58064481
727
-
728
-
729
673
  function matchesiPadSafari13AndAbove() {
730
674
  return agent.matchesSafari() && navigator.maxTouchPoints > 1 && navigator.platform === 'MacIntel';
731
675
  }
@@ -737,11 +681,10 @@ var agent = new Agent(typeof navigator !== 'undefined' ? navigator.userAgent : '
737
681
  *
738
682
  * @since 0.9
739
683
  */
740
-
741
684
  var browser = function () {
742
685
  var tests = {},
743
- results = {},
744
- featureDetectionComplete = false;
686
+ results = {},
687
+ featureDetectionComplete = false;
745
688
  var readyPromiseResolve;
746
689
  var readyPromise = new Promise(function (resolve, reject) {
747
690
  readyPromiseResolve = resolve;
@@ -750,7 +693,6 @@ var browser = function () {
750
693
  off: {},
751
694
  on: {},
752
695
  unset: {},
753
-
754
696
  /**
755
697
  * Add a feature test.
756
698
  *
@@ -761,31 +703,26 @@ var browser = function () {
761
703
  */
762
704
  feature: function feature(name, test) {
763
705
  var s = name.replace(/ /g, '_');
764
-
765
706
  this.off[s] = function () {
766
707
  window.localStorage['override ' + name] = 'off';
767
708
  log('Feature off: ' + name, {
768
709
  force: true
769
710
  });
770
711
  };
771
-
772
712
  this.on[s] = function () {
773
713
  window.localStorage['override ' + name] = 'on';
774
714
  log('Feature on: ' + name, {
775
715
  force: true
776
716
  });
777
717
  };
778
-
779
718
  this.unset[s] = function () {
780
719
  window.localStorage.removeItem('override ' + name);
781
720
  log('Feature unset: ' + name, {
782
721
  force: true
783
722
  });
784
723
  };
785
-
786
724
  tests[name] = test;
787
725
  },
788
-
789
726
  /**
790
727
  * Check whether the browser has a specific feature. This method
791
728
  * may only be called after the `#ready` promise is resolved.
@@ -798,14 +735,11 @@ var browser = function () {
798
735
  if (!featureDetectionComplete) {
799
736
  throw 'Feature detection has not finished yet.';
800
737
  }
801
-
802
738
  if (results[name] === undefined) {
803
739
  throw 'Unknown feature "' + name + '".';
804
740
  }
805
-
806
741
  return results[name];
807
742
  },
808
-
809
743
  /**
810
744
  * A promise that is resolved once feature detection has finished.
811
745
  *
@@ -815,16 +749,13 @@ var browser = function () {
815
749
  ready: function ready() {
816
750
  return readyPromise;
817
751
  },
818
-
819
752
  /** @api private */
820
753
  detectFeatures: function detectFeatures() {
821
754
  var promises = {};
822
-
823
755
  var asyncHas = function asyncHas(name) {
824
756
  var runTest = function runTest() {
825
757
  var value,
826
- underscoredName = name.replace(/ /g, '_');
827
-
758
+ underscoredName = name.replace(/ /g, '_');
828
759
  if (debugMode() && location.href.indexOf('&has=' + underscoredName) >= 0) {
829
760
  value = location.href.indexOf('&has=' + underscoredName + '_on') >= 0;
830
761
  log('FEATURE OVERRIDDEN ' + name + ': ' + value, {
@@ -841,27 +772,24 @@ var browser = function () {
841
772
  return tests[name](asyncHas);
842
773
  }
843
774
  };
844
-
845
775
  promises[name] = promises[name] || Promise.all([runTest()]).then(function (a) {
846
776
  return a[0];
847
777
  });
848
778
  return promises[name];
849
779
  };
850
-
851
780
  asyncHas.not = function (name) {
852
781
  return asyncHas(name).then(function (result) {
853
782
  return !result;
854
783
  });
855
784
  };
856
-
857
- asyncHas.all = function () {
785
+ asyncHas.all = function /* arguments */
786
+ () {
858
787
  return Promise.all(arguments).then(function (results) {
859
788
  return results.every(function (result) {
860
789
  return result;
861
790
  });
862
791
  });
863
792
  };
864
-
865
793
  Promise.all(Object.keys(tests).map(function (name) {
866
794
  return asyncHas(name).then(function (result) {
867
795
  var cssClassName = name.replace(/ /g, '_');
@@ -878,32 +806,36 @@ var browser = function () {
878
806
  };
879
807
  }();
880
808
 
809
+ browser.feature('broken ogg support', function () {
810
+ // ogg is not supported on iOS < 18.4 and broken on iOS 18.4
811
+ return agent.matchesMobileSafari();
812
+ });
813
+
881
814
  browser.feature('autoplay support', function (has) {
882
815
  return !agent.matchesSafari11AndAbove() && !agent.matchesMobilePlatform();
883
816
  });
884
817
 
818
+ // See https://developer.mozilla.org/de/docs/Web/CSS/CSS_Animations/Detecting_CSS_animation_support
819
+
885
820
  browser.feature('css animations', function () {
886
821
  var prefixes = ['Webkit', 'Moz', 'O', 'ms', 'Khtml'],
887
- elm = document.createElement('div');
888
-
822
+ elm = document.createElement('div');
889
823
  if (elm.style.animationName !== undefined) {
890
824
  return true;
891
825
  }
892
-
893
826
  for (var i = 0; i < prefixes.length; i++) {
894
827
  if (elm.style[prefixes[i] + 'AnimationName'] !== undefined) {
895
828
  return true;
896
829
  }
897
830
  }
898
-
899
831
  return false;
900
832
  });
901
833
 
834
+ // Facebook app displays a toolbar at the bottom of the screen on iOS
902
835
  // phone which hides parts of the browser viewport. Normally this is
903
836
  // hidden once the user scrolls, but since there is no native
904
837
  // scrolling in Pageflow, the bar stays and hides page elements like
905
838
  // the slim player controls.
906
-
907
839
  browser.feature('facebook toolbar', function (has) {
908
840
  return has.all(has('iphone platform'), agent.matchesFacebookInAppBrowser());
909
841
  });
@@ -943,10 +875,8 @@ browser.feature('request animation frame support', function () {
943
875
  });
944
876
 
945
877
  browser.feature('touch support', function () {
946
- return 'ontouchstart' in window ||
947
- /* Firefox on android */
948
- window.DocumentTouch && document instanceof window.DocumentTouch ||
949
- /* > 0 on IE touch devices */
878
+ return 'ontouchstart' in window || /* Firefox on android */
879
+ window.DocumentTouch && document instanceof window.DocumentTouch || /* > 0 on IE touch devices */
950
880
  navigator.maxTouchPoints;
951
881
  });
952
882
 
@@ -976,6 +906,16 @@ browser.feature('mse and native hls support', function (has) {
976
906
  browser.feature('native video player', function (has) {
977
907
  return has('iphone platform');
978
908
  });
909
+ browser.feature('video scaling bug fixed by load', function (has) {
910
+ // When reusing video elements for videos with different
911
+ // resolutions, Safari gets confused and scales videos incorrectly -
912
+ // drawing them to only cover a part of the element. This appears to
913
+ // not happen when the video is loaded or played immediately after
914
+ // changing the source. No longer reproducible in iOS 17.4.
915
+ return agent.matchesMobileSafari({
916
+ osVersions: ['17.0', '17.1', '17.2', '17.3']
917
+ });
918
+ });
979
919
 
980
920
  browser.feature('volume control support', function (has) {
981
921
  return has.not('ios platform');
@@ -995,28 +935,27 @@ browser.Agent = Agent;
995
935
  * @alias pageflow.features
996
936
  * @since 0.9
997
937
  */
998
-
999
938
  var Features = /*#__PURE__*/function () {
1000
939
  /** @lends pageflow.features */
1001
940
 
1002
941
  /** @api private */
1003
942
  function Features() {
1004
943
  _classCallCheck(this, Features);
1005
-
1006
944
  this.registry = {};
1007
945
  this.enabledFeatureNames = [];
1008
946
  }
947
+
1009
948
  /**
1010
949
  * `pageflow.features` has been renamed to `pageflow.browser`.
1011
950
  * @deprecated
1012
951
  */
1013
-
1014
-
1015
952
  _createClass(Features, [{
1016
953
  key: "has",
1017
- value: function has() {
954
+ value: function has( /* arguments */
955
+ ) {
1018
956
  return browser.has.apply(browser, arguments);
1019
957
  }
958
+
1020
959
  /**
1021
960
  * Register a function to configure a feature when it is active.
1022
961
  *
@@ -1026,7 +965,6 @@ var Features = /*#__PURE__*/function () {
1026
965
  * @param fn [Function] Function to call when the given feature
1027
966
  * is activate.
1028
967
  */
1029
-
1030
968
  }, {
1031
969
  key: "register",
1032
970
  value: function register(scope, name, fn) {
@@ -1034,20 +972,20 @@ var Features = /*#__PURE__*/function () {
1034
972
  this.registry[scope][name] = this.registry[scope][name] || [];
1035
973
  this.registry[scope][name].push(fn);
1036
974
  }
975
+
1037
976
  /**
1038
977
  * Check if a feature as been enabled.
1039
978
  *
1040
979
  * @param name [String]
1041
980
  * @return [Boolean]
1042
981
  */
1043
-
1044
982
  }, {
1045
983
  key: "isEnabled",
1046
984
  value: function isEnabled(name) {
1047
985
  return this.enabledFeatureNames.includes(name);
1048
986
  }
1049
- /** @api private */
1050
987
 
988
+ /** @api private */
1051
989
  }, {
1052
990
  key: "enable",
1053
991
  value: function enable(scope, names) {
@@ -1060,17 +998,15 @@ var Features = /*#__PURE__*/function () {
1060
998
  });
1061
999
  }
1062
1000
  }]);
1063
-
1064
1001
  return Features;
1065
1002
  }();
1066
1003
  var features = new Features();
1067
1004
 
1068
1005
  var handleFailedPlay = function handleFailedPlay(player, options) {
1069
1006
  var originalPlay = player.play;
1070
-
1071
- player.play = function () {
1007
+ player.play = function /* arguments */
1008
+ () {
1072
1009
  var result = originalPlay.apply(player, arguments);
1073
-
1074
1010
  if (result && typeof result["catch"] !== 'undefined') {
1075
1011
  return result["catch"](function (e) {
1076
1012
  if (e.name === 'NotAllowedError' && options.hasAutoplaySupport) {
@@ -1089,7 +1025,6 @@ var handleFailedPlay = function handleFailedPlay(player, options) {
1089
1025
  }
1090
1026
  });
1091
1027
  }
1092
-
1093
1028
  return result;
1094
1029
  };
1095
1030
  };
@@ -1099,43 +1034,36 @@ var asyncPlay = function asyncPlay(player) {
1099
1034
  var originalPause = player.pause;
1100
1035
  var intendingToPlay = false;
1101
1036
  var intendingToPause = false;
1102
-
1103
- player.play = function () {
1037
+ player.play = function /* arguments */
1038
+ () {
1104
1039
  player.intendToPlay();
1105
1040
  return originalPlay.apply(player, arguments);
1106
1041
  };
1107
-
1108
- player.pause = function () {
1042
+ player.pause = function /* arguments */
1043
+ () {
1109
1044
  player.intendToPause();
1110
1045
  return originalPause.apply(player, arguments);
1111
1046
  };
1112
-
1113
1047
  player.intendToPlay = function () {
1114
1048
  intendingToPlay = true;
1115
1049
  intendingToPause = false;
1116
1050
  };
1117
-
1118
1051
  player.intendToPause = function () {
1119
1052
  intendingToPause = true;
1120
1053
  intendingToPlay = false;
1121
1054
  };
1122
-
1123
1055
  player.intendingToPlay = function () {
1124
1056
  return intendingToPlay;
1125
1057
  };
1126
-
1127
1058
  player.intendingToPause = function () {
1128
1059
  return intendingToPause;
1129
1060
  };
1130
-
1131
1061
  player.ifIntendingToPause = function () {
1132
1062
  return promiseFromBoolean(intendingToPause);
1133
1063
  };
1134
-
1135
1064
  player.ifIntendingToPlay = function () {
1136
1065
  return promiseFromBoolean(intendingToPlay);
1137
1066
  };
1138
-
1139
1067
  function promiseFromBoolean(value) {
1140
1068
  return new Promise(function (resolve, reject) {
1141
1069
  if (value) {
@@ -1149,16 +1077,14 @@ var asyncPlay = function asyncPlay(player) {
1149
1077
 
1150
1078
  var hooks = function hooks(player, _hooks) {
1151
1079
  var originalPlay = player.play;
1152
-
1153
1080
  player.updateHooks = function (newHooks) {
1154
1081
  _hooks = newHooks;
1155
1082
  };
1156
-
1157
- player.play = function () {
1083
+ player.play = function /* args */
1084
+ () {
1158
1085
  var args = arguments;
1159
1086
  player.trigger('beforeplay');
1160
1087
  player.intendToPlay();
1161
-
1162
1088
  if (_hooks.before) {
1163
1089
  return Promise.all([_hooks.before()]).then(function () {
1164
1090
  return player.ifIntendingToPlay().then(function () {
@@ -1169,18 +1095,15 @@ var hooks = function hooks(player, _hooks) {
1169
1095
  return originalPlay.apply(player, args);
1170
1096
  }
1171
1097
  };
1172
-
1173
1098
  if (player.afterHookListener) {
1174
1099
  player.off('pause', player.afterHookListener);
1175
1100
  player.off('ended', player.afterHookListener);
1176
1101
  }
1177
-
1178
1102
  player.afterHookListener = function () {
1179
1103
  if (_hooks.after) {
1180
1104
  _hooks.after();
1181
1105
  }
1182
1106
  };
1183
-
1184
1107
  player.on('pause', player.afterHookListener);
1185
1108
  player.on('ended', player.afterHookListener);
1186
1109
  };
@@ -1190,19 +1113,16 @@ var volumeBinding = function volumeBinding(player, settings, options) {
1190
1113
  var originalPlay = player.play;
1191
1114
  var originalPause = player.pause;
1192
1115
  var volumeFactor = 'volumeFactor' in options ? options.volumeFactor : 1;
1193
-
1194
1116
  player.play = function () {
1195
1117
  player.intendToPlay();
1196
1118
  player.volume(player.targetVolume());
1197
1119
  listenToVolumeSetting();
1198
1120
  return originalPlay.call(player);
1199
1121
  };
1200
-
1201
1122
  player.playAndFadeIn = function (duration) {
1202
1123
  if (!player.paused() && !player.intendingToPause()) {
1203
1124
  return Promise.resolve();
1204
1125
  }
1205
-
1206
1126
  player.intendToPlay();
1207
1127
  player.volume(0);
1208
1128
  return Promise.all([originalPlay.call(player)]).then(function () {
@@ -1214,17 +1134,14 @@ var volumeBinding = function volumeBinding(player, settings, options) {
1214
1134
  });
1215
1135
  });
1216
1136
  };
1217
-
1218
1137
  player.pause = function () {
1219
1138
  stopListeningToVolumeSetting();
1220
1139
  originalPause.call(player);
1221
1140
  };
1222
-
1223
1141
  player.fadeOutAndPause = function (duration) {
1224
1142
  if (player.paused() && !player.intendingToPlay()) {
1225
1143
  return Promise.resolve();
1226
1144
  }
1227
-
1228
1145
  player.intendToPause();
1229
1146
  stopListeningToVolumeSetting();
1230
1147
  return player.fadeVolume(0, duration).then(function () {
@@ -1233,26 +1150,21 @@ var volumeBinding = function volumeBinding(player, settings, options) {
1233
1150
  });
1234
1151
  });
1235
1152
  };
1236
-
1237
1153
  player.changeVolumeFactor = function (factor, duration) {
1238
1154
  volumeFactor = factor;
1239
1155
  return player.fadeVolume(player.targetVolume(), duration);
1240
1156
  };
1241
-
1242
1157
  player.targetVolume = function () {
1243
1158
  return (options.ignoreVolumeSetting ? 1 : settings.get('volume')) * volumeFactor;
1244
1159
  };
1245
-
1246
1160
  function listenToVolumeSetting() {
1247
1161
  player.on('dispose', stopListeningToVolumeSetting);
1248
1162
  settings.on('change:volume', onVolumeChange);
1249
1163
  }
1250
-
1251
1164
  function stopListeningToVolumeSetting() {
1252
1165
  player.off('dispose', stopListeningToVolumeSetting);
1253
1166
  settings.off('change:volume', onVolumeChange);
1254
1167
  }
1255
-
1256
1168
  function onVolumeChange(model, value) {
1257
1169
  player.fadeVolume(player.targetVolume(), 40);
1258
1170
  }
@@ -1264,7 +1176,6 @@ var volumeBinding = function volumeBinding(player, settings, options) {
1264
1176
  *
1265
1177
  * @since 12.1
1266
1178
  */
1267
-
1268
1179
  var audioContext = {
1269
1180
  /**
1270
1181
  * @returns [AudioContext]
@@ -1273,7 +1184,6 @@ var audioContext = {
1273
1184
  */
1274
1185
  get: function get() {
1275
1186
  var AudioContext = window.AudioContext || window.webkitAudioContext;
1276
-
1277
1187
  if (typeof this._audioContext === 'undefined') {
1278
1188
  try {
1279
1189
  this._audioContext = AudioContext && new AudioContext();
@@ -1284,7 +1194,6 @@ var audioContext = {
1284
1194
  });
1285
1195
  }
1286
1196
  }
1287
-
1288
1197
  return this._audioContext;
1289
1198
  }
1290
1199
  };
@@ -1298,18 +1207,15 @@ var webAudio = function webAudio(player, audioContext) {
1298
1207
  var lastDuration;
1299
1208
  var lastStartValue;
1300
1209
  var allowedMinValue = 0.000001;
1301
-
1302
1210
  if (audioContext.state === 'suspended') {
1303
1211
  events.on('background_media:unmute', function () {
1304
1212
  player.volume(currentValue);
1305
1213
  });
1306
1214
  }
1307
-
1308
1215
  function tryResumeIfSuspended() {
1309
1216
  return new Promise(function (resolve, reject) {
1310
1217
  if (audioContext.state === 'suspended') {
1311
1218
  var maybePromise = audioContext.resume();
1312
-
1313
1219
  if (maybePromise && maybePromise.then) {
1314
1220
  maybePromise.then(handlePromise);
1315
1221
  } else {
@@ -1318,7 +1224,6 @@ var webAudio = function webAudio(player, audioContext) {
1318
1224
  } else {
1319
1225
  resolve();
1320
1226
  }
1321
-
1322
1227
  function handlePromise() {
1323
1228
  if (audioContext.state === 'suspended') {
1324
1229
  reject();
@@ -1328,7 +1233,6 @@ var webAudio = function webAudio(player, audioContext) {
1328
1233
  }
1329
1234
  });
1330
1235
  }
1331
-
1332
1236
  player.volume = function (value) {
1333
1237
  if (typeof value !== 'undefined') {
1334
1238
  tryResumeIfSuspended().then(function () {
@@ -1340,10 +1244,8 @@ var webAudio = function webAudio(player, audioContext) {
1340
1244
  currentValue = ensureInAllowedRange(value);
1341
1245
  });
1342
1246
  }
1343
-
1344
1247
  return Math.round(currentValue * 100) / 100;
1345
1248
  };
1346
-
1347
1249
  player.fadeVolume = function (value, duration) {
1348
1250
  return tryResumeIfSuspended().then(function () {
1349
1251
  ensureGainNode();
@@ -1361,9 +1263,7 @@ var webAudio = function webAudio(player, audioContext) {
1361
1263
  return Promise.resolve();
1362
1264
  });
1363
1265
  };
1364
-
1365
1266
  player.one('dispose', cancel);
1366
-
1367
1267
  function ensureGainNode() {
1368
1268
  if (!gainNode) {
1369
1269
  gainNode = audioContext.createGain();
@@ -1372,14 +1272,12 @@ var webAudio = function webAudio(player, audioContext) {
1372
1272
  gainNode.connect(audioContext.destination);
1373
1273
  }
1374
1274
  }
1375
-
1376
1275
  function resolveCurrent() {
1377
1276
  clearTimeout(currentTimeout);
1378
1277
  currentResolve('done');
1379
1278
  currentTimeout = null;
1380
1279
  currentResolve = null;
1381
1280
  }
1382
-
1383
1281
  function cancel() {
1384
1282
  if (currentResolve) {
1385
1283
  gainNode.gain.cancelScheduledValues(audioContext.currentTime);
@@ -1390,13 +1288,11 @@ var webAudio = function webAudio(player, audioContext) {
1390
1288
  updateCurrentValueFromComputedValue();
1391
1289
  }
1392
1290
  }
1393
-
1394
1291
  function recordFadeStart(duration) {
1395
1292
  lastStartTime = audioContext.currentTime;
1396
1293
  lastStartValue = currentValue;
1397
1294
  lastDuration = duration;
1398
1295
  }
1399
-
1400
1296
  function updateCurrentValueFromComputedValue() {
1401
1297
  // Firefox 54 on Ubuntu does not provide computed values when gain
1402
1298
  // was changed via one of the scheduling methods. Instead
@@ -1411,7 +1307,6 @@ var webAudio = function webAudio(player, audioContext) {
1411
1307
  currentValue = gainNode.gain.value;
1412
1308
  }
1413
1309
  }
1414
-
1415
1310
  function ensureInAllowedRange(value) {
1416
1311
  return value < allowedMinValue ? allowedMinValue : value;
1417
1312
  }
@@ -1427,15 +1322,12 @@ var interval = function interval(player) {
1427
1322
  var originalVolume = player.volume;
1428
1323
  var fadeVolumeResolve;
1429
1324
  var fadeVolumeInterval;
1430
-
1431
1325
  player.volume = function (value) {
1432
1326
  if (typeof value !== 'undefined') {
1433
1327
  cancelFadeVolume();
1434
1328
  }
1435
-
1436
1329
  return originalVolume.apply(player, arguments);
1437
1330
  };
1438
-
1439
1331
  player.fadeVolume = function (value, duration) {
1440
1332
  cancelFadeVolume();
1441
1333
  return new Promise(function (resolve, reject) {
@@ -1443,14 +1335,12 @@ var interval = function interval(player) {
1443
1335
  var startValue = volume();
1444
1336
  var steps = duration / resolution;
1445
1337
  var leap = (value - startValue) / steps;
1446
-
1447
1338
  if (value === startValue) {
1448
1339
  resolve();
1449
1340
  } else {
1450
1341
  fadeVolumeResolve = resolve;
1451
1342
  fadeVolumeInterval = setInterval(function () {
1452
1343
  volume(volume() + leap);
1453
-
1454
1344
  if (volume() >= value && value >= startValue || volume() <= value && value <= startValue) {
1455
1345
  resolveFadeVolume();
1456
1346
  }
@@ -1458,26 +1348,22 @@ var interval = function interval(player) {
1458
1348
  }
1459
1349
  });
1460
1350
  };
1461
-
1462
1351
  player.one('dispose', cancelFadeVolume);
1463
-
1464
- function volume() {
1352
+ function volume( /* arguments */
1353
+ ) {
1465
1354
  return originalVolume.apply(player, arguments);
1466
1355
  }
1467
-
1468
1356
  function resolveFadeVolume() {
1469
1357
  clearInterval(fadeVolumeInterval);
1470
1358
  fadeVolumeResolve('done');
1471
1359
  fadeVolumeInterval = null;
1472
1360
  fadeVolumeResolve = null;
1473
1361
  }
1474
-
1475
1362
  function cancelFadeVolume() {
1476
1363
  if (fadeVolumeResolve) {
1477
1364
  fadeVolumeResolve('cancelled');
1478
1365
  fadeVolumeResolve = null;
1479
1366
  }
1480
-
1481
1367
  if (fadeVolumeInterval) {
1482
1368
  clearInterval(fadeVolumeInterval);
1483
1369
  fadeVolumeInterval = null;
@@ -1501,8 +1387,8 @@ volumeFading.webAudio = webAudio;
1501
1387
 
1502
1388
  var loadWaiting = function loadWaiting(player) {
1503
1389
  var originalFadeVolume = player.fadeVolume;
1504
-
1505
- player.fadeVolume = function () {
1390
+ player.fadeVolume = function /* args */
1391
+ () {
1506
1392
  var args = arguments;
1507
1393
  return Promise.all([this.loadedPromise]).then(function () {
1508
1394
  return originalFadeVolume.apply(player, args);
@@ -1513,13 +1399,11 @@ var loadWaiting = function loadWaiting(player) {
1513
1399
  var Settings = /*#__PURE__*/function () {
1514
1400
  function Settings() {
1515
1401
  _classCallCheck(this, Settings);
1516
-
1517
1402
  this.attributes = {
1518
1403
  volume: 1
1519
1404
  };
1520
1405
  this.initialize();
1521
1406
  }
1522
-
1523
1407
  _createClass(Settings, [{
1524
1408
  key: "get",
1525
1409
  value: function get(attributeName) {
@@ -1529,18 +1413,15 @@ var Settings = /*#__PURE__*/function () {
1529
1413
  key: "set",
1530
1414
  value: function set(key, value) {
1531
1415
  var attrs;
1532
-
1533
1416
  if (typeof key === 'object') {
1534
1417
  attrs = key;
1535
1418
  } else {
1536
1419
  (attrs = {})[key] = value;
1537
1420
  }
1538
-
1539
1421
  for (var attr in attrs) {
1540
1422
  this.attributes[attr] = attrs[attr];
1541
1423
  this.trigger('change:' + attr);
1542
1424
  }
1543
-
1544
1425
  this.trigger('change');
1545
1426
  }
1546
1427
  }, {
@@ -1552,7 +1433,6 @@ var Settings = /*#__PURE__*/function () {
1552
1433
  key: "initialize",
1553
1434
  value: function initialize() {
1554
1435
  var storage = this.getLocalStorage();
1555
-
1556
1436
  if (storage) {
1557
1437
  if (storage['pageflow.settings']) {
1558
1438
  try {
@@ -1561,7 +1441,6 @@ var Settings = /*#__PURE__*/function () {
1561
1441
  log(e);
1562
1442
  }
1563
1443
  }
1564
-
1565
1444
  this.on('change', function () {
1566
1445
  storage['pageflow.settings'] = JSON.stringify(this.attributes);
1567
1446
  });
@@ -1579,10 +1458,8 @@ var Settings = /*#__PURE__*/function () {
1579
1458
  }
1580
1459
  }
1581
1460
  }]);
1582
-
1583
1461
  return Settings;
1584
1462
  }();
1585
-
1586
1463
  Object.assign(Settings.prototype, BackboneEvents);
1587
1464
  var settings = new Settings();
1588
1465
 
@@ -1592,16 +1469,13 @@ var mediaPlayer = {
1592
1469
  hasAutoplaySupport: browser.has('autoplay support')
1593
1470
  }, options));
1594
1471
  asyncPlay(player);
1595
-
1596
1472
  if (options.hooks) {
1597
1473
  hooks(player, options.hooks);
1598
1474
  }
1599
-
1600
1475
  if (options.volumeFading) {
1601
1476
  volumeFading(player);
1602
1477
  volumeBinding(player, settings, options);
1603
1478
  }
1604
-
1605
1479
  if (options.loadWaiting) {
1606
1480
  loadWaiting(player);
1607
1481
  }
@@ -1617,12 +1491,12 @@ mediaPlayer.asyncPlay = asyncPlay;
1617
1491
 
1618
1492
  // Replacement for Underscore's throttle, because scrolled entries
1619
1493
  // don't have Underscore anymore
1494
+
1620
1495
  function throttle(func, timeFrame) {
1621
1496
  var lastTime = 0;
1622
1497
  return function (options) {
1623
1498
  var now = new Date();
1624
1499
  func = func.bind(this);
1625
-
1626
1500
  if (now - lastTime >= timeFrame) {
1627
1501
  func(options);
1628
1502
  lastTime = now;
@@ -1641,7 +1515,6 @@ var mediaEvents = function mediaEvents(player, context) {
1641
1515
  bitrate: 128000
1642
1516
  });
1643
1517
  }
1644
-
1645
1518
  player.on('play', function () {
1646
1519
  triggerMediaEvent('play');
1647
1520
  });
@@ -1666,28 +1539,23 @@ var pauseInBackground = function pauseInBackground(player) {
1666
1539
  var interval;
1667
1540
  var lastInterval;
1668
1541
  var resolution = 100;
1669
-
1670
1542
  function startProbeInterval() {
1671
1543
  interval = setInterval(function () {
1672
1544
  lastInterval = new Date().getTime();
1673
1545
  }, resolution);
1674
1546
  }
1675
-
1676
1547
  function stopProbeInterval() {
1677
1548
  clearInterval(interval);
1678
1549
  interval = null;
1679
1550
  }
1680
-
1681
1551
  function pauseIfProbeIntervalHalted() {
1682
1552
  if (intervalHalted()) {
1683
1553
  player.pause();
1684
1554
  }
1685
1555
  }
1686
-
1687
1556
  function intervalHalted() {
1688
1557
  return interval && lastInterval < new Date().getTime() - resolution * 5;
1689
1558
  }
1690
-
1691
1559
  player.on('play', startProbeInterval);
1692
1560
  player.on('pause', stopProbeInterval);
1693
1561
  player.on('ended', stopProbeInterval);
@@ -1703,24 +1571,20 @@ var pauseInBackground = function pauseInBackground(player) {
1703
1571
  */
1704
1572
  var seekWithInvalidStateHandling = function seekWithInvalidStateHandling(player) {
1705
1573
  var originalSeek = player.seek;
1706
-
1707
1574
  player.seek = function (time) {
1708
1575
  return retryOnProgress(function () {
1709
1576
  originalSeek.call(player, time);
1710
1577
  });
1711
1578
  };
1712
-
1713
1579
  function retryOnProgress(fn) {
1714
1580
  var tries = 0;
1715
1581
  return new Promise(function (resolve, reject) {
1716
1582
  function tryOrWaitForProgress() {
1717
1583
  tries += 1;
1718
-
1719
1584
  if (tries >= 50) {
1720
1585
  reject();
1721
1586
  return;
1722
1587
  }
1723
-
1724
1588
  try {
1725
1589
  fn();
1726
1590
  resolve();
@@ -1728,7 +1592,6 @@ var seekWithInvalidStateHandling = function seekWithInvalidStateHandling(player)
1728
1592
  player.one('progress', tryOrWaitForProgress);
1729
1593
  }
1730
1594
  }
1731
-
1732
1595
  tryOrWaitForProgress();
1733
1596
  });
1734
1597
  }
@@ -1772,7 +1635,6 @@ var getMediaElementMethod = function getMediaElementMethod(player) {
1772
1635
  *
1773
1636
  * @class
1774
1637
  */
1775
-
1776
1638
  var AudioPlayer = function AudioPlayer(sources, options) {
1777
1639
  options = options || {};
1778
1640
  var codecMapping = {
@@ -1800,22 +1662,18 @@ var AudioPlayer = function AudioPlayer(sources, options) {
1800
1662
  audio.readyPromise = readyPromise;
1801
1663
  audio.loadedPromise = loadedPromise;
1802
1664
  audio.on('load', loadedResolve);
1803
-
1804
1665
  if (options.mediaEvents) {
1805
1666
  mediaEvents(audio, options.context);
1806
1667
  }
1807
-
1808
1668
  if (options.pauseInBackground && browser.has('mobile platform')) {
1809
1669
  pauseInBackground(audio);
1810
1670
  }
1811
-
1812
1671
  mediaPlayer.enhance(audio, _objectSpread2({
1813
1672
  loadWaiting: true
1814
1673
  }, options));
1815
1674
  seekWithInvalidStateHandling(audio);
1816
1675
  rewindMethod(audio);
1817
1676
  getMediaElementMethod(audio);
1818
-
1819
1677
  audio.src = function (sources) {
1820
1678
  readyPromise.then(function () {
1821
1679
  var source = (sources || []).find(function (source) {
@@ -1824,44 +1682,34 @@ var AudioPlayer = function AudioPlayer(sources, options) {
1824
1682
  audio.load(source ? source.src : '');
1825
1683
  });
1826
1684
  };
1827
-
1828
1685
  var originalLoad = audio.load;
1829
-
1830
1686
  audio.load = function (src) {
1831
1687
  if (!src) {
1832
1688
  this.duration = 0;
1833
1689
  }
1834
-
1835
1690
  this.currentSrc = src;
1836
1691
  this.position = 0;
1837
1692
  this.trigger('timeupdate', this.position, this.duration);
1838
1693
  originalLoad.apply(this, arguments);
1839
1694
  };
1840
-
1841
1695
  var originalSeek = audio.seek;
1842
-
1843
1696
  audio.seek = function () {
1844
1697
  if (this.currentSrc) {
1845
1698
  return originalSeek.apply(this, arguments);
1846
1699
  }
1847
1700
  };
1848
-
1849
1701
  var originalPlay = audio.play;
1850
-
1851
1702
  audio.play = function () {
1852
1703
  if (this.currentSrc) {
1853
1704
  originalPlay.apply(this, arguments);
1854
1705
  }
1855
1706
  };
1856
-
1857
1707
  audio.paused = function () {
1858
1708
  return !audio.playing;
1859
1709
  };
1860
-
1861
1710
  audio.src(sources);
1862
1711
  return audio;
1863
1712
  };
1864
-
1865
1713
  AudioPlayer.fromAudioTag = function (element, options) {
1866
1714
  return new AudioPlayer(element.find('source').map(function () {
1867
1715
  return {
@@ -1872,7 +1720,6 @@ AudioPlayer.fromAudioTag = function (element, options) {
1872
1720
  tag: element[0]
1873
1721
  }, options));
1874
1722
  };
1875
-
1876
1723
  AudioPlayer.fromScriptTag = function (element, options) {
1877
1724
  var sources = element.length ? JSON.parse(element.text()) : [];
1878
1725
  return new AudioPlayer(sources, options);
@@ -1882,33 +1729,24 @@ var Null = function Null() {
1882
1729
  this.playAndFadeIn = function () {
1883
1730
  return Promise.resolve();
1884
1731
  };
1885
-
1886
1732
  this.fadeOutAndPause = function () {
1887
1733
  return Promise.resolve();
1888
1734
  };
1889
-
1890
1735
  this.changeVolumeFactor = function () {
1891
1736
  return Promise.resolve();
1892
1737
  };
1893
-
1894
1738
  this.play = function () {};
1895
-
1896
1739
  this.pause = function () {};
1897
-
1898
1740
  this.paused = function () {
1899
1741
  return true;
1900
1742
  };
1901
-
1902
1743
  this.seek = function () {
1903
1744
  return Promise.resolve();
1904
1745
  };
1905
-
1906
1746
  this.rewind = function () {
1907
1747
  return Promise.resolve();
1908
1748
  };
1909
-
1910
1749
  this.formatTime = function () {};
1911
-
1912
1750
  this.one = function (event, handler) {
1913
1751
  handler();
1914
1752
  };
@@ -1945,9 +1783,7 @@ var filterSources = function filterSources(playerElement) {
1945
1783
  if (playerElement.tagName.toLowerCase() !== 'video') {
1946
1784
  return playerElement;
1947
1785
  }
1948
-
1949
1786
  var changed = false;
1950
-
1951
1787
  if (browser.has('mp4 support only')) {
1952
1788
  // keep only mp4 source
1953
1789
  playerElement.querySelectorAll('source').forEach(function (source) {
@@ -1959,13 +1795,11 @@ var filterSources = function filterSources(playerElement) {
1959
1795
  } else if (browser.has('mse and native hls support')) {
1960
1796
  // remove dash source to ensure hls is used
1961
1797
  var dashSource = playerElement.querySelector('source[type="application/dash+xml"]');
1962
-
1963
1798
  if (dashSource) {
1964
1799
  playerElement.removeChild(dashSource);
1965
1800
  changed = true;
1966
1801
  }
1967
1802
  }
1968
-
1969
1803
  if (changed) {
1970
1804
  // the video tags initially in the dom are broken since they "saw"
1971
1805
  // the other sources. replace with clone
@@ -1979,7 +1813,6 @@ var filterSources = function filterSources(playerElement) {
1979
1813
 
1980
1814
  var useSlimPlayerControlsDuringPhonePlayback = function useSlimPlayerControlsDuringPhonePlayback(player) {
1981
1815
  var originalPlay = player.play;
1982
-
1983
1816
  player.play = function () {
1984
1817
  if (browser.has('phone platform') && !browser.has('native video player')) {
1985
1818
  state.widgets.use({
@@ -1989,34 +1822,27 @@ var useSlimPlayerControlsDuringPhonePlayback = function useSlimPlayerControlsDur
1989
1822
  player.one('pause', restoreWidgets);
1990
1823
  });
1991
1824
  }
1992
-
1993
1825
  return originalPlay.apply(this, arguments);
1994
1826
  };
1995
1827
  };
1996
1828
 
1997
1829
  var prebuffering = function prebuffering(player) {
1998
1830
  var prebufferPromiseReject;
1999
-
2000
1831
  player.isBufferedAhead = function (delta, silent) {
2001
1832
  // video.js only gives us one time range starting from 0 here. We
2002
1833
  // still ask for the last time range to be on the safe side.
2003
1834
  var timeRanges = player.buffered();
2004
1835
  var currentBufferTime = timeRanges.end(timeRanges.length - 1);
2005
1836
  var desiredBufferTime = player.currentTime() + delta;
2006
-
2007
1837
  if (player.duration()) {
2008
1838
  desiredBufferTime = Math.min(desiredBufferTime, Math.floor(player.duration()));
2009
1839
  }
2010
-
2011
1840
  var result = currentBufferTime >= desiredBufferTime;
2012
-
2013
1841
  if (!silent) {
2014
1842
  log('buffered ahead ' + delta + ': ' + result + ' (' + currentBufferTime + '/' + desiredBufferTime + ')');
2015
1843
  }
2016
-
2017
1844
  return result;
2018
1845
  };
2019
-
2020
1846
  player.prebuffer = function (options) {
2021
1847
  options = options || {};
2022
1848
  var delta = options.secondsToBuffer || 10;
@@ -2024,22 +1850,18 @@ var prebuffering = function prebuffering(player) {
2024
1850
  var interval = 200;
2025
1851
  var maxCount = secondsToWait * 1000 / interval;
2026
1852
  var count = 0;
2027
-
2028
1853
  if (browser.has('prebuffering support')) {
2029
1854
  if (!player.isBufferedAhead(delta) && !player.prebufferPromise) {
2030
1855
  log('prebuffering video ' + player.src());
2031
1856
  player.prebufferPromise = new Promise(function (resolve, reject) {
2032
1857
  prebufferPromiseReject = reject;
2033
1858
  wait();
2034
-
2035
1859
  function wait() {
2036
1860
  setTimeout(function () {
2037
1861
  if (!player.prebufferPromise) {
2038
1862
  return;
2039
1863
  }
2040
-
2041
1864
  count++;
2042
-
2043
1865
  if (player.isBufferedAhead(delta) || count > maxCount) {
2044
1866
  log('finished prebuffering video ' + player.src());
2045
1867
  resolve();
@@ -2052,10 +1874,8 @@ var prebuffering = function prebuffering(player) {
2052
1874
  });
2053
1875
  }
2054
1876
  }
2055
-
2056
1877
  return player.prebufferPromise ? player.prebufferPromise : Promise.resolve();
2057
1878
  };
2058
-
2059
1879
  player.abortPrebuffering = function () {
2060
1880
  if (player.prebufferPromise) {
2061
1881
  log('ABORT prebuffering');
@@ -2063,14 +1883,11 @@ var prebuffering = function prebuffering(player) {
2063
1883
  player.prebufferPromise = null;
2064
1884
  }
2065
1885
  };
2066
-
2067
1886
  var originalPause = player.pause;
2068
-
2069
1887
  player.pause = function () {
2070
1888
  player.abortPrebuffering();
2071
1889
  return originalPause.apply(this, arguments);
2072
1890
  };
2073
-
2074
1891
  player.one('dispose', function () {
2075
1892
  player.abortPrebuffering();
2076
1893
  });
@@ -2114,7 +1931,9 @@ var cueSettingsMethods = function cueSettingsMethods(player) {
2114
1931
  }
2115
1932
  }
2116
1933
  }
2117
- }); // Setting `line` does not update display directly, but only when
1934
+ });
1935
+
1936
+ // Setting `line` does not update display directly, but only when
2118
1937
  // the next cue is displayed. This is problematic, when we
2119
1938
  // reposition text tracks to prevent overlap with player
2120
1939
  // controls. Triggering the event makes VideoJS update positions.
@@ -2122,14 +1941,12 @@ var cueSettingsMethods = function cueSettingsMethods(player) {
2122
1941
  // track changed since the last call, i.e. `line` has been changed
2123
1942
  // for a cue even though the previous call had the same
2124
1943
  // parameters.
2125
-
2126
1944
  if ((this.prevLine !== line || changed) && command != 'lazy') {
2127
1945
  var tech = player.tech({
2128
1946
  IWillNotUseThisInPlugins: true
2129
1947
  });
2130
1948
  tech && tech.trigger('texttrackchange');
2131
1949
  }
2132
-
2133
1950
  this.prevLine = line;
2134
1951
  };
2135
1952
  };
@@ -2147,11 +1964,10 @@ var mediaEvents$1 = function mediaEvents(player, context) {
2147
1964
  player.updateMediaEventsContext = function (newContext) {
2148
1965
  context = newContext;
2149
1966
  };
2150
-
2151
1967
  function triggerMediaEvent(name) {
2152
1968
  if (context) {
2153
1969
  events.trigger('media:' + name, {
2154
- fileName: player.currentSrc(),
1970
+ fileName: player.previousSrc || player.currentSrc(),
2155
1971
  context: context,
2156
1972
  currentTime: player.currentTime(),
2157
1973
  duration: player.duration(),
@@ -2161,7 +1977,6 @@ var mediaEvents$1 = function mediaEvents(player, context) {
2161
1977
  });
2162
1978
  }
2163
1979
  }
2164
-
2165
1980
  player.on('play', function () {
2166
1981
  triggerMediaEvent('play');
2167
1982
  });
@@ -2181,22 +1996,18 @@ var mediaEvents$1 = function mediaEvents(player, context) {
2181
1996
 
2182
1997
  var bufferUnderrunWaiting = function bufferUnderrunWaiting(player) {
2183
1998
  var originalPause = player.pause;
2184
-
2185
1999
  player.pause = function () {
2186
2000
  cancelWaiting();
2187
2001
  originalPause.apply(this, arguments);
2188
2002
  };
2189
-
2190
2003
  function pauseAndPreloadOnUnderrun() {
2191
2004
  if (bufferUnderrun()) {
2192
2005
  pauseAndPreload();
2193
2006
  }
2194
2007
  }
2195
-
2196
2008
  function bufferUnderrun() {
2197
2009
  return !player.isBufferedAhead(0.1, true) && !player.waitingOnUnderrun && !ignoringUnderruns();
2198
2010
  }
2199
-
2200
2011
  function pauseAndPreload() {
2201
2012
  log('Buffer underrun');
2202
2013
  player.trigger('bufferunderrun');
@@ -2214,7 +2025,6 @@ var bufferUnderrunWaiting = function bufferUnderrunWaiting(player) {
2214
2025
  }
2215
2026
  }, function () {});
2216
2027
  }
2217
-
2218
2028
  function cancelWaiting() {
2219
2029
  if (player.waitingOnUnderrun) {
2220
2030
  player.ignoreUnderrunsUntil = new Date().getTime() + 5 * 1000;
@@ -2222,21 +2032,16 @@ var bufferUnderrunWaiting = function bufferUnderrunWaiting(player) {
2222
2032
  player.trigger('bufferunderruncontinue');
2223
2033
  }
2224
2034
  }
2225
-
2226
2035
  function ignoringUnderruns() {
2227
2036
  var r = player.ignoreUnderrunsUntil && new Date().getTime() < player.ignoreUnderrunsUntil;
2228
-
2229
2037
  if (r) {
2230
2038
  log('ignoring underrun');
2231
2039
  }
2232
-
2233
2040
  return r;
2234
2041
  }
2235
-
2236
2042
  function stopListeningForProgress() {
2237
2043
  player.off('progress', pauseAndPreloadOnUnderrun);
2238
2044
  }
2239
-
2240
2045
  if (browser.has('buffer underrun waiting support')) {
2241
2046
  player.on('play', function () {
2242
2047
  player.on('progress', pauseAndPreloadOnUnderrun);
@@ -2268,24 +2073,19 @@ var VideoPlayer = function VideoPlayer(element, options) {
2268
2073
  options = options || {};
2269
2074
  element = filterSources(element);
2270
2075
  var player = VideoJS(element, options);
2271
-
2272
2076
  if (options.useSlimPlayerControlsDuringPhonePlayback) {
2273
2077
  useSlimPlayerControlsDuringPhonePlayback(player);
2274
2078
  }
2275
-
2276
2079
  prebuffering(player);
2277
2080
  cueSettingsMethods(player);
2278
2081
  getMediaElementMethod$1(player);
2279
2082
  rewindMethod$1(player);
2280
-
2281
2083
  if (options.mediaEvents) {
2282
2084
  mediaEvents$1(player, options.context);
2283
2085
  }
2284
-
2285
2086
  if (options.bufferUnderrunWaiting) {
2286
2087
  bufferUnderrunWaiting(player);
2287
2088
  }
2288
-
2289
2089
  mediaPlayer.enhance(player, options);
2290
2090
  return player;
2291
2091
  };
@@ -2329,7 +2129,6 @@ var createMediaPlayer = function createMediaPlayer(options) {
2329
2129
  return {};
2330
2130
  }
2331
2131
  };
2332
-
2333
2132
  player.playOrPlayOnLoad = function () {
2334
2133
  if (this.readyState() > 0) {
2335
2134
  player.play();
@@ -2337,7 +2136,6 @@ var createMediaPlayer = function createMediaPlayer(options) {
2337
2136
  player.on('loadedmetadata', player.play);
2338
2137
  }
2339
2138
  };
2340
-
2341
2139
  player.addClass('video-js');
2342
2140
  player.addClass('player');
2343
2141
  return player;
@@ -2358,6 +2156,7 @@ var createMediaPlayer = function createMediaPlayer(options) {
2358
2156
  * See the License for the specific language governing permissions and
2359
2157
  * limitations under the License.
2360
2158
  */
2159
+
2361
2160
  var BLANK_AUDIO_SRC = 'data:audio/wav;base64,UklGRjIAAABXQVZFZm10IBA' + 'AAAABAAEAIlYAAESsAAACABAAZGF0YRAAAAAAAAAAAAAAAAAAAAAAAA==';
2362
2161
  var BLANK_VIDEO_SRC = 'data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAG' + 'lzb21pc28yYXZjMQAAAAhmcmVlAAAGF21kYXTeBAAAbGliZmFhYyAxLjI4AABCAJMgBDIARw' + 'AAArEGBf//rdxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxNDIgcjIgOTU2YzhkOCAtIE' + 'guMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTQgLSBodHRwOi8vd3' + 'd3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYm' + 'xvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3' + 'JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbG' + 'lzPTEgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV' + '9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3Rocm' + 'VhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb2' + '5zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTI1MCBrZXlpbn' + 'RfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcm' + 'M9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcH' + 'N0ZXA9NCB2YnZfbWF4cmF0ZT03NjggdmJ2X2J1ZnNpemU9MzAwMCBjcmZfbWF4PTAuMCBuYW' + 'xfaHJkPW5vbmUgZmlsbGVyPTAgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAFZliIQL8m' + 'KAAKvMnJycnJycnJycnXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' + 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiEASZACGQAjgCEASZACGQAjgAAAAAdBmjgX4G' + 'SAIQBJkAIZACOAAAAAB0GaVAX4GSAhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpgL8DJIQBJkA' + 'IZACOAIQBJkAIZACOAAAAABkGagC/AySEASZACGQAjgAAAAAZBmqAvwMkhAEmQAhkAI4AhAE' + 'mQAhkAI4AAAAAGQZrAL8DJIQBJkAIZACOAAAAABkGa4C/AySEASZACGQAjgCEASZACGQAjgA' + 'AAAAZBmwAvwMkhAEmQAhkAI4AAAAAGQZsgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGbQC' + '/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm2AvwMkhAEmQAhkAI4AAAAAGQZuAL8DJIQBJkA' + 'IZACOAIQBJkAIZACOAAAAABkGboC/AySEASZACGQAjgAAAAAZBm8AvwMkhAEmQAhkAI4AhAE' + 'mQAhkAI4AAAAAGQZvgL8DJIQBJkAIZACOAAAAABkGaAC/AySEASZACGQAjgCEASZACGQAjgA' + 'AAAAZBmiAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpAL8DJIQBJkAIZACOAAAAABkGaYC' + '/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmoAvwMkhAEmQAhkAI4AAAAAGQZqgL8DJIQBJkA' + 'IZACOAIQBJkAIZACOAAAAABkGawC/AySEASZACGQAjgAAAAAZBmuAvwMkhAEmQAhkAI4AhAE' + 'mQAhkAI4AAAAAGQZsAL8DJIQBJkAIZACOAAAAABkGbIC/AySEASZACGQAjgCEASZACGQAjgA' + 'AAAAZBm0AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZtgL8DJIQBJkAIZACOAAAAABkGbgC' + 'vAySEASZACGQAjgCEASZACGQAjgAAAAAZBm6AnwMkhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAh' + 'kAI4AhAEmQAhkAI4AAAAhubW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAABDcAAQAAAQ' + 'AAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzB0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAA' + 'AAAAAAA+kAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAA' + 'BAAAAAALAAAACQAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAPpAAAAAAABAAAAAAKobW' + 'RpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAB1MAAAdU5VxAAAAAAALWhkbHIAAAAAAAAAAHZpZG' + 'UAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACU21pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAA' + 'AAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAhNzdGJsAAAAr3N0c2QAAA' + 'AAAAAAAQAAAJ9hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAALAAkABIAAAASAAAAAAAAA' + 'ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAALWF2Y0MBQsAN/+EAFW' + 'dCwA3ZAsTsBEAAAPpAADqYA8UKkgEABWjLg8sgAAAAHHV1aWRraEDyXyRPxbo5pRvPAyPzAA' + 'AAAAAAABhzdHRzAAAAAAAAAAEAAAAeAAAD6QAAABRzdHNzAAAAAAAAAAEAAAABAAAAHHN0c2' + 'MAAAAAAAAAAQAAAAEAAAABAAAAAQAAAIxzdHN6AAAAAAAAAAAAAAAeAAADDwAAAAsAAAALAA' + 'AACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAA' + 'oAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAA' + 'AAiHN0Y28AAAAAAAAAHgAAAEYAAANnAAADewAAA5gAAAO0AAADxwAAA+MAAAP2AAAEEgAABC' + 'UAAARBAAAEXQAABHAAAASMAAAEnwAABLsAAATOAAAE6gAABQYAAAUZAAAFNQAABUgAAAVkAA' + 'AFdwAABZMAAAWmAAAFwgAABd4AAAXxAAAGDQAABGh0cmFrAAAAXHRraGQAAAADAAAAAAAAAA' + 'AAAAACAAAAAAAABDcAAAAAAAAAAAAAAAEBAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAA' + 'AAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAQkAAADcAABAA' + 'AAAAPgbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAC7gAAAykBVxAAAAAAALWhkbHIAAAAAAA' + 'AAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAADi21pbmYAAAAQc21oZAAAAAAAAA' + 'AAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAADT3N0YmwAAABnc3RzZA' + 'AAAAAAAAABAAAAV21wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAC7gAAAAAAAM2VzZHMAAA' + 'AAA4CAgCIAAgAEgICAFEAVBbjYAAu4AAAADcoFgICAAhGQBoCAgAECAAAAIHN0dHMAAAAAAA' + 'AAAgAAADIAAAQAAAAAAQAAAkAAAAFUc3RzYwAAAAAAAAAbAAAAAQAAAAEAAAABAAAAAgAAAA' + 'IAAAABAAAAAwAAAAEAAAABAAAABAAAAAIAAAABAAAABgAAAAEAAAABAAAABwAAAAIAAAABAA' + 'AACAAAAAEAAAABAAAACQAAAAIAAAABAAAACgAAAAEAAAABAAAACwAAAAIAAAABAAAADQAAAA' + 'EAAAABAAAADgAAAAIAAAABAAAADwAAAAEAAAABAAAAEAAAAAIAAAABAAAAEQAAAAEAAAABAA' + 'AAEgAAAAIAAAABAAAAFAAAAAEAAAABAAAAFQAAAAIAAAABAAAAFgAAAAEAAAABAAAAFwAAAA' + 'IAAAABAAAAGAAAAAEAAAABAAAAGQAAAAIAAAABAAAAGgAAAAEAAAABAAAAGwAAAAIAAAABAA' + 'AAHQAAAAEAAAABAAAAHgAAAAIAAAABAAAAHwAAAAQAAAABAAAA4HN0c3oAAAAAAAAAAAAAAD' + 'MAAAAaAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAA' + 'AACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAA' + 'kAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAA' + 'AACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAACMc3RjbwAAAA' + 'AAAAAfAAAALAAAA1UAAANyAAADhgAAA6IAAAO+AAAD0QAAA+0AAAQAAAAEHAAABC8AAARLAA' + 'AEZwAABHoAAASWAAAEqQAABMUAAATYAAAE9AAABRAAAAUjAAAFPwAABVIAAAVuAAAFgQAABZ' + '0AAAWwAAAFzAAABegAAAX7AAAGFwAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAA' + 'AAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYX' + 'ZmNTUuMzMuMTAw';
2363
2162
  var blankSources = {
@@ -2372,83 +2171,72 @@ var blankSources = {
2372
2171
  };
2373
2172
 
2374
2173
  /** @const @enum {string} */
2375
-
2376
2174
  var MediaType = {
2377
2175
  AUDIO: 'audio',
2378
2176
  VIDEO: 'video'
2379
2177
  };
2380
2178
  var elId = 0;
2179
+
2381
2180
  /**
2382
2181
  * Media pool class handles the pool of Videojs media players
2383
2182
  */
2384
-
2385
2183
  var MediaPool = /*#__PURE__*/function () {
2386
2184
  function MediaPool() {
2387
- var _this$mediaFactory_;
2388
-
2389
2185
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
2390
2186
  playerCount: 4
2391
2187
  };
2392
-
2393
2188
  _classCallCheck(this, MediaPool);
2394
-
2395
2189
  this.playerCount = options.playerCount;
2396
2190
  this.allocatedPlayers = {};
2397
2191
  this.unAllocatedPlayers = {};
2398
- this.mediaFactory_ = (_this$mediaFactory_ = {}, _defineProperty(_this$mediaFactory_, MediaType.AUDIO, function () {
2192
+ this.mediaFactory_ = _defineProperty(_defineProperty({}, MediaType.AUDIO, function () {
2399
2193
  var audioEl = document.createElement('audio');
2400
2194
  audioEl.setAttribute('crossorigin', 'anonymous');
2401
2195
  return audioEl;
2402
- }), _defineProperty(_this$mediaFactory_, MediaType.VIDEO, function () {
2196
+ }), MediaType.VIDEO, function () {
2403
2197
  var videoEl = document.createElement('video');
2404
2198
  videoEl.setAttribute('crossorigin', 'anonymous');
2405
2199
  return videoEl;
2406
- }), _this$mediaFactory_);
2200
+ });
2407
2201
  }
2408
-
2409
2202
  _createClass(MediaPool, [{
2410
2203
  key: "allocatePlayer",
2411
2204
  value: function allocatePlayer(_ref) {
2412
2205
  var playerType = _ref.playerType,
2413
- playerId = _ref.playerId,
2414
- playsInline = _ref.playsInline,
2415
- mediaEventsContextData = _ref.mediaEventsContextData,
2416
- hooks = _ref.hooks,
2417
- poster = _ref.poster,
2418
- _ref$loop = _ref.loop,
2419
- loop = _ref$loop === void 0 ? false : _ref$loop,
2420
- _ref$controls = _ref.controls,
2421
- controls = _ref$controls === void 0 ? false : _ref$controls,
2422
- altText = _ref.altText,
2423
- onRelease = _ref.onRelease;
2206
+ playerId = _ref.playerId,
2207
+ playsInline = _ref.playsInline,
2208
+ mediaEventsContextData = _ref.mediaEventsContextData,
2209
+ hooks = _ref.hooks,
2210
+ poster = _ref.poster,
2211
+ _ref$loop = _ref.loop,
2212
+ loop = _ref$loop === void 0 ? false : _ref$loop,
2213
+ _ref$controls = _ref.controls,
2214
+ controls = _ref$controls === void 0 ? false : _ref$controls,
2215
+ altText = _ref.altText,
2216
+ onRelease = _ref.onRelease;
2424
2217
  var player = undefined;
2425
-
2426
2218
  if (!this.unAllocatedPlayers[playerType]) {
2427
2219
  this.populateMediaPool_();
2428
2220
  }
2429
-
2430
2221
  if (this.unAllocatedPlayers[playerType].length == 0) {
2431
2222
  this.freeOnePlayer(playerType);
2432
2223
  }
2433
-
2434
2224
  player = this.unAllocatedPlayers[playerType].pop();
2435
-
2436
2225
  if (player) {
2437
2226
  player.pause();
2438
2227
  player.getMediaElement().loop = loop;
2439
2228
  player.getMediaElement().setAttribute('alt', altText);
2440
2229
  player.poster(poster);
2441
2230
  player.controls(controls);
2442
-
2443
2231
  if (playsInline) {
2444
2232
  player.playsinline(true);
2445
2233
  }
2446
-
2447
2234
  player.updateHooks(hooks || {});
2448
2235
  player.updateMediaEventsContext(mediaEventsContextData);
2449
2236
  this.allocatedPlayers[playerType].push(player);
2450
2237
  player.playerId = playerId || this.allocatedPlayers[playerType].length;
2451
2238
  player.releaseCallback = onRelease;
2239
+ player.previousSrc = null;
2452
2240
  return player;
2453
2241
  } else {
2454
2242
  console.log('no player found for allocation');
@@ -2467,6 +2255,7 @@ var MediaPool = /*#__PURE__*/function () {
2467
2255
  this.allocatedPlayers[type] = this.allocatedPlayers[type].filter(function (p) {
2468
2256
  return p != player;
2469
2257
  });
2258
+ player.previousSrc = player.currentSrc();
2470
2259
  player.controls(false);
2471
2260
  player.getMediaElement().loop = false;
2472
2261
  player.playsinline(false);
@@ -2474,22 +2263,20 @@ var MediaPool = /*#__PURE__*/function () {
2474
2263
  player.poster('');
2475
2264
  clearTextTracks(player);
2476
2265
  this.unAllocatedPlayers[type].push(player);
2477
-
2478
2266
  if (player.releaseCallback) {
2479
2267
  player.releaseCallback();
2480
2268
  player.releaseCallback = null;
2481
2269
  }
2270
+ player.pause();
2482
2271
  }
2483
2272
  }
2484
2273
  }, {
2485
2274
  key: "blessAll",
2486
2275
  value: function blessAll(value) {
2487
2276
  var _this = this;
2488
-
2489
2277
  if (this.unAllocatedPlayers[MediaType.AUDIO] == undefined || this.unAllocatedPlayers[MediaType.VIDEO] == undefined) {
2490
2278
  this.populateMediaPool_();
2491
2279
  }
2492
-
2493
2280
  this.forEachMediaType(function (key) {
2494
2281
  _this.allPlayersForType(MediaType[key]).forEach(function (player) {
2495
2282
  player.muted(value);
@@ -2502,18 +2289,15 @@ var MediaPool = /*#__PURE__*/function () {
2502
2289
  if (this.unAllocatedPlayers[type]) {
2503
2290
  return [].concat(_toConsumableArray(this.unAllocatedPlayers[type]), _toConsumableArray(this.allocatedPlayers[type]));
2504
2291
  }
2505
-
2506
2292
  return [];
2507
2293
  }
2508
2294
  }, {
2509
2295
  key: "getMediaTypeFromEl",
2510
2296
  value: function getMediaTypeFromEl(mediaElement) {
2511
2297
  var tagName = mediaElement.tagName.toLowerCase();
2512
-
2513
2298
  if (tagName == 'div') {
2514
2299
  tagName = mediaElement.children[0].tagName.toLowerCase();
2515
2300
  }
2516
-
2517
2301
  return this.getMediaType(tagName);
2518
2302
  }
2519
2303
  }, {
@@ -2522,7 +2306,6 @@ var MediaPool = /*#__PURE__*/function () {
2522
2306
  switch (tagName) {
2523
2307
  case 'audio':
2524
2308
  return MediaType.AUDIO;
2525
-
2526
2309
  case 'video':
2527
2310
  return MediaType.VIDEO;
2528
2311
  }
@@ -2536,12 +2319,10 @@ var MediaPool = /*#__PURE__*/function () {
2536
2319
  key: "createPlayer_",
2537
2320
  value: function createPlayer_(type, mediaEl) {
2538
2321
  mediaEl.setAttribute('pool-element', elId++);
2539
-
2540
2322
  if (!this.unAllocatedPlayers[type]) {
2541
2323
  this.unAllocatedPlayers[type] = [];
2542
2324
  this.allocatedPlayers[type] = [];
2543
2325
  }
2544
-
2545
2326
  var player = createMediaPlayer({
2546
2327
  mediaElement: mediaEl,
2547
2328
  tagName: type
@@ -2555,7 +2336,6 @@ var MediaPool = /*#__PURE__*/function () {
2555
2336
  key: "initializeMediaPool_",
2556
2337
  value: function initializeMediaPool_(type, mediaElSeed) {
2557
2338
  var playerCount = typeof this.playerCount === 'function' ? this.playerCount(type) : this.playerCount;
2558
-
2559
2339
  while (this.allPlayersForType(type).length < playerCount) {
2560
2340
  this.createPlayer_(type, mediaElSeed.cloneNode(true));
2561
2341
  }
@@ -2564,24 +2344,18 @@ var MediaPool = /*#__PURE__*/function () {
2564
2344
  key: "populateMediaPool_",
2565
2345
  value: function populateMediaPool_() {
2566
2346
  var _this2 = this;
2567
-
2568
2347
  this.forEachMediaType(function (key) {
2569
2348
  var type = MediaType[key];
2570
-
2571
2349
  var mediaEl = _this2.mediaFactory_[type].call(_this2);
2572
-
2573
2350
  _this2.initializeMediaPool_(type, mediaEl);
2574
2351
  });
2575
2352
  }
2576
2353
  }]);
2577
-
2578
2354
  return MediaPool;
2579
2355
  }();
2580
-
2581
2356
  function clearTextTracks(player) {
2582
2357
  var tracks = player.textTracks();
2583
2358
  var i = tracks.length;
2584
-
2585
2359
  while (i--) {
2586
2360
  player.removeRemoteTextTrack(tracks[i]);
2587
2361
  }
@@ -2594,11 +2368,9 @@ var media = {
2594
2368
  }
2595
2369
  }),
2596
2370
  muteState: true,
2597
-
2598
2371
  get muted() {
2599
2372
  return this.muteState;
2600
2373
  },
2601
-
2602
2374
  mute: function mute(value) {
2603
2375
  this.muteState = value;
2604
2376
  this.playerPool.blessAll(value);
@@ -2607,17 +2379,17 @@ var media = {
2607
2379
  getPlayer: function getPlayer(fileSource, options) {
2608
2380
  options.playerType = options.tagName || MediaType.VIDEO;
2609
2381
  var player = this.playerPool.allocatePlayer(options);
2610
-
2611
2382
  if (player) {
2612
2383
  player.muted(this.muteState);
2613
2384
  player.src(fileSource);
2614
-
2615
2385
  if (options.textTrackSources) {
2616
2386
  options.textTrackSources.forEach(function (track) {
2617
2387
  return player.addRemoteTextTrack(track, true);
2618
2388
  });
2619
2389
  }
2620
-
2390
+ if (browser.has('video scaling bug fixed by load')) {
2391
+ player.load();
2392
+ }
2621
2393
  return player;
2622
2394
  }
2623
2395
  },
@@ -2634,47 +2406,39 @@ Object.assign(media, BackboneEvents);
2634
2406
  *
2635
2407
  * @class
2636
2408
  */
2637
-
2638
2409
  var MultiPlayer = function MultiPlayer(pool, options) {
2639
2410
  if (options.crossFade && options.playFromBeginning) {
2640
2411
  throw 'pageflow.Audio.MultiPlayer: The options crossFade and playFromBeginning can not be used together at the moment.';
2641
2412
  }
2642
-
2643
2413
  var current = new AudioPlayer.Null();
2644
2414
  var currentId = null;
2645
2415
  var that = this;
2416
+
2646
2417
  /**
2647
2418
  * Continue playback.
2648
2419
  */
2649
-
2650
2420
  this.resume = function () {
2651
2421
  return current.play();
2652
2422
  };
2423
+
2653
2424
  /**
2654
2425
  * Continue playback with fade in.
2655
2426
  */
2656
-
2657
-
2658
2427
  this.resumeAndFadeIn = function () {
2659
2428
  return current.playAndFadeIn(options.fadeDuration);
2660
2429
  };
2661
-
2662
2430
  this.seek = function (position) {
2663
2431
  return current.seek(position);
2664
2432
  };
2665
-
2666
2433
  this.pause = function () {
2667
2434
  return current.pause();
2668
2435
  };
2669
-
2670
2436
  this.paused = function () {
2671
2437
  return current.paused();
2672
2438
  };
2673
-
2674
2439
  this.fadeOutAndPause = function () {
2675
2440
  return current.fadeOutAndPause(options.fadeDuration);
2676
2441
  };
2677
-
2678
2442
  this.fadeOutIfPlaying = function () {
2679
2443
  if (current.paused()) {
2680
2444
  return Promise.resolve();
@@ -2682,48 +2446,38 @@ var MultiPlayer = function MultiPlayer(pool, options) {
2682
2446
  return current.fadeOutAndPause(options.fadeDuration);
2683
2447
  }
2684
2448
  };
2685
-
2686
2449
  this.position = function () {
2687
2450
  return current.position;
2688
2451
  };
2689
-
2690
2452
  this.duration = function () {
2691
2453
  return current.duration;
2692
2454
  };
2693
-
2694
2455
  this.fadeTo = function (id) {
2695
2456
  return changeCurrent(id, function (player) {
2696
2457
  return player.playAndFadeIn(options.fadeDuration);
2697
2458
  });
2698
2459
  };
2699
-
2700
2460
  this.play = function (id) {
2701
2461
  return changeCurrent(id, function (player) {
2702
2462
  return player.play();
2703
2463
  });
2704
2464
  };
2705
-
2706
2465
  this.changeVolumeFactor = function (factor) {
2707
2466
  return current.changeVolumeFactor(factor, options.fadeDuration);
2708
2467
  };
2709
-
2710
2468
  this.formatTime = function (time) {
2711
2469
  return current.formatTime(time);
2712
2470
  };
2713
-
2714
2471
  function changeCurrent(id, callback) {
2715
2472
  if (!options.playFromBeginning && id === currentId && !current.paused()) {
2716
2473
  return Promise.resolve();
2717
2474
  }
2718
-
2719
2475
  var player = pool.get(id);
2720
2476
  currentId = id;
2721
2477
  var fadeOutPromise = current.fadeOutAndPause(options.fadeDuration);
2722
-
2723
2478
  if (current._stopMultiPlayerEventPropagation && current.paused()) {
2724
2479
  current._stopMultiPlayerEventPropagation();
2725
2480
  }
2726
-
2727
2481
  return handleCrossFade(fadeOutPromise).then(function () {
2728
2482
  current = player;
2729
2483
  startEventPropagation(current, id);
@@ -2732,7 +2486,6 @@ var MultiPlayer = function MultiPlayer(pool, options) {
2732
2486
  });
2733
2487
  });
2734
2488
  }
2735
-
2736
2489
  function handleCrossFade(fadePomise) {
2737
2490
  if (options.crossFade) {
2738
2491
  return Promise.resolve();
@@ -2740,7 +2493,6 @@ var MultiPlayer = function MultiPlayer(pool, options) {
2740
2493
  return fadePomise;
2741
2494
  }
2742
2495
  }
2743
-
2744
2496
  function handlePlayFromBeginning(player) {
2745
2497
  if (options.playFromBeginning || options.rewindOnChange) {
2746
2498
  return player.rewind();
@@ -2748,48 +2500,40 @@ var MultiPlayer = function MultiPlayer(pool, options) {
2748
2500
  return Promise.resolve();
2749
2501
  }
2750
2502
  }
2751
-
2752
2503
  function startEventPropagation(player, id) {
2753
2504
  var playCallback = function playCallback() {
2754
2505
  that.trigger('play', {
2755
2506
  audioFileId: id
2756
2507
  });
2757
2508
  };
2758
-
2759
2509
  var pauseCallback = function pauseCallback() {
2760
2510
  that.trigger('pause', {
2761
2511
  audioFileId: id
2762
2512
  });
2763
-
2764
2513
  if (currentId !== id) {
2765
2514
  player._stopMultiPlayerEventPropagation();
2766
2515
  }
2767
2516
  };
2768
-
2769
2517
  var timeUpdateCallback = function timeUpdateCallback() {
2770
2518
  that.trigger('timeupdate', {
2771
2519
  audioFileId: id
2772
2520
  });
2773
2521
  };
2774
-
2775
2522
  var endedCallback = function endedCallback() {
2776
2523
  that.trigger('ended', {
2777
2524
  audioFileId: id
2778
2525
  });
2779
2526
  };
2780
-
2781
2527
  var playFailedCallback = function playFailedCallback() {
2782
2528
  that.trigger('playfailed', {
2783
2529
  audioFileId: id
2784
2530
  });
2785
2531
  };
2786
-
2787
2532
  player.on('play', playCallback);
2788
2533
  player.on('pause', pauseCallback);
2789
2534
  player.on('timeupdate', timeUpdateCallback);
2790
2535
  player.on('ended', endedCallback);
2791
2536
  player.on('playfailed', playFailedCallback);
2792
-
2793
2537
  player._stopMultiPlayerEventPropagation = function () {
2794
2538
  player.off('play', playCallback);
2795
2539
  player.off('pause', pauseCallback);
@@ -2803,8 +2547,7 @@ Object.assign(MultiPlayer.prototype, BackboneEvents);
2803
2547
 
2804
2548
  var PlayerSourceIDMap = function PlayerSourceIDMap(media) {
2805
2549
  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
2806
- playerOptions = _ref.playerOptions;
2807
-
2550
+ playerOptions = _ref.playerOptions;
2808
2551
  return {
2809
2552
  current: undefined,
2810
2553
  previous: undefined,
@@ -2815,11 +2558,9 @@ var PlayerSourceIDMap = function PlayerSourceIDMap(media) {
2815
2558
  if (!this[sourceID]) {
2816
2559
  return new AudioPlayer.Null();
2817
2560
  }
2818
-
2819
2561
  if (this.current && this.current.playerId === sourceID) {
2820
2562
  return this.current;
2821
2563
  }
2822
-
2823
2564
  if (this.previous && this.previous.playerId === sourceID) {
2824
2565
  var holder = this.current;
2825
2566
  this.current = this.previous;
@@ -2828,14 +2569,12 @@ var PlayerSourceIDMap = function PlayerSourceIDMap(media) {
2828
2569
  if (this.previous) {
2829
2570
  media.releasePlayer(this.previous);
2830
2571
  }
2831
-
2832
2572
  this.previous = this.current;
2833
2573
  this.current = media.getPlayer(this[sourceID], _objectSpread2({
2834
2574
  filePermaId: sourceID,
2835
2575
  playerId: sourceID
2836
2576
  }, playerOptions));
2837
2577
  }
2838
-
2839
2578
  return this.current;
2840
2579
  }
2841
2580
  };
@@ -2843,12 +2582,10 @@ var PlayerSourceIDMap = function PlayerSourceIDMap(media) {
2843
2582
 
2844
2583
  var PlayerPool = function PlayerPool(audio, options) {
2845
2584
  this.players = {};
2846
-
2847
2585
  this.get = function (audioFileId) {
2848
2586
  this.players[audioFileId] = this.players[audioFileId] || audio.createPlayer(audioFileId, options);
2849
2587
  return this.players[audioFileId];
2850
2588
  };
2851
-
2852
2589
  this.dispose = function () {
2853
2590
  this.players = {};
2854
2591
  };
@@ -2859,11 +2596,11 @@ var PlayerPool = function PlayerPool(audio, options) {
2859
2596
  * @alias pageflow.audio
2860
2597
  * @member
2861
2598
  */
2862
-
2863
2599
  var Audio = function Audio(options) {
2864
2600
  this.getSources = options.getSources || function (audioFileId) {
2865
2601
  return options.audioFiles[audioFileId] || '';
2866
2602
  };
2603
+
2867
2604
  /**
2868
2605
  * Creates a player for the given audio file.
2869
2606
  *
@@ -2877,11 +2614,8 @@ var Audio = function Audio(options) {
2877
2614
  *
2878
2615
  * @static
2879
2616
  */
2880
-
2881
-
2882
2617
  this.createPlayer = function (audioFileId, options) {
2883
2618
  var sources = this.getSources(removeSuffix(audioFileId));
2884
-
2885
2619
  if (sources) {
2886
2620
  return new AudioPlayer(sources, _objectSpread2({
2887
2621
  volumeFading: true
@@ -2890,6 +2624,7 @@ var Audio = function Audio(options) {
2890
2624
  return new AudioPlayer.Null();
2891
2625
  }
2892
2626
  };
2627
+
2893
2628
  /**
2894
2629
  * Create a `MultiPlayer` to play and fade between multiple audio
2895
2630
  * files.
@@ -2908,21 +2643,16 @@ var Audio = function Audio(options) {
2908
2643
  *
2909
2644
  * @return {pageflow.Audio.MultiPlayer}
2910
2645
  */
2911
-
2912
-
2913
2646
  this.createMultiPlayer = function (options) {
2914
2647
  return new MultiPlayer(new PlayerPool(this, options), options);
2915
2648
  };
2916
-
2917
2649
  function removeSuffix(id) {
2918
2650
  if (!id) {
2919
2651
  return id;
2920
2652
  }
2921
-
2922
2653
  return parseInt(id.toString().split('.')[0], 10);
2923
2654
  }
2924
2655
  };
2925
-
2926
2656
  Audio.setup = function (options) {
2927
2657
  state.audio = new Audio(options);
2928
2658
  };
@@ -2931,21 +2661,17 @@ Audio.PlayerPool = PlayerPool;
2931
2661
 
2932
2662
  var isEventAdded = false;
2933
2663
  var callbacks = [];
2934
-
2935
2664
  var muteInBackground = function muteInBackground() {
2936
2665
  callbacks.forEach(function (cb) {
2937
2666
  cb(document.visibilityState);
2938
2667
  });
2939
2668
  };
2940
-
2941
2669
  function documentHiddenState(callback) {
2942
2670
  callbacks.push(callback);
2943
-
2944
2671
  if (!isEventAdded) {
2945
2672
  isEventAdded = true;
2946
2673
  document.addEventListener('visibilitychange', muteInBackground, false);
2947
2674
  }
2948
-
2949
2675
  return {
2950
2676
  removeCallback: function removeCallback() {
2951
2677
  callbacks = callbacks.filter(function (c) {