pageflow 17.1.0 → 17.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +319 -345
- data/README.md +3 -4
- data/admins/pageflow/accounts.rb +6 -6
- data/admins/pageflow/entry.rb +10 -8
- data/admins/pageflow/membership.rb +11 -11
- data/admins/pageflow/translations.rb +5 -5
- data/app/assets/images/pageflow/admin/icons/comment.svg +1 -0
- data/app/assets/javascripts/pageflow/dist/ui.js +1350 -630
- data/app/assets/javascripts/pageflow/editor/vendor.js +0 -1
- data/app/assets/javascripts/pageflow/ui.js +0 -1
- data/app/assets/stylesheets/pageflow/admin/entry_comments_indicator.scss +45 -0
- data/app/assets/stylesheets/pageflow/admin/permalink_input.scss +8 -1
- data/app/assets/stylesheets/pageflow/admin.scss +1 -0
- data/app/assets/stylesheets/pageflow/animations/spin.scss +9 -0
- data/app/assets/stylesheets/pageflow/animations.scss +1 -0
- data/app/assets/stylesheets/pageflow/editor/background_positioning.scss +21 -5
- data/app/assets/stylesheets/pageflow/editor/base.scss +9 -1
- data/app/assets/stylesheets/pageflow/editor/drop_down_button.scss +13 -1
- data/app/assets/stylesheets/pageflow/editor/edit_configuration_view.scss +5 -0
- data/app/assets/stylesheets/pageflow/editor/file_folders.scss +127 -0
- data/app/assets/stylesheets/pageflow/editor/file_meta_data.scss +0 -1
- data/app/assets/stylesheets/pageflow/editor/file_meta_data_overlay.scss +45 -0
- data/app/assets/stylesheets/pageflow/editor/file_preview.scss +138 -0
- data/app/assets/stylesheets/pageflow/editor/file_references.scss +68 -0
- data/app/assets/stylesheets/pageflow/editor/file_settings_dialog.scss +1 -1
- data/app/assets/stylesheets/pageflow/editor/file_stage_icons.scss +17 -0
- data/app/assets/stylesheets/pageflow/editor/file_stages.scss +25 -32
- data/app/assets/stylesheets/pageflow/editor/file_thumbnails.scss +31 -48
- data/app/assets/stylesheets/pageflow/editor/file_type_pills.scss +73 -0
- data/app/assets/stylesheets/pageflow/editor/files.scss +230 -50
- data/app/assets/stylesheets/pageflow/editor/filtered_files.scss +142 -14
- data/app/assets/stylesheets/pageflow/editor/folder_breadcrumb.scss +40 -0
- data/app/assets/stylesheets/pageflow/editor/info_box.scss +12 -0
- data/app/assets/stylesheets/pageflow/editor/inputs/edit_defaults_button.scss +15 -0
- data/app/assets/stylesheets/pageflow/editor/inputs.scss +1 -0
- data/app/assets/stylesheets/pageflow/editor/list.scss +88 -38
- data/app/assets/stylesheets/pageflow/editor/manage_files.scss +9 -0
- data/app/assets/stylesheets/pageflow/editor/menu.scss +14 -0
- data/app/assets/stylesheets/pageflow/editor/move_to_folder_dialog.scss +83 -0
- data/app/assets/stylesheets/pageflow/mixins/pageflow.scss +9 -5
- data/app/assets/stylesheets/pageflow/ui/color_picker.scss +230 -0
- data/app/assets/stylesheets/pageflow/ui/forms.scss +34 -4
- data/app/assets/stylesheets/pageflow/ui/functions.scss +12 -2
- data/app/assets/stylesheets/pageflow/ui/input/color_input.scss +9 -16
- data/app/assets/stylesheets/pageflow/ui/input/text_area_input.scss +15 -0
- data/app/assets/stylesheets/pageflow/ui/overrides.scss +8 -0
- data/app/assets/stylesheets/pageflow/ui/properties.scss +29 -0
- data/app/assets/stylesheets/pageflow/ui/tabs_view.scss +8 -3
- data/app/assets/stylesheets/pageflow/ui.scss +4 -2
- data/app/controllers/pageflow/editor/entries_controller.rb +1 -0
- data/app/controllers/pageflow/editor/file_folders_controller.rb +80 -0
- data/app/controllers/pageflow/editor/file_import_controller.rb +1 -0
- data/app/controllers/pageflow/editor/files_controller.rb +15 -6
- data/app/controllers/pageflow/editor/oembeds_controller.rb +21 -0
- data/app/controllers/pageflow/entries_controller.rb +17 -13
- data/app/controllers/pageflow/review/comment_thread_reads_controller.rb +30 -0
- data/app/controllers/pageflow/review/comment_threads_controller.rb +60 -0
- data/app/controllers/pageflow/review/comments_controller.rb +53 -0
- data/app/controllers/pageflow/revisions_controller.rb +4 -1
- data/app/helpers/pageflow/admin/entries_helper.rb +40 -0
- data/app/helpers/pageflow/admin/widgets_helper.rb +2 -2
- data/app/helpers/pageflow/common_entry_seed_helper.rb +5 -3
- data/app/helpers/pageflow/editor/config_helper.rb +3 -1
- data/app/helpers/pageflow/entries_helper.rb +24 -42
- data/app/helpers/pageflow/entry_json_seed_helper.rb +4 -4
- data/app/helpers/pageflow/public_i18n_helper.rb +9 -8
- data/app/helpers/pageflow/structured_data_helper.rb +4 -1
- data/app/helpers/pageflow/themes_helper.rb +1 -3
- data/app/helpers/pageflow/widgets_helper.rb +2 -1
- data/app/inputs/pageflow_permalink_input.rb +6 -2
- data/app/models/concerns/pageflow/auto_generated_perma_id.rb +11 -4
- data/app/models/concerns/pageflow/reusable_file.rb +1 -1
- data/app/models/concerns/pageflow/serialization_blacklist.rb +2 -4
- data/app/models/concerns/pageflow/translated_attributes.rb +101 -0
- data/app/models/concerns/pageflow/uploadable_file.rb +1 -1
- data/app/models/pageflow/comment.rb +30 -0
- data/app/models/pageflow/comment_thread.rb +65 -0
- data/app/models/pageflow/comment_thread_read.rb +22 -0
- data/app/models/pageflow/customized_theme.rb +3 -2
- data/app/models/pageflow/draft_entry.rb +20 -8
- data/app/models/pageflow/entry.rb +2 -0
- data/app/models/pageflow/entry_at_revision.rb +9 -1
- data/app/models/pageflow/entry_comment_summary.rb +114 -0
- data/app/models/pageflow/file_folder.rb +74 -0
- data/app/models/pageflow/file_reuse.rb +3 -2
- data/app/models/pageflow/file_usage.rb +8 -0
- data/app/models/pageflow/image_file.rb +24 -20
- data/app/models/pageflow/image_file_url_templates.rb +3 -3
- data/app/models/pageflow/legal_info.rb +38 -0
- data/app/models/pageflow/nested_revision_component_copy.rb +1 -1
- data/app/models/pageflow/permalink.rb +1 -0
- data/app/models/pageflow/revision.rb +6 -2
- data/app/models/pageflow/site.rb +10 -0
- data/app/models/pageflow/used_file.rb +8 -2
- data/app/models/pageflow/widget.rb +2 -2
- data/app/views/pageflow/audio_files/_audio_file.json.jbuilder +0 -1
- data/app/views/pageflow/editor/config/_seeds.json.jbuilder +4 -2
- data/app/views/pageflow/editor/entries/_entry.json.jbuilder +2 -1
- data/app/views/pageflow/editor/entries/seed.json.erb +1 -0
- data/app/views/pageflow/editor/file_folders/_file_folder.json.jbuilder +5 -0
- data/app/views/pageflow/editor/file_folders/create.json.jbuilder +1 -0
- data/app/views/pageflow/editor/file_folders/index.json.jbuilder +3 -0
- data/app/views/pageflow/editor/files/_file.json.jbuilder +2 -1
- data/app/views/pageflow/editor/image_files/_image_file.json.jbuilder +3 -0
- data/app/views/pageflow/editor/video_files/_video_file.json.jbuilder +3 -0
- data/app/views/pageflow/files/_file.json.jbuilder +2 -0
- data/app/views/pageflow/image_files/_image_file.json.jbuilder +0 -1
- data/app/views/pageflow/review/comment_threads/_comment_thread.json.jbuilder +20 -0
- data/app/views/pageflow/review/comment_threads/create.json.jbuilder +2 -0
- data/app/views/pageflow/review/comment_threads/index.json.jbuilder +13 -0
- data/app/views/pageflow/review/comments/_comment.json.jbuilder +13 -0
- data/app/views/pageflow/review/comments/create.json.jbuilder +1 -0
- data/app/views/pageflow/structured_data/_entry.json.jbuilder +2 -3
- data/app/views/pageflow/video_files/_video_file.json.jbuilder +0 -1
- data/config/locales/de.yml +152 -14
- data/config/locales/en.yml +150 -14
- data/config/routes.rb +14 -0
- data/db/migrate/20140418225525_setup_schema.rb +2 -2
- data/db/migrate/20251015000000_add_structured_data_type_name_to_revisions.rb +5 -0
- data/db/migrate/20251029142849_convert_legacy_social_embeds_to_unified_social_embed.rb +38 -0
- data/db/migrate/20251119083347_fix_main_storyline_positions.rb +16 -0
- data/db/migrate/20251119083348_ensure_scrolled_entries_have_excursion_storyline.rb +15 -0
- data/db/migrate/20260303000000_add_layout_version_to_revisions.rb +6 -0
- data/db/migrate/20260323000000_create_comment_threads_and_comments.rb +30 -0
- data/db/migrate/20260414000000_add_subject_range_to_comment_threads.rb +5 -0
- data/db/migrate/20260415000000_add_section_perma_id_to_comment_threads.rb +5 -0
- data/db/migrate/20260727000000_add_quote_to_comments.rb +5 -0
- data/db/migrate/20260728000000_create_file_folders.rb +17 -0
- data/db/migrate/20260805000000_add_attribute_translations_to_sites.rb +5 -0
- data/db/migrate/20260806000000_add_edited_at_to_comments.rb +5 -0
- data/db/migrate/20260810000000_create_pageflow_scrolled_lottie_files.rb +24 -0
- data/db/migrate/20260817000000_create_comment_thread_reads.rb +16 -0
- data/db/migrate/20260819000000_add_unread_comments_since_at_to_users.rb +18 -0
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/editor.js +8665 -3890
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/frontend.js +979 -3571
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-client.js +20199 -28120
- data/entry_types/paged/app/assets/javascripts/pageflow_paged/dist/react-server.js +18652 -26584
- data/entry_types/scrolled/app/assets/stylesheets/pageflow_scrolled/ui.scss +2 -0
- data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/content_elements_controller.rb +33 -3
- data/entry_types/scrolled/app/controllers/pageflow_scrolled/editor/sections_controller.rb +2 -3
- data/entry_types/scrolled/app/controllers/pageflow_scrolled/entries_controller.rb +21 -1
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/cache_helper.rb +3 -3
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/entry_json_seed_helper.rb +7 -5
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/editor/seed_html_helper.rb +5 -2
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/entry_json_seed_helper.rb +13 -5
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/i18n_helper.rb +28 -13
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/packs_helper.rb +26 -11
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/react_server_side_rendering_helper.rb +2 -2
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/sprockets_helper.rb +16 -0
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/themes_helper.rb +174 -3
- data/entry_types/scrolled/app/models/pageflow_scrolled/content_element.rb +49 -7
- data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file.rb +6 -0
- data/entry_types/scrolled/app/models/pageflow_scrolled/lottie_file_url_templates.rb +16 -0
- data/entry_types/scrolled/app/models/pageflow_scrolled/storyline.rb +1 -0
- data/entry_types/scrolled/app/views/pageflow_scrolled/entries/show.html.erb +13 -12
- data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_entry.json.jbuilder +30 -10
- data/entry_types/scrolled/app/views/pageflow_scrolled/entry_json_seed/_theme.json.jbuilder +9 -0
- data/entry_types/scrolled/app/views/pageflow_scrolled/favicons/_entry.html.erb +1 -1
- data/entry_types/scrolled/config/configuration_schemas/pageflow-scrolled.json +414 -0
- data/entry_types/scrolled/config/locales/de.yml +512 -65
- data/entry_types/scrolled/config/locales/en.yml +518 -52
- data/entry_types/scrolled/lib/pageflow_scrolled/additional_seed_data.rb +2 -2
- data/entry_types/scrolled/lib/pageflow_scrolled/configuration.rb +51 -6
- data/entry_types/scrolled/lib/pageflow_scrolled/configuration_schemas.rb +91 -0
- data/entry_types/scrolled/lib/pageflow_scrolled/engine.rb +2 -1
- data/entry_types/scrolled/lib/pageflow_scrolled/entry_file_reference_locations.rb +71 -0
- data/entry_types/scrolled/lib/pageflow_scrolled/entry_structured_data_types/faq_page.rb +58 -0
- data/entry_types/scrolled/lib/pageflow_scrolled/file_reference_locations.rb +69 -0
- data/entry_types/scrolled/lib/pageflow_scrolled/plugin.rb +205 -22
- data/entry_types/scrolled/lib/pageflow_scrolled/react_widget_type.rb +2 -4
- data/entry_types/scrolled/lib/pageflow_scrolled/seeds.rb +56 -36
- data/entry_types/scrolled/lib/pageflow_scrolled/theme_options_default_scale.rb +35 -0
- data/entry_types/scrolled/lib/pageflow_scrolled.rb +13 -0
- data/entry_types/scrolled/lib/tasks/pageflow_scrolled/storybook.rake +19 -1
- data/entry_types/scrolled/package/config/configurationSchemas.js +70 -0
- data/entry_types/scrolled/package/config/rollup/configurationSchemas.js +19 -0
- data/entry_types/scrolled/package/config/webpack.js +72 -0
- data/entry_types/scrolled/package/contentElements/hotspots-frontend.css +1 -1
- data/entry_types/scrolled/package/contentElements/hotspots-frontend.js +1181 -915
- data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.css +1 -0
- data/entry_types/scrolled/package/contentElements/inlineBeforeAfter-frontend.js +219 -0
- data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.css +1 -0
- data/entry_types/scrolled/package/contentElements/lottieAnimation-frontend.js +244 -0
- data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.css +1 -0
- data/entry_types/scrolled/package/contentElements/socialEmbed-frontend.js +823 -0
- data/entry_types/scrolled/package/contentElements/tikTokEmbed-frontend.js +71 -21
- data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.css +1 -0
- data/entry_types/scrolled/package/contentElements/twitterEmbed-frontend.js +277 -0
- data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.css +1 -0
- data/entry_types/scrolled/package/contentElements/videoEmbed-frontend.js +244 -0
- data/entry_types/scrolled/package/contentElements-editor.js +1915 -1097
- data/entry_types/scrolled/package/contentElements-frontend.css +1 -1
- data/entry_types/scrolled/package/contentElements-frontend.js +3093 -1679
- data/entry_types/scrolled/package/editor.css +1 -0
- data/entry_types/scrolled/package/editor.js +8667 -4077
- data/entry_types/scrolled/package/entryState.js +1600 -0
- data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-20c600de.js +1979 -0
- data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-58189220.js +2538 -0
- data/entry_types/scrolled/package/frontend/{PhonePlatformContext-9f76033e.js → PhonePlatformContext-035a99fa.js} +7 -12
- data/entry_types/scrolled/package/frontend/PhonePlatformContext-9da43797.js +33 -0
- data/entry_types/scrolled/package/frontend/Placeholder.module-bf0966b4.js +5267 -0
- data/entry_types/scrolled/package/frontend/Placeholder.module-d22a9335.js +4180 -0
- data/entry_types/scrolled/package/frontend/ThemeIcon-ab834849.js +754 -0
- data/entry_types/scrolled/package/frontend/ThemeIcon-f6cb3a8f.js +773 -0
- data/entry_types/scrolled/package/frontend/{ToggleFullscreenCornerButton-788e9cdb.js → ToggleFullscreenCornerButton-30fd1124.js} +6 -6
- data/entry_types/scrolled/package/frontend/ToggleFullscreenCornerButton-61c25224.js +72 -0
- data/entry_types/scrolled/package/frontend/Viewer-1074fd59.js +147 -0
- data/entry_types/scrolled/package/frontend/Viewer-1482ca34.js +480 -0
- data/entry_types/scrolled/package/frontend/Viewer-70504231.js +210 -0
- data/entry_types/scrolled/package/frontend/{Viewer-0345ce57.js → Viewer-cc8d4072.js} +84 -92
- data/entry_types/scrolled/package/frontend/Wavesurfer-656e3c36.js +302 -0
- data/entry_types/scrolled/package/frontend/Wavesurfer-b753b838.js +385 -0
- data/entry_types/scrolled/package/frontend/commenting.css +1 -0
- data/entry_types/scrolled/package/frontend/extensions-167ae143.js +1455 -0
- data/entry_types/scrolled/package/frontend/extensions-2318f92b.js +5918 -0
- data/entry_types/scrolled/package/frontend/extensions-a461fd13.js +4890 -0
- data/entry_types/scrolled/package/frontend/extensions-c98269fd.js +1982 -0
- data/entry_types/scrolled/package/frontend/i18n-493cd2a6.js +93 -0
- data/entry_types/scrolled/package/frontend/i18n-e06cac14.js +100 -0
- data/entry_types/scrolled/package/frontend/{index-eb670c2f.js → index-2e5546f7.js} +36 -44
- data/entry_types/scrolled/package/frontend/index-de2b418d.js +130 -0
- data/entry_types/scrolled/package/frontend/index.css +1 -1
- data/entry_types/scrolled/package/frontend/index.js +1870 -875
- data/entry_types/scrolled/package/frontend/inlineEditing.css +1 -0
- data/entry_types/scrolled/package/frontend/useContentElementEditorState-a084912e.js +25 -0
- data/entry_types/scrolled/package/frontend/useDelayedBoolean-a387d85b.js +24 -0
- data/entry_types/scrolled/package/frontend/{usePhonePlatform-c2ba875d.js → usePhonePlatform-4ecb96d4.js} +1 -1
- data/entry_types/scrolled/package/frontend/usePhonePlatform-ce9ff08d.js +8 -0
- data/entry_types/scrolled/package/frontend-server.js +20 -209
- data/entry_types/scrolled/package/package.json +5 -3
- data/entry_types/scrolled/package/review.css +1 -0
- data/entry_types/scrolled/package/review.js +3306 -0
- data/entry_types/scrolled/package/testHelpers.js +836 -359
- data/entry_types/scrolled/package/widgets/consentBar.css +1 -1
- data/entry_types/scrolled/package/widgets/consentBar.js +269 -290
- data/entry_types/scrolled/package/widgets/defaultNavigation.css +2 -2
- data/entry_types/scrolled/package/widgets/defaultNavigation.js +911 -352
- data/entry_types/scrolled/package/widgets/excursionSheet.css +1 -1
- data/entry_types/scrolled/package/widgets/excursionSheet.js +87 -124
- data/entry_types/scrolled/package/widgets/iconInlineFileRights.css +1 -1
- data/entry_types/scrolled/package/widgets/iconInlineFileRights.js +62 -29
- data/entry_types/scrolled/package/widgets/iconScrollIndicator.js +32 -13
- data/entry_types/scrolled/package/widgets/mainStorylineSheet.css +1 -1
- data/entry_types/scrolled/package/widgets/mainStorylineSheet.js +56 -100
- data/entry_types/scrolled/package/widgets/textInlineFileRights.css +1 -1
- data/entry_types/scrolled/package/widgets/textInlineFileRights.js +33 -28
- data/entry_types/scrolled/package/widgets-server.js +1 -0
- data/entry_types/scrolled/spec/factories/lottie_files.rb +29 -0
- data/entry_types/scrolled/spec/fixtures/animation.lottie +0 -0
- data/entry_types/scrolled/spec/fixtures/font.woff +0 -0
- data/entry_types/scrolled/spec/fixtures/font.woff2 +0 -0
- data/lib/generators/pageflow/resque/resque_generator.rb +0 -2
- data/lib/pageflow/configuration.rb +49 -7
- data/lib/pageflow/deprecation.rb +19 -0
- data/lib/pageflow/engine.rb +1 -1
- data/lib/pageflow/entries_controller_env_helper.rb +32 -2
- data/lib/pageflow/entry_export_import/entry_serialization.rb +4 -4
- data/lib/pageflow/entry_export_import/page_type_versions.rb +2 -2
- data/lib/pageflow/entry_export_import/revision_serialization/import.rb +10 -0
- data/lib/pageflow/entry_export_import/revision_serialization.rb +3 -0
- data/lib/pageflow/entry_structured_data_types.rb +43 -0
- data/lib/pageflow/entry_type_configuration.rb +1 -0
- data/lib/pageflow/file_type.rb +2 -2
- data/lib/pageflow/file_types.rb +1 -1
- data/lib/pageflow/oembed_providers.rb +42 -0
- data/lib/pageflow/primary_domain_entry_redirect.rb +6 -0
- data/lib/pageflow/rails_version.rb +13 -2
- data/lib/pageflow/themes.rb +41 -0
- data/lib/pageflow/user_mixin.rb +12 -0
- data/lib/pageflow/version.rb +1 -1
- data/lib/pageflow.rb +1 -0
- data/package/config/eslint-rules/documented-in-toc.js +125 -0
- data/package/config/jest/index.js +0 -1
- data/package/config/webpack.js +0 -1
- data/package/config/webpack5.js +0 -1
- data/package/editor.js +4378 -1897
- data/package/frontend.js +647 -886
- data/package/package.json +2 -1
- data/package/review.js +384 -0
- data/package/testHelpers.js +248 -188
- data/package/ui.js +1346 -630
- data/package/vendor/stubs/wysihtml5.js +2 -0
- data/spec/factories/comment_thread_reads.rb +10 -0
- data/spec/factories/comment_threads.rb +10 -0
- data/spec/factories/comments.rb +9 -0
- data/spec/factories/file_folders.rb +8 -0
- data/spec/factories/published_entries.rb +2 -0
- metadata +188 -67
- data/app/assets/stylesheets/pageflow/editor/select_button.scss +0 -51
- data/entry_types/scrolled/app/helpers/pageflow_scrolled/generated_media_queries_helper.rb +0 -55
- data/entry_types/scrolled/package/frontend/FloatingPortalRootProvider-51914be7.js +0 -5439
- data/entry_types/scrolled/package/frontend/ThemeIcon-81f2f066.js +0 -1932
- data/entry_types/scrolled/package/frontend/Viewer-cdc549cc.js +0 -147
- data/entry_types/scrolled/package/frontend/Wavesurfer-1cdc3925.js +0 -313
- data/entry_types/scrolled/package/frontend/components-96660ffd.js +0 -3803
- data/entry_types/scrolled/package/frontend/inherits-539844a6.js +0 -99
- data/entry_types/scrolled/package/frontend/useContentElementEditorState-77fe6c79.js +0 -51
- data/entry_types/scrolled/package/widgets/excursionDialog.css +0 -1
- data/entry_types/scrolled/package/widgets/excursionDialog.js +0 -109
- data/lib/generators/pageflow/resque/templates/resque_enqueue_after_commit_patch.rb +0 -25
- data/package/vendor/jquery.minicolors.js +0 -1108
data/package/frontend.js
CHANGED
|
@@ -1,240 +1,84 @@
|
|
|
1
|
-
import 'core-js/modules/es.array.from';
|
|
2
|
-
import 'core-js/modules/es.array.includes';
|
|
3
|
-
import 'core-js/modules/es.array.iterator';
|
|
4
|
-
import 'core-js/modules/es.object.assign';
|
|
5
|
-
import 'core-js/modules/es.object.entries';
|
|
6
|
-
import 'core-js/modules/es.object.keys';
|
|
7
|
-
import 'core-js/modules/es.object.to-string';
|
|
8
|
-
import 'core-js/modules/es.promise';
|
|
9
|
-
import 'core-js/modules/es.promise.finally';
|
|
10
|
-
import 'core-js/modules/es.string.iterator';
|
|
11
|
-
import 'core-js/modules/esnext.aggregate-error';
|
|
12
|
-
import 'core-js/modules/esnext.promise.all-settled';
|
|
13
|
-
import 'core-js/modules/esnext.promise.any';
|
|
14
|
-
import 'core-js/modules/esnext.promise.try';
|
|
15
|
-
import 'core-js/modules/web.dom-collections.iterator';
|
|
16
|
-
import 'classlist.js';
|
|
17
1
|
import BackboneEvents from 'backbone-events-standalone';
|
|
18
2
|
import VideoJS from 'video.js';
|
|
19
3
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
configurable: true,
|
|
26
|
-
writable: true
|
|
27
|
-
});
|
|
28
|
-
} else {
|
|
29
|
-
obj[key] = value;
|
|
4
|
+
class Persistence {
|
|
5
|
+
constructor({
|
|
6
|
+
cookies
|
|
7
|
+
}) {
|
|
8
|
+
this.cookies = cookies;
|
|
30
9
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
10
|
+
store(vendors, signal) {
|
|
11
|
+
const vendorsByCookieName = vendors.reduce((sorted, vendor) => {
|
|
12
|
+
const cookieName = vendor.cookieName;
|
|
13
|
+
sorted[cookieName] = sorted[cookieName] || [];
|
|
14
|
+
sorted[cookieName].push(vendor);
|
|
15
|
+
return sorted;
|
|
16
|
+
}, {});
|
|
17
|
+
Object.entries(vendorsByCookieName).forEach(([cookieName, vendors]) => {
|
|
18
|
+
const cookieDomain = vendors[0].cookieDomain;
|
|
19
|
+
this.setCookie(cookieName, JSON.stringify(vendors.reduce((result, vendor) => {
|
|
20
|
+
result[vendor.cookieKey || vendor.name] = signal === 'accepted' ? true : signal === 'denied' ? false : signal[vendor.name];
|
|
21
|
+
return result;
|
|
22
|
+
}, {})), cookieDomain);
|
|
42
23
|
});
|
|
43
|
-
keys.push.apply(keys, symbols);
|
|
44
24
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
throw new TypeError("Cannot call a class as a function");
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function _defineProperties(target, props) {
|
|
76
|
-
for (var i = 0; i < props.length; i++) {
|
|
77
|
-
var descriptor = props[i];
|
|
78
|
-
descriptor.enumerable = descriptor.enumerable || false;
|
|
79
|
-
descriptor.configurable = true;
|
|
80
|
-
if ("value" in descriptor) descriptor.writable = true;
|
|
81
|
-
Object.defineProperty(target, descriptor.key, descriptor);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function _createClass(Constructor, protoProps, staticProps) {
|
|
86
|
-
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
87
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
88
|
-
return Constructor;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function _arrayWithHoles(arr) {
|
|
92
|
-
if (Array.isArray(arr)) return arr;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function _iterableToArrayLimit(arr, i) {
|
|
96
|
-
if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
|
|
97
|
-
var _arr = [];
|
|
98
|
-
var _n = true;
|
|
99
|
-
var _d = false;
|
|
100
|
-
var _e = undefined;
|
|
101
|
-
|
|
102
|
-
try {
|
|
103
|
-
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
|
|
104
|
-
_arr.push(_s.value);
|
|
105
|
-
|
|
106
|
-
if (i && _arr.length === i) break;
|
|
107
|
-
}
|
|
108
|
-
} catch (err) {
|
|
109
|
-
_d = true;
|
|
110
|
-
_e = err;
|
|
111
|
-
} finally {
|
|
112
|
-
try {
|
|
113
|
-
if (!_n && _i["return"] != null) _i["return"]();
|
|
114
|
-
} finally {
|
|
115
|
-
if (_d) throw _e;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return _arr;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function _arrayLikeToArray(arr, len) {
|
|
123
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
124
|
-
|
|
125
|
-
for (var i = 0, arr2 = new Array(len); i < len; i++) {
|
|
126
|
-
arr2[i] = arr[i];
|
|
25
|
+
update(vendor, signal) {
|
|
26
|
+
const content = this.cookies.getItem(vendor.cookieName);
|
|
27
|
+
const flags = content ? JSON.parse(content) : {};
|
|
28
|
+
this.setCookie(vendor.cookieName, JSON.stringify({
|
|
29
|
+
...flags,
|
|
30
|
+
[vendor.cookieKey || vendor.name]: signal
|
|
31
|
+
}), vendor.cookieDomain);
|
|
32
|
+
}
|
|
33
|
+
read(vendor) {
|
|
34
|
+
const content = this.cookies.getItem(vendor.cookieName);
|
|
35
|
+
const flags = content ? JSON.parse(content) : {};
|
|
36
|
+
const flag = flags[vendor.cookieKey || vendor.name];
|
|
37
|
+
return flag === true ? 'accepted' : flag === false ? 'denied' : 'undecided';
|
|
38
|
+
}
|
|
39
|
+
setCookie(name, value, domain) {
|
|
40
|
+
if (domain && !window.location.hostname.match(new RegExp(`${domain}$`))) {
|
|
41
|
+
domain = null;
|
|
42
|
+
}
|
|
43
|
+
this.cookies.setItem(name, value, {
|
|
44
|
+
path: '/',
|
|
45
|
+
domain,
|
|
46
|
+
expires: Infinity,
|
|
47
|
+
// Ensure cookie can be read iframe embed
|
|
48
|
+
sameSite: 'None',
|
|
49
|
+
secure: true
|
|
50
|
+
});
|
|
127
51
|
}
|
|
128
|
-
|
|
129
|
-
return arr2;
|
|
130
52
|
}
|
|
131
53
|
|
|
132
|
-
function _unsupportedIterableToArray(o, minLen) {
|
|
133
|
-
if (!o) return;
|
|
134
|
-
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
135
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
136
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
137
|
-
if (n === "Map" || n === "Set") return Array.from(n);
|
|
138
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function _nonIterableRest() {
|
|
142
|
-
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
function _slicedToArray(arr, i) {
|
|
146
|
-
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
var Persistence = /*#__PURE__*/function () {
|
|
150
|
-
function Persistence(_ref) {
|
|
151
|
-
var cookies = _ref.cookies;
|
|
152
|
-
_classCallCheck(this, Persistence);
|
|
153
|
-
this.cookies = cookies;
|
|
154
|
-
}
|
|
155
|
-
_createClass(Persistence, [{
|
|
156
|
-
key: "store",
|
|
157
|
-
value: function store(vendors, signal) {
|
|
158
|
-
var _this = this;
|
|
159
|
-
var vendorsByCookieName = vendors.reduce(function (sorted, vendor) {
|
|
160
|
-
var cookieName = vendor.cookieName;
|
|
161
|
-
sorted[cookieName] = sorted[cookieName] || [];
|
|
162
|
-
sorted[cookieName].push(vendor);
|
|
163
|
-
return sorted;
|
|
164
|
-
}, {});
|
|
165
|
-
Object.entries(vendorsByCookieName).forEach(function (_ref2) {
|
|
166
|
-
var _ref3 = _slicedToArray(_ref2, 2),
|
|
167
|
-
cookieName = _ref3[0],
|
|
168
|
-
vendors = _ref3[1];
|
|
169
|
-
var cookieDomain = vendors[0].cookieDomain;
|
|
170
|
-
_this.setCookie(cookieName, JSON.stringify(vendors.reduce(function (result, vendor) {
|
|
171
|
-
result[vendor.cookieKey || vendor.name] = signal === 'accepted' ? true : signal === 'denied' ? false : signal[vendor.name];
|
|
172
|
-
return result;
|
|
173
|
-
}, {})), cookieDomain);
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
}, {
|
|
177
|
-
key: "update",
|
|
178
|
-
value: function update(vendor, signal) {
|
|
179
|
-
var content = this.cookies.getItem(vendor.cookieName);
|
|
180
|
-
var flags = content ? JSON.parse(content) : {};
|
|
181
|
-
this.setCookie(vendor.cookieName, JSON.stringify(_objectSpread2(_objectSpread2({}, flags), {}, _defineProperty({}, vendor.cookieKey || vendor.name, signal))), vendor.cookieDomain);
|
|
182
|
-
}
|
|
183
|
-
}, {
|
|
184
|
-
key: "read",
|
|
185
|
-
value: function read(vendor) {
|
|
186
|
-
var content = this.cookies.getItem(vendor.cookieName);
|
|
187
|
-
var flags = content ? JSON.parse(content) : {};
|
|
188
|
-
var flag = flags[vendor.cookieKey || vendor.name];
|
|
189
|
-
return flag === true ? 'accepted' : flag === false ? 'denied' : 'undecided';
|
|
190
|
-
}
|
|
191
|
-
}, {
|
|
192
|
-
key: "setCookie",
|
|
193
|
-
value: function setCookie(name, value, domain) {
|
|
194
|
-
if (domain && !window.location.hostname.match(new RegExp("".concat(domain, "$")))) {
|
|
195
|
-
domain = null;
|
|
196
|
-
}
|
|
197
|
-
this.cookies.setItem(name, value, {
|
|
198
|
-
path: '/',
|
|
199
|
-
domain: domain,
|
|
200
|
-
expires: Infinity,
|
|
201
|
-
// Ensure cookie can be read iframe embed
|
|
202
|
-
sameSite: 'None',
|
|
203
|
-
secure: true
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}]);
|
|
207
|
-
return Persistence;
|
|
208
|
-
}();
|
|
209
|
-
|
|
210
54
|
// https://developer.mozilla.org/en-US/docs/Web/API/document.cookie
|
|
211
|
-
|
|
212
|
-
getItem: function
|
|
55
|
+
const cookies = {
|
|
56
|
+
getItem: function (sKey) {
|
|
213
57
|
if (!sKey) {
|
|
214
58
|
return null;
|
|
215
59
|
}
|
|
216
60
|
// eslint-disable-next-line no-useless-escape
|
|
217
61
|
return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
|
|
218
62
|
},
|
|
219
|
-
setItem
|
|
220
|
-
document.cookie = setItemCookieString
|
|
63
|
+
setItem(...args) {
|
|
64
|
+
document.cookie = setItemCookieString(...args);
|
|
221
65
|
return true;
|
|
222
66
|
},
|
|
223
|
-
removeItem: function
|
|
67
|
+
removeItem: function (sKey, sPath, sDomain) {
|
|
224
68
|
if (!this.hasItem(sKey)) {
|
|
225
69
|
return false;
|
|
226
70
|
}
|
|
227
71
|
document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "");
|
|
228
72
|
return true;
|
|
229
73
|
},
|
|
230
|
-
hasItem: function
|
|
74
|
+
hasItem: function (sKey) {
|
|
231
75
|
if (!sKey) {
|
|
232
76
|
return false;
|
|
233
77
|
}
|
|
234
78
|
// eslint-disable-next-line no-useless-escape
|
|
235
79
|
return new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=").test(document.cookie);
|
|
236
80
|
},
|
|
237
|
-
keys: function
|
|
81
|
+
keys: function () {
|
|
238
82
|
// eslint-disable-next-line no-useless-escape
|
|
239
83
|
var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
|
|
240
84
|
for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) {
|
|
@@ -249,19 +93,20 @@ function setItemCookieString(key, value, expiresOrOptions, path, domain, secure)
|
|
|
249
93
|
} else {
|
|
250
94
|
return setItemCookieStringWithOptions(key, value, {
|
|
251
95
|
expires: expiresOrOptions,
|
|
252
|
-
path
|
|
253
|
-
domain
|
|
254
|
-
secure
|
|
96
|
+
path,
|
|
97
|
+
domain,
|
|
98
|
+
secure
|
|
255
99
|
});
|
|
256
100
|
}
|
|
257
101
|
}
|
|
258
|
-
function setItemCookieStringWithOptions(key, value,
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
102
|
+
function setItemCookieStringWithOptions(key, value, {
|
|
103
|
+
expires,
|
|
104
|
+
path,
|
|
105
|
+
domain,
|
|
106
|
+
secure,
|
|
107
|
+
sameSite
|
|
108
|
+
}) {
|
|
109
|
+
let expiresPart = "";
|
|
265
110
|
if (expires) {
|
|
266
111
|
switch (expires.constructor) {
|
|
267
112
|
case Number:
|
|
@@ -278,284 +123,242 @@ function setItemCookieStringWithOptions(key, value, _ref) {
|
|
|
278
123
|
return encodeURIComponent(key) + "=" + encodeURIComponent(value) + expiresPart + (domain ? "; domain=" + domain : "") + (path ? "; path=" + path : "") + (sameSite ? "; SameSite=" + sameSite : "") + (secure ? "; Secure" : "");
|
|
279
124
|
}
|
|
280
125
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
_this.requestedPromiseResolve = resolve;
|
|
126
|
+
const supportedParadigms = ['external opt-out', 'opt-in', 'lazy opt-in', 'skip'];
|
|
127
|
+
class Consent {
|
|
128
|
+
constructor({
|
|
129
|
+
cookies,
|
|
130
|
+
inEditor
|
|
131
|
+
}) {
|
|
132
|
+
this.requestedPromise = new Promise(resolve => {
|
|
133
|
+
this.requestedPromiseResolve = resolve;
|
|
290
134
|
});
|
|
291
135
|
this.vendors = [];
|
|
292
136
|
this.persistence = new Persistence({
|
|
293
|
-
cookies
|
|
137
|
+
cookies
|
|
294
138
|
});
|
|
295
|
-
this.emitter =
|
|
139
|
+
this.emitter = {
|
|
140
|
+
...BackboneEvents
|
|
141
|
+
};
|
|
296
142
|
this.inEditor = inEditor;
|
|
297
143
|
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
144
|
+
registerVendor(name, {
|
|
145
|
+
displayName,
|
|
146
|
+
description,
|
|
147
|
+
paradigm,
|
|
148
|
+
cookieName,
|
|
149
|
+
cookieKey,
|
|
150
|
+
cookieDomain
|
|
151
|
+
}) {
|
|
152
|
+
if (this.vendorRegistrationClosed) {
|
|
153
|
+
throw new Error(`Vendor ${name} has been registered after ` + 'registration has been closed.');
|
|
154
|
+
}
|
|
155
|
+
if (!name.match(/^[a-z0-9-_]+$/i)) {
|
|
156
|
+
throw new Error(`Invalid vendor name '${name}'. ` + 'Only letters, numbers, hyphens and underscores are allowed.');
|
|
157
|
+
}
|
|
158
|
+
if (supportedParadigms.indexOf(paradigm) < 0) {
|
|
159
|
+
throw new Error(`unknown paradigm ${paradigm}`);
|
|
160
|
+
}
|
|
161
|
+
this.vendors.push({
|
|
162
|
+
displayName,
|
|
163
|
+
description,
|
|
164
|
+
name,
|
|
165
|
+
paradigm,
|
|
166
|
+
cookieName: cookieName || 'pageflow_consent',
|
|
167
|
+
cookieKey,
|
|
168
|
+
cookieDomain
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
closeVendorRegistration() {
|
|
172
|
+
this.vendorRegistrationClosed = true;
|
|
173
|
+
if (!this.getUndecidedOptInVendors().length) {
|
|
174
|
+
this.triggerDecisionEvents();
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const vendors = this.getRequestedVendors();
|
|
178
|
+
this.requestedPromiseResolve({
|
|
179
|
+
vendors: this.withState(vendors),
|
|
180
|
+
acceptAll: () => {
|
|
181
|
+
this.persistence.store(vendors, 'accepted');
|
|
182
|
+
this.triggerDecisionEvents();
|
|
183
|
+
},
|
|
184
|
+
denyAll: () => {
|
|
185
|
+
this.persistence.store(vendors, 'denied');
|
|
186
|
+
this.triggerDecisionEvents();
|
|
187
|
+
},
|
|
188
|
+
save: vendorConsent => {
|
|
189
|
+
this.persistence.store(vendors, vendorConsent);
|
|
332
190
|
this.triggerDecisionEvents();
|
|
333
|
-
return;
|
|
334
191
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
relevantVendors({
|
|
195
|
+
include: additionalVendorNames
|
|
196
|
+
} = {}) {
|
|
197
|
+
return this.withState(this.vendors.filter(vendor => {
|
|
198
|
+
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' && this.persistence.read(vendor) !== 'undecided';
|
|
199
|
+
}), {
|
|
200
|
+
applyDefaults: true
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
require(vendorName) {
|
|
204
|
+
if (this.inEditor) {
|
|
205
|
+
return Promise.resolve('fulfilled');
|
|
206
|
+
}
|
|
207
|
+
const vendor = this.findVendor(vendorName, 'require consent for');
|
|
208
|
+
switch (vendor.paradigm) {
|
|
209
|
+
case 'opt-in':
|
|
210
|
+
case 'lazy opt-in':
|
|
211
|
+
if (this.getUndecidedOptInVendors().length) {
|
|
212
|
+
return new Promise(resolve => {
|
|
213
|
+
this.emitter.once(`${vendor.name}:accepted`, () => resolve('fulfilled'));
|
|
214
|
+
this.emitter.once(`${vendor.name}:denied`, () => resolve('failed'));
|
|
215
|
+
});
|
|
349
216
|
}
|
|
350
|
-
|
|
351
|
-
}
|
|
352
|
-
}, {
|
|
353
|
-
key: "relevantVendors",
|
|
354
|
-
value: function relevantVendors() {
|
|
355
|
-
var _this3 = this;
|
|
356
|
-
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
357
|
-
additionalVendorNames = _ref3.include;
|
|
358
|
-
return this.withState(this.vendors.filter(function (vendor) {
|
|
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';
|
|
360
|
-
}), {
|
|
361
|
-
applyDefaults: true
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
}, {
|
|
365
|
-
key: "require",
|
|
366
|
-
value: function require(vendorName) {
|
|
367
|
-
var _this4 = this;
|
|
368
|
-
if (this.inEditor) {
|
|
369
|
-
return Promise.resolve('fulfilled');
|
|
370
|
-
}
|
|
371
|
-
var vendor = this.findVendor(vendorName, 'require consent for');
|
|
372
|
-
switch (vendor.paradigm) {
|
|
373
|
-
case 'opt-in':
|
|
374
|
-
case 'lazy opt-in':
|
|
375
|
-
if (this.getUndecidedOptInVendors().length) {
|
|
376
|
-
return new Promise(function (resolve) {
|
|
377
|
-
_this4.emitter.once("".concat(vendor.name, ":accepted"), function () {
|
|
378
|
-
return resolve('fulfilled');
|
|
379
|
-
});
|
|
380
|
-
_this4.emitter.once("".concat(vendor.name, ":denied"), function () {
|
|
381
|
-
return resolve('failed');
|
|
382
|
-
});
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
if (this.persistence.read(vendor) === 'accepted') {
|
|
386
|
-
return Promise.resolve('fulfilled');
|
|
387
|
-
} else {
|
|
388
|
-
return Promise.resolve('failed');
|
|
389
|
-
}
|
|
390
|
-
case 'external opt-out':
|
|
391
|
-
if (this.persistence.read(vendor) === 'denied') {
|
|
392
|
-
return Promise.resolve('failed');
|
|
393
|
-
}
|
|
217
|
+
if (this.persistence.read(vendor) === 'accepted') {
|
|
394
218
|
return Promise.resolve('fulfilled');
|
|
395
|
-
|
|
396
|
-
return Promise.resolve('
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
}
|
|
402
|
-
}, {
|
|
403
|
-
key: "requireAccepted",
|
|
404
|
-
value: function requireAccepted(vendorName) {
|
|
405
|
-
var _this5 = this;
|
|
406
|
-
if (this.inEditor) {
|
|
407
|
-
return Promise.resolve('fulfilled');
|
|
408
|
-
}
|
|
409
|
-
var vendor = this.findVendor(vendorName, 'require consent for');
|
|
410
|
-
if (vendor.paradigm === 'opt-in' || vendor.paradigm === 'lazy opt-in') {
|
|
411
|
-
if (this.getUndecidedOptInVendors().length || this.persistence.read(vendor) !== 'accepted') {
|
|
412
|
-
return new Promise(function (resolve) {
|
|
413
|
-
_this5.emitter.once("".concat(vendor.name, ":accepted"), function () {
|
|
414
|
-
return resolve('fulfilled');
|
|
415
|
-
});
|
|
416
|
-
});
|
|
219
|
+
} else {
|
|
220
|
+
return Promise.resolve('failed');
|
|
221
|
+
}
|
|
222
|
+
case 'external opt-out':
|
|
223
|
+
if (this.persistence.read(vendor) === 'denied') {
|
|
224
|
+
return Promise.resolve('failed');
|
|
417
225
|
}
|
|
418
226
|
return Promise.resolve('fulfilled');
|
|
419
|
-
|
|
420
|
-
return
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
key: "requested",
|
|
425
|
-
value: function requested() {
|
|
426
|
-
return this.requestedPromise;
|
|
427
|
-
}
|
|
428
|
-
}, {
|
|
429
|
-
key: "accept",
|
|
430
|
-
value: function accept(vendorName) {
|
|
431
|
-
var vendor = this.findVendor(vendorName, 'accept');
|
|
432
|
-
this.persistence.update(vendor, true);
|
|
433
|
-
this.emitter.trigger("".concat(vendor.name, ":accepted"));
|
|
434
|
-
}
|
|
435
|
-
}, {
|
|
436
|
-
key: "deny",
|
|
437
|
-
value: function deny(vendorName) {
|
|
438
|
-
var vendor = this.findVendor(vendorName, 'deny');
|
|
439
|
-
this.persistence.update(vendor, false);
|
|
440
|
-
}
|
|
441
|
-
}, {
|
|
442
|
-
key: "getRequestedVendors",
|
|
443
|
-
value: function getRequestedVendors() {
|
|
444
|
-
return this.vendors.filter(function (vendor) {
|
|
445
|
-
return vendor.paradigm !== 'skip';
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
}, {
|
|
449
|
-
key: "getUndecidedOptInVendors",
|
|
450
|
-
value: function getUndecidedOptInVendors() {
|
|
451
|
-
var _this6 = this;
|
|
452
|
-
return this.vendors.filter(function (vendor) {
|
|
453
|
-
return vendor.paradigm === 'opt-in' && _this6.persistence.read(vendor) === 'undecided';
|
|
454
|
-
});
|
|
227
|
+
case 'skip':
|
|
228
|
+
return Promise.resolve('fulfilled');
|
|
229
|
+
default:
|
|
230
|
+
// should not be used
|
|
231
|
+
return null;
|
|
455
232
|
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
this.vendors.filter(function (vendor) {
|
|
461
|
-
return vendor.paradigm !== 'skip';
|
|
462
|
-
}).forEach(function (vendor) {
|
|
463
|
-
_this7.emitter.trigger("".concat(vendor.name, ":").concat(_this7.persistence.read(vendor)));
|
|
464
|
-
});
|
|
233
|
+
}
|
|
234
|
+
requireAccepted(vendorName) {
|
|
235
|
+
if (this.inEditor) {
|
|
236
|
+
return Promise.resolve('fulfilled');
|
|
465
237
|
}
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
});
|
|
472
|
-
if (!vendor) {
|
|
473
|
-
throw new Error("Cannot ".concat(actionForErrorMessage, " unknown vendor \"").concat(vendorName, "\". ") + 'Consider using consent.registerVendor.');
|
|
474
|
-
}
|
|
475
|
-
return vendor;
|
|
476
|
-
}
|
|
477
|
-
}, {
|
|
478
|
-
key: "withState",
|
|
479
|
-
value: function withState(vendors) {
|
|
480
|
-
var _this8 = this;
|
|
481
|
-
var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
482
|
-
applyDefaults = _ref4.applyDefaults;
|
|
483
|
-
return vendors.map(function (vendor) {
|
|
484
|
-
var state = _this8.persistence.read(vendor);
|
|
485
|
-
return _objectSpread2(_objectSpread2({}, vendor), {}, {
|
|
486
|
-
state: state === 'undecided' && applyDefaults ? _this8.getDefaultState(vendor) : state
|
|
238
|
+
const vendor = this.findVendor(vendorName, 'require consent for');
|
|
239
|
+
if (vendor.paradigm === 'opt-in' || vendor.paradigm === 'lazy opt-in') {
|
|
240
|
+
if (this.getUndecidedOptInVendors().length || this.persistence.read(vendor) !== 'accepted') {
|
|
241
|
+
return new Promise(resolve => {
|
|
242
|
+
this.emitter.once(`${vendor.name}:accepted`, () => resolve('fulfilled'));
|
|
487
243
|
});
|
|
488
|
-
});
|
|
489
|
-
}
|
|
490
|
-
}, {
|
|
491
|
-
key: "getDefaultState",
|
|
492
|
-
value: function getDefaultState(vendor) {
|
|
493
|
-
if (vendor.paradigm === 'external opt-out') {
|
|
494
|
-
return 'accepted';
|
|
495
244
|
}
|
|
496
|
-
return '
|
|
245
|
+
return Promise.resolve('fulfilled');
|
|
246
|
+
} else {
|
|
247
|
+
return this.require(vendorName);
|
|
497
248
|
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
|
|
249
|
+
}
|
|
250
|
+
requested() {
|
|
251
|
+
return this.requestedPromise;
|
|
252
|
+
}
|
|
253
|
+
accept(vendorName) {
|
|
254
|
+
const vendor = this.findVendor(vendorName, 'accept');
|
|
255
|
+
this.persistence.update(vendor, true);
|
|
256
|
+
this.emitter.trigger(`${vendor.name}:accepted`);
|
|
257
|
+
}
|
|
258
|
+
deny(vendorName) {
|
|
259
|
+
const vendor = this.findVendor(vendorName, 'deny');
|
|
260
|
+
this.persistence.update(vendor, false);
|
|
261
|
+
}
|
|
262
|
+
getRequestedVendors() {
|
|
263
|
+
return this.vendors.filter(vendor => {
|
|
264
|
+
return vendor.paradigm !== 'skip';
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
getUndecidedOptInVendors() {
|
|
268
|
+
return this.vendors.filter(vendor => {
|
|
269
|
+
return vendor.paradigm === 'opt-in' && this.persistence.read(vendor) === 'undecided';
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
triggerDecisionEvents() {
|
|
273
|
+
this.vendors.filter(vendor => {
|
|
274
|
+
return vendor.paradigm !== 'skip';
|
|
275
|
+
}).forEach(vendor => {
|
|
276
|
+
this.emitter.trigger(`${vendor.name}:${this.persistence.read(vendor)}`);
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
findVendor(vendorName, actionForErrorMessage) {
|
|
280
|
+
const vendor = this.vendors.find(vendor => vendor.name === vendorName);
|
|
281
|
+
if (!vendor) {
|
|
282
|
+
throw new Error(`Cannot ${actionForErrorMessage} unknown vendor "${vendorName}". ` + 'Consider using consent.registerVendor.');
|
|
283
|
+
}
|
|
284
|
+
return vendor;
|
|
285
|
+
}
|
|
286
|
+
withState(vendors, {
|
|
287
|
+
applyDefaults
|
|
288
|
+
} = {}) {
|
|
289
|
+
return vendors.map(vendor => {
|
|
290
|
+
const state = this.persistence.read(vendor);
|
|
291
|
+
return {
|
|
292
|
+
...vendor,
|
|
293
|
+
state: state === 'undecided' && applyDefaults ? this.getDefaultState(vendor) : state
|
|
294
|
+
};
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
getDefaultState(vendor) {
|
|
298
|
+
if (vendor.paradigm === 'external opt-out') {
|
|
299
|
+
return 'accepted';
|
|
300
|
+
}
|
|
301
|
+
return 'undecided';
|
|
302
|
+
}
|
|
303
|
+
}
|
|
501
304
|
Consent.create = function () {
|
|
502
|
-
|
|
305
|
+
const inEditor = typeof PAGEFLOW_EDITOR !== 'undefined' && PAGEFLOW_EDITOR;
|
|
503
306
|
return new Consent({
|
|
504
|
-
cookies
|
|
505
|
-
inEditor
|
|
307
|
+
cookies,
|
|
308
|
+
inEditor
|
|
506
309
|
});
|
|
507
310
|
};
|
|
508
311
|
|
|
509
|
-
|
|
312
|
+
const log = function (text, options) {
|
|
510
313
|
if (window.console && (debugMode() || options && options.force)) {
|
|
511
314
|
window.console.log(text);
|
|
512
315
|
}
|
|
513
316
|
};
|
|
514
|
-
|
|
317
|
+
const debugMode = function () {
|
|
515
318
|
return window.location.href.indexOf('debug=true') >= 0;
|
|
516
319
|
};
|
|
517
320
|
|
|
518
|
-
|
|
321
|
+
const state = typeof window !== 'undefined' && window.pageflow || {};
|
|
519
322
|
|
|
520
|
-
|
|
323
|
+
const assetUrls = state.assetUrls || {};
|
|
521
324
|
|
|
522
|
-
|
|
325
|
+
const events = Object.assign({}, BackboneEvents);
|
|
523
326
|
|
|
524
327
|
/**
|
|
525
328
|
* Detect browser via user agent. Use only if feature detection is not
|
|
526
329
|
* an option.
|
|
527
330
|
*/
|
|
528
|
-
|
|
331
|
+
const Agent = function (userAgent) {
|
|
529
332
|
return {
|
|
530
|
-
matchesSilk: function
|
|
333
|
+
matchesSilk: function () {
|
|
531
334
|
return matches(/\bSilk\b/);
|
|
532
335
|
},
|
|
533
|
-
matchesDesktopSafari: function
|
|
336
|
+
matchesDesktopSafari: function (options) {
|
|
534
337
|
if (options) {
|
|
535
338
|
return this.matchesSafari() && !this.matchesMobilePlatform() && matchesMinVersion(/Version\/(\d+)/i, options.minVersion);
|
|
536
339
|
} else {
|
|
537
340
|
return this.matchesSafari() && !this.matchesMobilePlatform();
|
|
538
341
|
}
|
|
539
342
|
},
|
|
540
|
-
matchesDesktopSafari9: function
|
|
343
|
+
matchesDesktopSafari9: function () {
|
|
541
344
|
return this.matchesSafari9() && !this.matchesMobilePlatform();
|
|
542
345
|
},
|
|
543
|
-
matchesDesktopSafari10: function
|
|
346
|
+
matchesDesktopSafari10: function () {
|
|
544
347
|
return this.matchesSafari10() && !this.matchesMobilePlatform();
|
|
545
348
|
},
|
|
546
|
-
matchesSafari9: function
|
|
349
|
+
matchesSafari9: function () {
|
|
547
350
|
return this.matchesSafari() && matches(/Version\/9/i);
|
|
548
351
|
},
|
|
549
|
-
matchesSafari10: function
|
|
352
|
+
matchesSafari10: function () {
|
|
550
353
|
return this.matchesSafari() && matches(/Version\/10/i);
|
|
551
354
|
},
|
|
552
|
-
matchesSafari11: function
|
|
355
|
+
matchesSafari11: function () {
|
|
553
356
|
return this.matchesSafari() && matches(/Version\/11/i);
|
|
554
357
|
},
|
|
555
|
-
matchesSafari11AndAbove: function
|
|
358
|
+
matchesSafari11AndAbove: function () {
|
|
556
359
|
return this.matchesSafari() && matchesMinVersion(/Version\/(\d+)/i, 11);
|
|
557
360
|
},
|
|
558
|
-
matchesSafari: function
|
|
361
|
+
matchesSafari: function () {
|
|
559
362
|
// - Chrome also reports to be a Safari
|
|
560
363
|
// - Safari does not report to be a Chrome
|
|
561
364
|
// - Edge also reports to be a Safari, but also reports to be Chrome
|
|
@@ -565,20 +368,14 @@ var Agent = function Agent(userAgent) {
|
|
|
565
368
|
* Returns true on iOS Safari.
|
|
566
369
|
* @return {boolean}
|
|
567
370
|
*/
|
|
568
|
-
matchesMobileSafari: function
|
|
569
|
-
|
|
570
|
-
|
|
371
|
+
matchesMobileSafari: function ({
|
|
372
|
+
osVersions
|
|
373
|
+
} = {}) {
|
|
571
374
|
var deviceMatchers = [/iPod/i, /iPad/i, /iPhone/i];
|
|
572
375
|
if (osVersions) {
|
|
573
|
-
return deviceMatchers.some(
|
|
574
|
-
return userAgent.match(matcher);
|
|
575
|
-
}) && osVersions.some(function (osVersion) {
|
|
576
|
-
return userAgent.includes(osVersion.replace('.', '_'));
|
|
577
|
-
});
|
|
376
|
+
return deviceMatchers.some(matcher => userAgent.match(matcher)) && osVersions.some(osVersion => userAgent.includes(osVersion.replace('.', '_')));
|
|
578
377
|
} else {
|
|
579
|
-
return matchesiPadSafari13AndAbove() || deviceMatchers.some(
|
|
580
|
-
return userAgent.match(matcher);
|
|
581
|
-
}) && !window.MSStream // IE exclusion from being detected as an iOS device;
|
|
378
|
+
return matchesiPadSafari13AndAbove() || deviceMatchers.some(matcher => userAgent.match(matcher)) && !window.MSStream // IE exclusion from being detected as an iOS device;
|
|
582
379
|
;
|
|
583
380
|
}
|
|
584
381
|
},
|
|
@@ -586,14 +383,14 @@ var Agent = function Agent(userAgent) {
|
|
|
586
383
|
* Returns true on Android.
|
|
587
384
|
* @return {boolean}
|
|
588
385
|
*/
|
|
589
|
-
matchesAndroid: function
|
|
386
|
+
matchesAndroid: function () {
|
|
590
387
|
return matches(/Android/i);
|
|
591
388
|
},
|
|
592
389
|
/**
|
|
593
390
|
* Returns true on iOS or Android.
|
|
594
391
|
* @return {boolean}
|
|
595
392
|
*/
|
|
596
|
-
matchesMobilePlatform: function
|
|
393
|
+
matchesMobilePlatform: function () {
|
|
597
394
|
var matchers = [/iPod/i, /iPad/i, /iPhone/i, /Android/i, /Silk/i, /IEMobile/i];
|
|
598
395
|
return matchers.some(function (matcher) {
|
|
599
396
|
return userAgent.match(matcher);
|
|
@@ -603,31 +400,31 @@ var Agent = function Agent(userAgent) {
|
|
|
603
400
|
* Returns true on Internet Explorser version 9, 10 and 11.
|
|
604
401
|
* @return {boolean}
|
|
605
402
|
*/
|
|
606
|
-
matchesIEUpTo11: function
|
|
403
|
+
matchesIEUpTo11: function () {
|
|
607
404
|
return userAgent.match(/Trident\//);
|
|
608
405
|
},
|
|
609
406
|
/**
|
|
610
407
|
* Returns true in InApp browser of Facebook app.
|
|
611
408
|
* @return {boolean}
|
|
612
409
|
*/
|
|
613
|
-
matchesFacebookInAppBrowser: function
|
|
410
|
+
matchesFacebookInAppBrowser: function () {
|
|
614
411
|
return userAgent.match(/FBAN/) && userAgent.match(/FBAV/);
|
|
615
412
|
},
|
|
616
|
-
matchesDesktopChrome: function
|
|
413
|
+
matchesDesktopChrome: function (options) {
|
|
617
414
|
if (options) {
|
|
618
415
|
return this.matchesChrome() && !this.matchesMobilePlatform() && matchesMinVersion(/Chrome\/(\d+)/i, options.minVersion);
|
|
619
416
|
} else {
|
|
620
417
|
return this.matchesChrome() && !this.matchesMobilePlatform();
|
|
621
418
|
}
|
|
622
419
|
},
|
|
623
|
-
matchesDesktopFirefox: function
|
|
420
|
+
matchesDesktopFirefox: function (options) {
|
|
624
421
|
if (options) {
|
|
625
422
|
return this.matchesFirefox() && !this.matchesMobilePlatform() && matchesMinVersion(/Firefox\/(\d+)/i, options.minVersion);
|
|
626
423
|
} else {
|
|
627
424
|
return this.matchesFirefox() && !this.matchesMobilePlatform();
|
|
628
425
|
}
|
|
629
426
|
},
|
|
630
|
-
matchesDesktopEdge: function
|
|
427
|
+
matchesDesktopEdge: function (options) {
|
|
631
428
|
if (options) {
|
|
632
429
|
return this.matchesEdge() && !this.matchesMobilePlatform() && matchesMinVersion(/Edg\/(\d+)/i, options.minVersion);
|
|
633
430
|
} else {
|
|
@@ -638,7 +435,7 @@ var Agent = function Agent(userAgent) {
|
|
|
638
435
|
* Returns true on Google Chrome.
|
|
639
436
|
* @return {boolean}
|
|
640
437
|
*/
|
|
641
|
-
matchesChrome: function
|
|
438
|
+
matchesChrome: function () {
|
|
642
439
|
// - Edge also reports to be a Chrome
|
|
643
440
|
return matches(/Chrome\//i) && !matches(/Edg/i);
|
|
644
441
|
},
|
|
@@ -646,14 +443,14 @@ var Agent = function Agent(userAgent) {
|
|
|
646
443
|
* Returns true on Firefox.
|
|
647
444
|
* @return {boolean}
|
|
648
445
|
*/
|
|
649
|
-
matchesFirefox: function
|
|
446
|
+
matchesFirefox: function () {
|
|
650
447
|
return matches(/Firefox\//i) && !matches(/Seamonkey/i);
|
|
651
448
|
},
|
|
652
449
|
/**
|
|
653
450
|
* Returns true on Microsoft Edge.
|
|
654
451
|
* @return {boolean}
|
|
655
452
|
*/
|
|
656
|
-
matchesEdge: function
|
|
453
|
+
matchesEdge: function () {
|
|
657
454
|
return matches(/Edg\//i);
|
|
658
455
|
}
|
|
659
456
|
};
|
|
@@ -674,19 +471,19 @@ var Agent = function Agent(userAgent) {
|
|
|
674
471
|
return agent.matchesSafari() && navigator.maxTouchPoints > 1 && navigator.platform === 'MacIntel';
|
|
675
472
|
}
|
|
676
473
|
};
|
|
677
|
-
|
|
474
|
+
const agent = new Agent(typeof navigator !== 'undefined' ? navigator.userAgent : 'ssr');
|
|
678
475
|
|
|
679
476
|
/**
|
|
680
477
|
* Browser feature detection.
|
|
681
478
|
*
|
|
682
479
|
* @since 0.9
|
|
683
480
|
*/
|
|
684
|
-
|
|
481
|
+
const browser = function () {
|
|
685
482
|
var tests = {},
|
|
686
483
|
results = {},
|
|
687
484
|
featureDetectionComplete = false;
|
|
688
|
-
|
|
689
|
-
|
|
485
|
+
let readyPromiseResolve;
|
|
486
|
+
let readyPromise = new Promise(function (resolve, reject) {
|
|
690
487
|
readyPromiseResolve = resolve;
|
|
691
488
|
});
|
|
692
489
|
return {
|
|
@@ -701,7 +498,7 @@ var browser = function () {
|
|
|
701
498
|
* `false` or a promise that resolves to `true` or `false`.
|
|
702
499
|
* @memberof pageflow.browser
|
|
703
500
|
*/
|
|
704
|
-
feature: function
|
|
501
|
+
feature: function (name, test) {
|
|
705
502
|
var s = name.replace(/ /g, '_');
|
|
706
503
|
this.off[s] = function () {
|
|
707
504
|
window.localStorage['override ' + name] = 'off';
|
|
@@ -731,7 +528,7 @@ var browser = function () {
|
|
|
731
528
|
* @return [Boolean]
|
|
732
529
|
* @memberof pageflow.browser
|
|
733
530
|
*/
|
|
734
|
-
has: function
|
|
531
|
+
has: function (name) {
|
|
735
532
|
if (!featureDetectionComplete) {
|
|
736
533
|
throw 'Feature detection has not finished yet.';
|
|
737
534
|
}
|
|
@@ -746,14 +543,14 @@ var browser = function () {
|
|
|
746
543
|
* @return Promise
|
|
747
544
|
* @memberof pageflow.browser
|
|
748
545
|
*/
|
|
749
|
-
ready: function
|
|
546
|
+
ready: function () {
|
|
750
547
|
return readyPromise;
|
|
751
548
|
},
|
|
752
549
|
/** @api private */
|
|
753
|
-
detectFeatures: function
|
|
550
|
+
detectFeatures: function () {
|
|
754
551
|
var promises = {};
|
|
755
|
-
var asyncHas = function
|
|
756
|
-
var runTest = function
|
|
552
|
+
var asyncHas = function (name) {
|
|
553
|
+
var runTest = function () {
|
|
757
554
|
var value,
|
|
758
555
|
underscoredName = name.replace(/ /g, '_');
|
|
759
556
|
if (debugMode() && location.href.indexOf('&has=' + underscoredName) >= 0) {
|
|
@@ -772,7 +569,7 @@ var browser = function () {
|
|
|
772
569
|
return tests[name](asyncHas);
|
|
773
570
|
}
|
|
774
571
|
};
|
|
775
|
-
promises[name] = promises[name] || Promise.all([runTest()]).then(
|
|
572
|
+
promises[name] = promises[name] || Promise.all([runTest()]).then(a => {
|
|
776
573
|
return a[0];
|
|
777
574
|
});
|
|
778
575
|
return promises[name];
|
|
@@ -785,9 +582,7 @@ var browser = function () {
|
|
|
785
582
|
asyncHas.all = function /* arguments */
|
|
786
583
|
() {
|
|
787
584
|
return Promise.all(arguments).then(function (results) {
|
|
788
|
-
return results.every(
|
|
789
|
-
return result;
|
|
790
|
-
});
|
|
585
|
+
return results.every(result => result);
|
|
791
586
|
});
|
|
792
587
|
};
|
|
793
588
|
Promise.all(Object.keys(tests).map(function (name) {
|
|
@@ -797,7 +592,7 @@ var browser = function () {
|
|
|
797
592
|
document.body.classList.toggle('has_no_' + cssClassName, !result);
|
|
798
593
|
results[name] = !!result;
|
|
799
594
|
});
|
|
800
|
-
})).then(
|
|
595
|
+
})).then(() => {
|
|
801
596
|
featureDetectionComplete = true;
|
|
802
597
|
readyPromiseResolve();
|
|
803
598
|
});
|
|
@@ -935,12 +730,11 @@ browser.Agent = Agent;
|
|
|
935
730
|
* @alias pageflow.features
|
|
936
731
|
* @since 0.9
|
|
937
732
|
*/
|
|
938
|
-
|
|
733
|
+
class Features {
|
|
939
734
|
/** @lends pageflow.features */
|
|
940
735
|
|
|
941
736
|
/** @api private */
|
|
942
|
-
|
|
943
|
-
_classCallCheck(this, Features);
|
|
737
|
+
constructor() {
|
|
944
738
|
this.registry = {};
|
|
945
739
|
this.enabledFeatureNames = [];
|
|
946
740
|
}
|
|
@@ -949,66 +743,56 @@ var Features = /*#__PURE__*/function () {
|
|
|
949
743
|
* `pageflow.features` has been renamed to `pageflow.browser`.
|
|
950
744
|
* @deprecated
|
|
951
745
|
*/
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
return browser.has.apply(browser, arguments);
|
|
957
|
-
}
|
|
746
|
+
has( /* arguments */
|
|
747
|
+
) {
|
|
748
|
+
return browser.has.apply(browser, arguments);
|
|
749
|
+
}
|
|
958
750
|
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
this.registry[scope][name].push(fn);
|
|
974
|
-
}
|
|
751
|
+
/**
|
|
752
|
+
* Register a function to configure a feature when it is active.
|
|
753
|
+
*
|
|
754
|
+
* @param {String} scope - Name of the scope the passed function
|
|
755
|
+
* shall be called in.
|
|
756
|
+
* @param name [String] Name of the feature
|
|
757
|
+
* @param fn [Function] Function to call when the given feature
|
|
758
|
+
* is activate.
|
|
759
|
+
*/
|
|
760
|
+
register(scope, name, fn) {
|
|
761
|
+
this.registry[scope] = this.registry[scope] || {};
|
|
762
|
+
this.registry[scope][name] = this.registry[scope][name] || [];
|
|
763
|
+
this.registry[scope][name].push(fn);
|
|
764
|
+
}
|
|
975
765
|
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
return this.enabledFeatureNames.includes(name);
|
|
986
|
-
}
|
|
766
|
+
/**
|
|
767
|
+
* Check if a feature as been enabled.
|
|
768
|
+
*
|
|
769
|
+
* @param name [String]
|
|
770
|
+
* @return [Boolean]
|
|
771
|
+
*/
|
|
772
|
+
isEnabled(name) {
|
|
773
|
+
return this.enabledFeatureNames.includes(name);
|
|
774
|
+
}
|
|
987
775
|
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
(fns[name] || []).forEach(function (fn) {
|
|
996
|
-
fn();
|
|
997
|
-
});
|
|
776
|
+
/** @api private */
|
|
777
|
+
enable(scope, names) {
|
|
778
|
+
var fns = this.registry[scope] || {};
|
|
779
|
+
this.enabledFeatureNames = this.enabledFeatureNames.concat(names);
|
|
780
|
+
names.forEach(function (name) {
|
|
781
|
+
(fns[name] || []).forEach(function (fn) {
|
|
782
|
+
fn();
|
|
998
783
|
});
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
var features = new Features();
|
|
784
|
+
});
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
const features = new Features();
|
|
1004
788
|
|
|
1005
|
-
|
|
789
|
+
const handleFailedPlay = function (player, options) {
|
|
1006
790
|
var originalPlay = player.play;
|
|
1007
791
|
player.play = function /* arguments */
|
|
1008
792
|
() {
|
|
1009
793
|
var result = originalPlay.apply(player, arguments);
|
|
1010
|
-
if (result && typeof result
|
|
1011
|
-
return result
|
|
794
|
+
if (result && typeof result.catch !== 'undefined') {
|
|
795
|
+
return result.catch(function (e) {
|
|
1012
796
|
if (e.name === 'NotAllowedError' && options.hasAutoplaySupport) {
|
|
1013
797
|
if (options.fallbackToMutedAutoplay) {
|
|
1014
798
|
player.muted(true);
|
|
@@ -1029,7 +813,7 @@ var handleFailedPlay = function handleFailedPlay(player, options) {
|
|
|
1029
813
|
};
|
|
1030
814
|
};
|
|
1031
815
|
|
|
1032
|
-
|
|
816
|
+
const asyncPlay = function (player) {
|
|
1033
817
|
var originalPlay = player.play;
|
|
1034
818
|
var originalPause = player.pause;
|
|
1035
819
|
var intendingToPlay = false;
|
|
@@ -1075,18 +859,18 @@ var asyncPlay = function asyncPlay(player) {
|
|
|
1075
859
|
}
|
|
1076
860
|
};
|
|
1077
861
|
|
|
1078
|
-
|
|
862
|
+
const hooks = function (player, hooks) {
|
|
1079
863
|
var originalPlay = player.play;
|
|
1080
|
-
player.updateHooks =
|
|
1081
|
-
|
|
864
|
+
player.updateHooks = newHooks => {
|
|
865
|
+
hooks = newHooks;
|
|
1082
866
|
};
|
|
1083
867
|
player.play = function /* args */
|
|
1084
868
|
() {
|
|
1085
869
|
var args = arguments;
|
|
1086
870
|
player.trigger('beforeplay');
|
|
1087
871
|
player.intendToPlay();
|
|
1088
|
-
if (
|
|
1089
|
-
return Promise.all([
|
|
872
|
+
if (hooks.before) {
|
|
873
|
+
return Promise.all([hooks.before()]).then(function () {
|
|
1090
874
|
return player.ifIntendingToPlay().then(function () {
|
|
1091
875
|
return originalPlay.apply(player, args);
|
|
1092
876
|
});
|
|
@@ -1099,16 +883,16 @@ var hooks = function hooks(player, _hooks) {
|
|
|
1099
883
|
player.off('pause', player.afterHookListener);
|
|
1100
884
|
player.off('ended', player.afterHookListener);
|
|
1101
885
|
}
|
|
1102
|
-
player.afterHookListener =
|
|
1103
|
-
if (
|
|
1104
|
-
|
|
886
|
+
player.afterHookListener = () => {
|
|
887
|
+
if (hooks.after) {
|
|
888
|
+
hooks.after();
|
|
1105
889
|
}
|
|
1106
890
|
};
|
|
1107
891
|
player.on('pause', player.afterHookListener);
|
|
1108
892
|
player.on('ended', player.afterHookListener);
|
|
1109
893
|
};
|
|
1110
894
|
|
|
1111
|
-
|
|
895
|
+
const volumeBinding = function (player, settings, options) {
|
|
1112
896
|
options = options || {};
|
|
1113
897
|
var originalPlay = player.play;
|
|
1114
898
|
var originalPause = player.pause;
|
|
@@ -1176,13 +960,13 @@ var volumeBinding = function volumeBinding(player, settings, options) {
|
|
|
1176
960
|
*
|
|
1177
961
|
* @since 12.1
|
|
1178
962
|
*/
|
|
1179
|
-
|
|
963
|
+
const audioContext = {
|
|
1180
964
|
/**
|
|
1181
965
|
* @returns [AudioContext]
|
|
1182
966
|
* Returns `null` if web audio API is not supported or creating
|
|
1183
967
|
* the context fails.
|
|
1184
968
|
*/
|
|
1185
|
-
get: function
|
|
969
|
+
get: function () {
|
|
1186
970
|
var AudioContext = window.AudioContext || window.webkitAudioContext;
|
|
1187
971
|
if (typeof this._audioContext === 'undefined') {
|
|
1188
972
|
try {
|
|
@@ -1198,7 +982,7 @@ var audioContext = {
|
|
|
1198
982
|
}
|
|
1199
983
|
};
|
|
1200
984
|
|
|
1201
|
-
|
|
985
|
+
const webAudio = function (player, audioContext) {
|
|
1202
986
|
var gainNode;
|
|
1203
987
|
var currentResolve;
|
|
1204
988
|
var currentTimeout;
|
|
@@ -1312,16 +1096,16 @@ var webAudio = function webAudio(player, audioContext) {
|
|
|
1312
1096
|
}
|
|
1313
1097
|
};
|
|
1314
1098
|
|
|
1315
|
-
|
|
1099
|
+
const noop = function (player) {
|
|
1316
1100
|
player.fadeVolume = function (value, duration) {
|
|
1317
1101
|
return Promise.resolve();
|
|
1318
1102
|
};
|
|
1319
1103
|
};
|
|
1320
1104
|
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1105
|
+
const interval = function (player) {
|
|
1106
|
+
const originalVolume = player.volume;
|
|
1107
|
+
let fadeVolumeResolve;
|
|
1108
|
+
let fadeVolumeInterval;
|
|
1325
1109
|
player.volume = function (value) {
|
|
1326
1110
|
if (typeof value !== 'undefined') {
|
|
1327
1111
|
cancelFadeVolume();
|
|
@@ -1331,10 +1115,10 @@ var interval = function interval(player) {
|
|
|
1331
1115
|
player.fadeVolume = function (value, duration) {
|
|
1332
1116
|
cancelFadeVolume();
|
|
1333
1117
|
return new Promise(function (resolve, reject) {
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1118
|
+
const resolution = 10;
|
|
1119
|
+
const startValue = volume();
|
|
1120
|
+
const steps = duration / resolution;
|
|
1121
|
+
const leap = (value - startValue) / steps;
|
|
1338
1122
|
if (value === startValue) {
|
|
1339
1123
|
resolve();
|
|
1340
1124
|
} else {
|
|
@@ -1371,7 +1155,7 @@ var interval = function interval(player) {
|
|
|
1371
1155
|
}
|
|
1372
1156
|
};
|
|
1373
1157
|
|
|
1374
|
-
|
|
1158
|
+
const volumeFading = function (player) {
|
|
1375
1159
|
if (!browser.has('volume control support')) {
|
|
1376
1160
|
return noop(player);
|
|
1377
1161
|
} else if (browser.has('audio context volume fading support') && audioContext.get() && player.getMediaElement) {
|
|
@@ -1385,7 +1169,7 @@ volumeFading.interval = interval;
|
|
|
1385
1169
|
volumeFading.noop = noop;
|
|
1386
1170
|
volumeFading.webAudio = webAudio;
|
|
1387
1171
|
|
|
1388
|
-
|
|
1172
|
+
const loadWaiting = function (player) {
|
|
1389
1173
|
var originalFadeVolume = player.fadeVolume;
|
|
1390
1174
|
player.fadeVolume = function /* args */
|
|
1391
1175
|
() {
|
|
@@ -1396,78 +1180,68 @@ var loadWaiting = function loadWaiting(player) {
|
|
|
1396
1180
|
};
|
|
1397
1181
|
};
|
|
1398
1182
|
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
_classCallCheck(this, Settings);
|
|
1183
|
+
class Settings {
|
|
1184
|
+
constructor() {
|
|
1402
1185
|
this.attributes = {
|
|
1403
1186
|
volume: 1
|
|
1404
1187
|
};
|
|
1405
1188
|
this.initialize();
|
|
1406
1189
|
}
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
this.
|
|
1426
|
-
}
|
|
1427
|
-
}
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
if (storage) {
|
|
1437
|
-
if (storage['pageflow.settings']) {
|
|
1438
|
-
try {
|
|
1439
|
-
this.set(JSON.parse(storage['pageflow.settings']));
|
|
1440
|
-
} catch (e) {
|
|
1441
|
-
log(e);
|
|
1442
|
-
}
|
|
1190
|
+
get(attributeName) {
|
|
1191
|
+
return this.attributes[attributeName];
|
|
1192
|
+
}
|
|
1193
|
+
set(key, value) {
|
|
1194
|
+
let attrs;
|
|
1195
|
+
if (typeof key === 'object') {
|
|
1196
|
+
attrs = key;
|
|
1197
|
+
} else {
|
|
1198
|
+
(attrs = {})[key] = value;
|
|
1199
|
+
}
|
|
1200
|
+
for (const attr in attrs) {
|
|
1201
|
+
this.attributes[attr] = attrs[attr];
|
|
1202
|
+
this.trigger('change:' + attr);
|
|
1203
|
+
}
|
|
1204
|
+
this.trigger('change');
|
|
1205
|
+
}
|
|
1206
|
+
toJSON() {
|
|
1207
|
+
return {
|
|
1208
|
+
...this.attributes
|
|
1209
|
+
};
|
|
1210
|
+
}
|
|
1211
|
+
initialize() {
|
|
1212
|
+
const storage = this.getLocalStorage();
|
|
1213
|
+
if (storage) {
|
|
1214
|
+
if (storage['pageflow.settings']) {
|
|
1215
|
+
try {
|
|
1216
|
+
this.set(JSON.parse(storage['pageflow.settings']));
|
|
1217
|
+
} catch (e) {
|
|
1218
|
+
log(e);
|
|
1443
1219
|
}
|
|
1444
|
-
this.on('change', function () {
|
|
1445
|
-
storage['pageflow.settings'] = JSON.stringify(this.attributes);
|
|
1446
|
-
});
|
|
1447
1220
|
}
|
|
1221
|
+
this.on('change', function () {
|
|
1222
|
+
storage['pageflow.settings'] = JSON.stringify(this.attributes);
|
|
1223
|
+
});
|
|
1448
1224
|
}
|
|
1449
|
-
}
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
return null;
|
|
1458
|
-
}
|
|
1225
|
+
}
|
|
1226
|
+
getLocalStorage() {
|
|
1227
|
+
try {
|
|
1228
|
+
return window.localStorage;
|
|
1229
|
+
} catch (e) {
|
|
1230
|
+
// Safari throws SecurityError when accessing window.localStorage
|
|
1231
|
+
// if cookies/website data are disabled.
|
|
1232
|
+
return null;
|
|
1459
1233
|
}
|
|
1460
|
-
}
|
|
1461
|
-
|
|
1462
|
-
}();
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1463
1236
|
Object.assign(Settings.prototype, BackboneEvents);
|
|
1464
|
-
|
|
1237
|
+
const settings = new Settings();
|
|
1465
1238
|
|
|
1466
|
-
|
|
1467
|
-
enhance: function
|
|
1468
|
-
handleFailedPlay(player,
|
|
1469
|
-
hasAutoplaySupport: browser.has('autoplay support')
|
|
1470
|
-
|
|
1239
|
+
const mediaPlayer = {
|
|
1240
|
+
enhance: function (player, options) {
|
|
1241
|
+
handleFailedPlay(player, {
|
|
1242
|
+
hasAutoplaySupport: browser.has('autoplay support'),
|
|
1243
|
+
...options
|
|
1244
|
+
});
|
|
1471
1245
|
asyncPlay(player);
|
|
1472
1246
|
if (options.hooks) {
|
|
1473
1247
|
hooks(player, options.hooks);
|
|
@@ -1504,7 +1278,7 @@ function throttle(func, timeFrame) {
|
|
|
1504
1278
|
};
|
|
1505
1279
|
}
|
|
1506
1280
|
|
|
1507
|
-
|
|
1281
|
+
const mediaEvents = function (player, context) {
|
|
1508
1282
|
function triggerMediaEvent(name) {
|
|
1509
1283
|
events.trigger('media:' + name, {
|
|
1510
1284
|
fileName: player.currentSrc,
|
|
@@ -1518,6 +1292,12 @@ var mediaEvents = function mediaEvents(player, context) {
|
|
|
1518
1292
|
player.on('play', function () {
|
|
1519
1293
|
triggerMediaEvent('play');
|
|
1520
1294
|
});
|
|
1295
|
+
player.on('seeking', function () {
|
|
1296
|
+
triggerMediaEvent('seeking');
|
|
1297
|
+
});
|
|
1298
|
+
player.on('seeked', function () {
|
|
1299
|
+
triggerMediaEvent('seeked');
|
|
1300
|
+
});
|
|
1521
1301
|
player.on('timeupdate', function () {
|
|
1522
1302
|
triggerMediaEvent('timeupdate');
|
|
1523
1303
|
});
|
|
@@ -1535,7 +1315,7 @@ var mediaEvents = function mediaEvents(player, context) {
|
|
|
1535
1315
|
// Prevent audio play back when browser enters background on mobile
|
|
1536
1316
|
// device. Use the face that timeupdate events continue to fire while
|
|
1537
1317
|
// intervals no longer executed when the browser is in the background.
|
|
1538
|
-
|
|
1318
|
+
const pauseInBackground = function (player) {
|
|
1539
1319
|
var interval;
|
|
1540
1320
|
var lastInterval;
|
|
1541
1321
|
var resolution = 100;
|
|
@@ -1569,7 +1349,7 @@ var pauseInBackground = function pauseInBackground(player) {
|
|
|
1569
1349
|
*
|
|
1570
1350
|
* @api private
|
|
1571
1351
|
*/
|
|
1572
|
-
|
|
1352
|
+
const seekWithInvalidStateHandling = function (player) {
|
|
1573
1353
|
var originalSeek = player.seek;
|
|
1574
1354
|
player.seek = function (time) {
|
|
1575
1355
|
return retryOnProgress(function () {
|
|
@@ -1597,7 +1377,7 @@ var seekWithInvalidStateHandling = function seekWithInvalidStateHandling(player)
|
|
|
1597
1377
|
}
|
|
1598
1378
|
};
|
|
1599
1379
|
|
|
1600
|
-
|
|
1380
|
+
const rewindMethod = function (player) {
|
|
1601
1381
|
/**
|
|
1602
1382
|
* Seek to beginning of file. If already at the beginning do
|
|
1603
1383
|
* nothing.
|
|
@@ -1615,7 +1395,7 @@ var rewindMethod = function rewindMethod(player) {
|
|
|
1615
1395
|
};
|
|
1616
1396
|
};
|
|
1617
1397
|
|
|
1618
|
-
|
|
1398
|
+
const getMediaElementMethod = function (player) {
|
|
1619
1399
|
player.getMediaElement = function () {
|
|
1620
1400
|
return player.audio.audio;
|
|
1621
1401
|
};
|
|
@@ -1635,19 +1415,19 @@ var getMediaElementMethod = function getMediaElementMethod(player) {
|
|
|
1635
1415
|
*
|
|
1636
1416
|
* @class
|
|
1637
1417
|
*/
|
|
1638
|
-
|
|
1418
|
+
const AudioPlayer = function (sources, options) {
|
|
1639
1419
|
options = options || {};
|
|
1640
1420
|
var codecMapping = {
|
|
1641
1421
|
vorbis: 'audio/ogg',
|
|
1642
1422
|
mp4: 'audio/mp4',
|
|
1643
1423
|
mp3: 'audio/mpeg'
|
|
1644
1424
|
};
|
|
1645
|
-
|
|
1646
|
-
|
|
1425
|
+
let readyResolve;
|
|
1426
|
+
let readyPromise = new Promise(function (resolve) {
|
|
1647
1427
|
readyResolve = resolve;
|
|
1648
1428
|
});
|
|
1649
|
-
|
|
1650
|
-
|
|
1429
|
+
let loadedResolve;
|
|
1430
|
+
let loadedPromise = new Promise(function (resolve) {
|
|
1651
1431
|
loadedResolve = resolve;
|
|
1652
1432
|
});
|
|
1653
1433
|
var audio = new Audio5js({
|
|
@@ -1668,9 +1448,10 @@ var AudioPlayer = function AudioPlayer(sources, options) {
|
|
|
1668
1448
|
if (options.pauseInBackground && browser.has('mobile platform')) {
|
|
1669
1449
|
pauseInBackground(audio);
|
|
1670
1450
|
}
|
|
1671
|
-
mediaPlayer.enhance(audio,
|
|
1672
|
-
loadWaiting: true
|
|
1673
|
-
|
|
1451
|
+
mediaPlayer.enhance(audio, {
|
|
1452
|
+
loadWaiting: true,
|
|
1453
|
+
...options
|
|
1454
|
+
});
|
|
1674
1455
|
seekWithInvalidStateHandling(audio);
|
|
1675
1456
|
rewindMethod(audio);
|
|
1676
1457
|
getMediaElementMethod(audio);
|
|
@@ -1716,16 +1497,17 @@ AudioPlayer.fromAudioTag = function (element, options) {
|
|
|
1716
1497
|
src: this.getAttribute('src'),
|
|
1717
1498
|
type: this.getAttribute('type')
|
|
1718
1499
|
};
|
|
1719
|
-
}).get(),
|
|
1720
|
-
tag: element[0]
|
|
1721
|
-
|
|
1500
|
+
}).get(), {
|
|
1501
|
+
tag: element[0],
|
|
1502
|
+
...options
|
|
1503
|
+
});
|
|
1722
1504
|
};
|
|
1723
1505
|
AudioPlayer.fromScriptTag = function (element, options) {
|
|
1724
1506
|
var sources = element.length ? JSON.parse(element.text()) : [];
|
|
1725
1507
|
return new AudioPlayer(sources, options);
|
|
1726
1508
|
};
|
|
1727
1509
|
|
|
1728
|
-
|
|
1510
|
+
const Null = function () {
|
|
1729
1511
|
this.playAndFadeIn = function () {
|
|
1730
1512
|
return Promise.resolve();
|
|
1731
1513
|
};
|
|
@@ -1759,34 +1541,18 @@ AudioPlayer.seekWithInvalidStateHandling = seekWithInvalidStateHandling;
|
|
|
1759
1541
|
AudioPlayer.rewindMethod = rewindMethod;
|
|
1760
1542
|
AudioPlayer.pauseInBackground = pauseInBackground;
|
|
1761
1543
|
|
|
1762
|
-
function _arrayWithoutHoles(arr) {
|
|
1763
|
-
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
|
|
1764
|
-
}
|
|
1765
|
-
|
|
1766
|
-
function _iterableToArray(iter) {
|
|
1767
|
-
if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
|
|
1768
|
-
}
|
|
1769
|
-
|
|
1770
|
-
function _nonIterableSpread() {
|
|
1771
|
-
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
1772
|
-
}
|
|
1773
|
-
|
|
1774
|
-
function _toConsumableArray(arr) {
|
|
1775
|
-
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
|
1776
|
-
}
|
|
1777
|
-
|
|
1778
1544
|
if (typeof window !== 'undefined') {
|
|
1779
1545
|
window.VIDEOJS_NO_DYNAMIC_STYLE = true;
|
|
1780
1546
|
}
|
|
1781
1547
|
|
|
1782
|
-
|
|
1548
|
+
const filterSources = function (playerElement) {
|
|
1783
1549
|
if (playerElement.tagName.toLowerCase() !== 'video') {
|
|
1784
1550
|
return playerElement;
|
|
1785
1551
|
}
|
|
1786
1552
|
var changed = false;
|
|
1787
1553
|
if (browser.has('mp4 support only')) {
|
|
1788
1554
|
// keep only mp4 source
|
|
1789
|
-
playerElement.querySelectorAll('source').forEach(
|
|
1555
|
+
playerElement.querySelectorAll('source').forEach(source => {
|
|
1790
1556
|
if (source.type !== 'video/mp4') {
|
|
1791
1557
|
playerElement.removeChild(source);
|
|
1792
1558
|
}
|
|
@@ -1794,7 +1560,7 @@ var filterSources = function filterSources(playerElement) {
|
|
|
1794
1560
|
changed = true;
|
|
1795
1561
|
} else if (browser.has('mse and native hls support')) {
|
|
1796
1562
|
// remove dash source to ensure hls is used
|
|
1797
|
-
|
|
1563
|
+
const dashSource = playerElement.querySelector('source[type="application/dash+xml"]');
|
|
1798
1564
|
if (dashSource) {
|
|
1799
1565
|
playerElement.removeChild(dashSource);
|
|
1800
1566
|
changed = true;
|
|
@@ -1811,7 +1577,7 @@ var filterSources = function filterSources(playerElement) {
|
|
|
1811
1577
|
}
|
|
1812
1578
|
};
|
|
1813
1579
|
|
|
1814
|
-
|
|
1580
|
+
const useSlimPlayerControlsDuringPhonePlayback = function (player) {
|
|
1815
1581
|
var originalPlay = player.play;
|
|
1816
1582
|
player.play = function () {
|
|
1817
1583
|
if (browser.has('phone platform') && !browser.has('native video player')) {
|
|
@@ -1826,8 +1592,8 @@ var useSlimPlayerControlsDuringPhonePlayback = function useSlimPlayerControlsDur
|
|
|
1826
1592
|
};
|
|
1827
1593
|
};
|
|
1828
1594
|
|
|
1829
|
-
|
|
1830
|
-
|
|
1595
|
+
const prebuffering = function (player) {
|
|
1596
|
+
let prebufferPromiseReject;
|
|
1831
1597
|
player.isBufferedAhead = function (delta, silent) {
|
|
1832
1598
|
// video.js only gives us one time range starting from 0 here. We
|
|
1833
1599
|
// still ask for the last time range to be on the safe side.
|
|
@@ -1845,15 +1611,15 @@ var prebuffering = function prebuffering(player) {
|
|
|
1845
1611
|
};
|
|
1846
1612
|
player.prebuffer = function (options) {
|
|
1847
1613
|
options = options || {};
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1614
|
+
const delta = options.secondsToBuffer || 10;
|
|
1615
|
+
const secondsToWait = options.secondsToWait || 3;
|
|
1616
|
+
const interval = 200;
|
|
1617
|
+
const maxCount = secondsToWait * 1000 / interval;
|
|
1618
|
+
let count = 0;
|
|
1853
1619
|
if (browser.has('prebuffering support')) {
|
|
1854
1620
|
if (!player.isBufferedAhead(delta) && !player.prebufferPromise) {
|
|
1855
1621
|
log('prebuffering video ' + player.src());
|
|
1856
|
-
player.prebufferPromise = new Promise(
|
|
1622
|
+
player.prebufferPromise = new Promise((resolve, reject) => {
|
|
1857
1623
|
prebufferPromiseReject = reject;
|
|
1858
1624
|
wait();
|
|
1859
1625
|
function wait() {
|
|
@@ -1893,7 +1659,7 @@ var prebuffering = function prebuffering(player) {
|
|
|
1893
1659
|
});
|
|
1894
1660
|
};
|
|
1895
1661
|
|
|
1896
|
-
|
|
1662
|
+
const cueSettingsMethods = function (player) {
|
|
1897
1663
|
/**
|
|
1898
1664
|
* Specify the display position of text tracks. This method can also
|
|
1899
1665
|
* be used to make VideoJS reposition the text tracks after the
|
|
@@ -1951,7 +1717,7 @@ var cueSettingsMethods = function cueSettingsMethods(player) {
|
|
|
1951
1717
|
};
|
|
1952
1718
|
};
|
|
1953
1719
|
|
|
1954
|
-
|
|
1720
|
+
const getMediaElementMethod$1 = function (player) {
|
|
1955
1721
|
player.getMediaElement = function () {
|
|
1956
1722
|
var tech = player.tech({
|
|
1957
1723
|
IWillNotUseThisInPlugins: true
|
|
@@ -1960,26 +1726,35 @@ var getMediaElementMethod$1 = function getMediaElementMethod(player) {
|
|
|
1960
1726
|
};
|
|
1961
1727
|
};
|
|
1962
1728
|
|
|
1963
|
-
|
|
1729
|
+
const mediaEvents$1 = function (player, context) {
|
|
1964
1730
|
player.updateMediaEventsContext = function (newContext) {
|
|
1965
1731
|
context = newContext;
|
|
1966
1732
|
};
|
|
1967
|
-
function
|
|
1733
|
+
player.triggerMediaAllocate = function () {
|
|
1968
1734
|
if (context) {
|
|
1969
|
-
events.trigger('media:'
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
currentTime: player.currentTime(),
|
|
1973
|
-
duration: player.duration(),
|
|
1974
|
-
volume: player.volume(),
|
|
1975
|
-
altText: player.getMediaElement().getAttribute('alt'),
|
|
1976
|
-
bitrate: 3500000
|
|
1735
|
+
events.trigger('media:allocate', {
|
|
1736
|
+
...mediaEventPayload(),
|
|
1737
|
+
element: player.getMediaElement()
|
|
1977
1738
|
});
|
|
1978
1739
|
}
|
|
1979
|
-
}
|
|
1740
|
+
};
|
|
1741
|
+
player.triggerMediaRelease = function () {
|
|
1742
|
+
if (context) {
|
|
1743
|
+
events.trigger('media:release', {
|
|
1744
|
+
...mediaEventPayload(),
|
|
1745
|
+
element: player.getMediaElement()
|
|
1746
|
+
});
|
|
1747
|
+
}
|
|
1748
|
+
};
|
|
1980
1749
|
player.on('play', function () {
|
|
1981
1750
|
triggerMediaEvent('play');
|
|
1982
1751
|
});
|
|
1752
|
+
player.on('seeking', function () {
|
|
1753
|
+
triggerMediaEvent('seeking');
|
|
1754
|
+
});
|
|
1755
|
+
player.on('seeked', function () {
|
|
1756
|
+
triggerMediaEvent('seeked');
|
|
1757
|
+
});
|
|
1983
1758
|
player.on('timeupdate', function () {
|
|
1984
1759
|
triggerMediaEvent('timeupdate');
|
|
1985
1760
|
});
|
|
@@ -1992,9 +1767,25 @@ var mediaEvents$1 = function mediaEvents(player, context) {
|
|
|
1992
1767
|
player.on('ended', function () {
|
|
1993
1768
|
triggerMediaEvent('ended');
|
|
1994
1769
|
});
|
|
1770
|
+
function triggerMediaEvent(name) {
|
|
1771
|
+
if (context) {
|
|
1772
|
+
events.trigger('media:' + name, mediaEventPayload());
|
|
1773
|
+
}
|
|
1774
|
+
}
|
|
1775
|
+
function mediaEventPayload() {
|
|
1776
|
+
return {
|
|
1777
|
+
fileName: player.previousSrc || player.currentSrc(),
|
|
1778
|
+
context: context,
|
|
1779
|
+
currentTime: player.currentTime(),
|
|
1780
|
+
duration: player.duration(),
|
|
1781
|
+
volume: player.volume(),
|
|
1782
|
+
altText: player.getMediaElement().getAttribute('alt'),
|
|
1783
|
+
bitrate: 3500000
|
|
1784
|
+
};
|
|
1785
|
+
}
|
|
1995
1786
|
};
|
|
1996
1787
|
|
|
1997
|
-
|
|
1788
|
+
const bufferUnderrunWaiting = function (player) {
|
|
1998
1789
|
var originalPause = player.pause;
|
|
1999
1790
|
player.pause = function () {
|
|
2000
1791
|
cancelWaiting();
|
|
@@ -2023,7 +1814,7 @@ var bufferUnderrunWaiting = function bufferUnderrunWaiting(player) {
|
|
|
2023
1814
|
player.trigger('bufferunderruncontinue');
|
|
2024
1815
|
player.play();
|
|
2025
1816
|
}
|
|
2026
|
-
},
|
|
1817
|
+
}, () => {});
|
|
2027
1818
|
}
|
|
2028
1819
|
function cancelWaiting() {
|
|
2029
1820
|
if (player.waitingOnUnderrun) {
|
|
@@ -2051,7 +1842,7 @@ var bufferUnderrunWaiting = function bufferUnderrunWaiting(player) {
|
|
|
2051
1842
|
}
|
|
2052
1843
|
};
|
|
2053
1844
|
|
|
2054
|
-
|
|
1845
|
+
const rewindMethod$1 = function (player) {
|
|
2055
1846
|
/**
|
|
2056
1847
|
* Seek to beginning of file. If already at the beginning do
|
|
2057
1848
|
* nothing.
|
|
@@ -2069,7 +1860,7 @@ var rewindMethod$1 = function rewindMethod(player) {
|
|
|
2069
1860
|
};
|
|
2070
1861
|
};
|
|
2071
1862
|
|
|
2072
|
-
|
|
1863
|
+
const VideoPlayer = function (element, options) {
|
|
2073
1864
|
options = options || {};
|
|
2074
1865
|
element = filterSources(element);
|
|
2075
1866
|
var player = VideoJS(element, options);
|
|
@@ -2097,9 +1888,9 @@ VideoPlayer.mediaEvents = mediaEvents$1;
|
|
|
2097
1888
|
VideoPlayer.cueSettingsMethods = cueSettingsMethods;
|
|
2098
1889
|
VideoPlayer.bufferUnderrunWaiting = bufferUnderrunWaiting;
|
|
2099
1890
|
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
1891
|
+
const createMediaPlayer = function (options) {
|
|
1892
|
+
let isAudio = options.tagName == 'AUDIO';
|
|
1893
|
+
const player = new VideoPlayer(options.mediaElement, {
|
|
2103
1894
|
controlBar: false,
|
|
2104
1895
|
loadingSpinner: false,
|
|
2105
1896
|
bigPlayButton: false,
|
|
@@ -2125,7 +1916,7 @@ var createMediaPlayer = function createMediaPlayer(options) {
|
|
|
2125
1916
|
context: null
|
|
2126
1917
|
});
|
|
2127
1918
|
player.textTrackSettings = {
|
|
2128
|
-
getValues
|
|
1919
|
+
getValues() {
|
|
2129
1920
|
return {};
|
|
2130
1921
|
}
|
|
2131
1922
|
};
|
|
@@ -2157,9 +1948,9 @@ var createMediaPlayer = function createMediaPlayer(options) {
|
|
|
2157
1948
|
* limitations under the License.
|
|
2158
1949
|
*/
|
|
2159
1950
|
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
1951
|
+
const BLANK_AUDIO_SRC = 'data:audio/wav;base64,UklGRjIAAABXQVZFZm10IBA' + 'AAAABAAEAIlYAAESsAAACABAAZGF0YRAAAAAAAAAAAAAAAAAAAAAAAA==';
|
|
1952
|
+
const 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';
|
|
1953
|
+
const blankSources = {
|
|
2163
1954
|
audio: {
|
|
2164
1955
|
src: BLANK_AUDIO_SRC,
|
|
2165
1956
|
type: 'audio/wav'
|
|
@@ -2171,221 +1962,191 @@ var blankSources = {
|
|
|
2171
1962
|
};
|
|
2172
1963
|
|
|
2173
1964
|
/** @const @enum {string} */
|
|
2174
|
-
|
|
1965
|
+
const MediaType = {
|
|
2175
1966
|
AUDIO: 'audio',
|
|
2176
1967
|
VIDEO: 'video'
|
|
2177
1968
|
};
|
|
2178
|
-
|
|
1969
|
+
let elId = 0;
|
|
2179
1970
|
|
|
2180
1971
|
/**
|
|
2181
1972
|
* Media pool class handles the pool of Videojs media players
|
|
2182
1973
|
*/
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
};
|
|
2188
|
-
_classCallCheck(this, MediaPool);
|
|
1974
|
+
class MediaPool {
|
|
1975
|
+
constructor(options = {
|
|
1976
|
+
playerCount: 4
|
|
1977
|
+
}) {
|
|
2189
1978
|
this.playerCount = options.playerCount;
|
|
2190
1979
|
this.allocatedPlayers = {};
|
|
2191
1980
|
this.unAllocatedPlayers = {};
|
|
2192
|
-
this.mediaFactory_ =
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
_createClass(MediaPool, [{
|
|
2203
|
-
key: "allocatePlayer",
|
|
2204
|
-
value: function allocatePlayer(_ref) {
|
|
2205
|
-
var playerType = _ref.playerType,
|
|
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;
|
|
2217
|
-
var player = undefined;
|
|
2218
|
-
if (!this.unAllocatedPlayers[playerType]) {
|
|
2219
|
-
this.populateMediaPool_();
|
|
2220
|
-
}
|
|
2221
|
-
if (this.unAllocatedPlayers[playerType].length == 0) {
|
|
2222
|
-
this.freeOnePlayer(playerType);
|
|
2223
|
-
}
|
|
2224
|
-
player = this.unAllocatedPlayers[playerType].pop();
|
|
2225
|
-
if (player) {
|
|
2226
|
-
player.pause();
|
|
2227
|
-
player.getMediaElement().loop = loop;
|
|
2228
|
-
player.getMediaElement().setAttribute('alt', altText);
|
|
2229
|
-
player.poster(poster);
|
|
2230
|
-
player.controls(controls);
|
|
2231
|
-
if (playsInline) {
|
|
2232
|
-
player.playsinline(true);
|
|
2233
|
-
}
|
|
2234
|
-
player.updateHooks(hooks || {});
|
|
2235
|
-
player.updateMediaEventsContext(mediaEventsContextData);
|
|
2236
|
-
this.allocatedPlayers[playerType].push(player);
|
|
2237
|
-
player.playerId = playerId || this.allocatedPlayers[playerType].length;
|
|
2238
|
-
player.releaseCallback = onRelease;
|
|
2239
|
-
player.previousSrc = null;
|
|
2240
|
-
return player;
|
|
2241
|
-
} else {
|
|
2242
|
-
console.log('no player found for allocation');
|
|
1981
|
+
this.mediaFactory_ = {
|
|
1982
|
+
[MediaType.AUDIO]: () => {
|
|
1983
|
+
const audioEl = document.createElement('audio');
|
|
1984
|
+
audioEl.setAttribute('crossorigin', 'anonymous');
|
|
1985
|
+
return audioEl;
|
|
1986
|
+
},
|
|
1987
|
+
[MediaType.VIDEO]: () => {
|
|
1988
|
+
const videoEl = document.createElement('video');
|
|
1989
|
+
videoEl.setAttribute('crossorigin', 'anonymous');
|
|
1990
|
+
return videoEl;
|
|
2243
1991
|
}
|
|
2244
|
-
}
|
|
2245
|
-
}
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
1992
|
+
};
|
|
1993
|
+
}
|
|
1994
|
+
allocatePlayer({
|
|
1995
|
+
playerType,
|
|
1996
|
+
playerId,
|
|
1997
|
+
playsInline,
|
|
1998
|
+
mediaEventsContextData,
|
|
1999
|
+
hooks,
|
|
2000
|
+
poster,
|
|
2001
|
+
loop = false,
|
|
2002
|
+
controls = false,
|
|
2003
|
+
altText,
|
|
2004
|
+
onRelease
|
|
2005
|
+
}) {
|
|
2006
|
+
let player = undefined;
|
|
2007
|
+
if (!this.unAllocatedPlayers[playerType]) {
|
|
2008
|
+
this.populateMediaPool_();
|
|
2009
|
+
}
|
|
2010
|
+
if (this.unAllocatedPlayers[playerType].length == 0) {
|
|
2011
|
+
this.freeOnePlayer(playerType);
|
|
2012
|
+
}
|
|
2013
|
+
player = this.unAllocatedPlayers[playerType].pop();
|
|
2014
|
+
if (player) {
|
|
2015
|
+
player.pause();
|
|
2016
|
+
player.getMediaElement().loop = loop;
|
|
2017
|
+
player.getMediaElement().setAttribute('alt', altText);
|
|
2018
|
+
player.poster(poster);
|
|
2019
|
+
player.controls(controls);
|
|
2020
|
+
if (playsInline) {
|
|
2021
|
+
player.playsinline(true);
|
|
2271
2022
|
}
|
|
2023
|
+
player.updateHooks(hooks || {});
|
|
2024
|
+
player.updateMediaEventsContext(mediaEventsContextData);
|
|
2025
|
+
this.allocatedPlayers[playerType].push(player);
|
|
2026
|
+
player.playerId = playerId || this.allocatedPlayers[playerType].length;
|
|
2027
|
+
player.releaseCallback = onRelease;
|
|
2028
|
+
player.previousSrc = null;
|
|
2029
|
+
player.triggerMediaAllocate();
|
|
2030
|
+
return player;
|
|
2031
|
+
} else {
|
|
2032
|
+
console.log('no player found for allocation');
|
|
2272
2033
|
}
|
|
2273
|
-
}
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2034
|
+
}
|
|
2035
|
+
freeOnePlayer(type) {
|
|
2036
|
+
this.unAllocatePlayer(this.allocatedPlayers[type][0]); // free up the first allocated player
|
|
2037
|
+
}
|
|
2038
|
+
unAllocatePlayer(player) {
|
|
2039
|
+
if (player) {
|
|
2040
|
+
player.triggerMediaRelease();
|
|
2041
|
+
let type = this.getMediaTypeFromEl(player.el());
|
|
2042
|
+
this.allocatedPlayers[type] = this.allocatedPlayers[type].filter(p => p != player);
|
|
2043
|
+
player.previousSrc = player.currentSrc();
|
|
2044
|
+
player.controls(false);
|
|
2045
|
+
player.getMediaElement().loop = false;
|
|
2046
|
+
player.playsinline(false);
|
|
2047
|
+
player.src(blankSources[type]);
|
|
2048
|
+
player.poster('');
|
|
2049
|
+
clearTextTracks(player);
|
|
2050
|
+
this.unAllocatedPlayers[type].push(player);
|
|
2051
|
+
if (player.releaseCallback) {
|
|
2052
|
+
player.releaseCallback();
|
|
2053
|
+
player.releaseCallback = null;
|
|
2279
2054
|
}
|
|
2280
|
-
|
|
2281
|
-
_this.allPlayersForType(MediaType[key]).forEach(function (player) {
|
|
2282
|
-
player.muted(value);
|
|
2283
|
-
});
|
|
2284
|
-
});
|
|
2055
|
+
player.pause();
|
|
2285
2056
|
}
|
|
2286
|
-
}
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
return [].concat(_toConsumableArray(this.unAllocatedPlayers[type]), _toConsumableArray(this.allocatedPlayers[type]));
|
|
2291
|
-
}
|
|
2292
|
-
return [];
|
|
2293
|
-
}
|
|
2294
|
-
}, {
|
|
2295
|
-
key: "getMediaTypeFromEl",
|
|
2296
|
-
value: function getMediaTypeFromEl(mediaElement) {
|
|
2297
|
-
var tagName = mediaElement.tagName.toLowerCase();
|
|
2298
|
-
if (tagName == 'div') {
|
|
2299
|
-
tagName = mediaElement.children[0].tagName.toLowerCase();
|
|
2300
|
-
}
|
|
2301
|
-
return this.getMediaType(tagName);
|
|
2302
|
-
}
|
|
2303
|
-
}, {
|
|
2304
|
-
key: "getMediaType",
|
|
2305
|
-
value: function getMediaType(tagName) {
|
|
2306
|
-
switch (tagName) {
|
|
2307
|
-
case 'audio':
|
|
2308
|
-
return MediaType.AUDIO;
|
|
2309
|
-
case 'video':
|
|
2310
|
-
return MediaType.VIDEO;
|
|
2311
|
-
}
|
|
2057
|
+
}
|
|
2058
|
+
blessAll(value) {
|
|
2059
|
+
if (this.unAllocatedPlayers[MediaType.AUDIO] == undefined || this.unAllocatedPlayers[MediaType.VIDEO] == undefined) {
|
|
2060
|
+
this.populateMediaPool_();
|
|
2312
2061
|
}
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
Object.keys(MediaType).forEach(callbackFn.bind(this));
|
|
2317
|
-
}
|
|
2318
|
-
}, {
|
|
2319
|
-
key: "createPlayer_",
|
|
2320
|
-
value: function createPlayer_(type, mediaEl) {
|
|
2321
|
-
mediaEl.setAttribute('pool-element', elId++);
|
|
2322
|
-
if (!this.unAllocatedPlayers[type]) {
|
|
2323
|
-
this.unAllocatedPlayers[type] = [];
|
|
2324
|
-
this.allocatedPlayers[type] = [];
|
|
2325
|
-
}
|
|
2326
|
-
var player = createMediaPlayer({
|
|
2327
|
-
mediaElement: mediaEl,
|
|
2328
|
-
tagName: type
|
|
2062
|
+
this.forEachMediaType(key => {
|
|
2063
|
+
this.allPlayersForType(MediaType[key]).forEach(player => {
|
|
2064
|
+
player.muted(value);
|
|
2329
2065
|
});
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2066
|
+
});
|
|
2067
|
+
}
|
|
2068
|
+
allPlayersForType(type) {
|
|
2069
|
+
if (this.unAllocatedPlayers[type]) {
|
|
2070
|
+
return [...this.unAllocatedPlayers[type], ...this.allocatedPlayers[type]];
|
|
2334
2071
|
}
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
}
|
|
2072
|
+
return [];
|
|
2073
|
+
}
|
|
2074
|
+
getMediaTypeFromEl(mediaElement) {
|
|
2075
|
+
let tagName = mediaElement.tagName.toLowerCase();
|
|
2076
|
+
if (tagName == 'div') {
|
|
2077
|
+
tagName = mediaElement.children[0].tagName.toLowerCase();
|
|
2342
2078
|
}
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
});
|
|
2079
|
+
return this.getMediaType(tagName);
|
|
2080
|
+
}
|
|
2081
|
+
getMediaType(tagName) {
|
|
2082
|
+
switch (tagName) {
|
|
2083
|
+
case 'audio':
|
|
2084
|
+
return MediaType.AUDIO;
|
|
2085
|
+
case 'video':
|
|
2086
|
+
return MediaType.VIDEO;
|
|
2352
2087
|
}
|
|
2353
|
-
}
|
|
2354
|
-
|
|
2355
|
-
|
|
2088
|
+
}
|
|
2089
|
+
forEachMediaType(callbackFn) {
|
|
2090
|
+
Object.keys(MediaType).forEach(callbackFn.bind(this));
|
|
2091
|
+
}
|
|
2092
|
+
createPlayer_(type, mediaEl) {
|
|
2093
|
+
mediaEl.setAttribute('pool-element', elId++);
|
|
2094
|
+
if (!this.unAllocatedPlayers[type]) {
|
|
2095
|
+
this.unAllocatedPlayers[type] = [];
|
|
2096
|
+
this.allocatedPlayers[type] = [];
|
|
2097
|
+
}
|
|
2098
|
+
let player = createMediaPlayer({
|
|
2099
|
+
mediaElement: mediaEl,
|
|
2100
|
+
tagName: type
|
|
2101
|
+
});
|
|
2102
|
+
mediaEl.setAttribute('src', blankSources[type].src);
|
|
2103
|
+
player.muted(true);
|
|
2104
|
+
this.unAllocatedPlayers[type].push(player);
|
|
2105
|
+
return player;
|
|
2106
|
+
}
|
|
2107
|
+
initializeMediaPool_(type, mediaElSeed) {
|
|
2108
|
+
const playerCount = typeof this.playerCount === 'function' ? this.playerCount(type) : this.playerCount;
|
|
2109
|
+
while (this.allPlayersForType(type).length < playerCount) {
|
|
2110
|
+
this.createPlayer_(type, mediaElSeed.cloneNode(true));
|
|
2111
|
+
}
|
|
2112
|
+
}
|
|
2113
|
+
populateMediaPool_() {
|
|
2114
|
+
this.forEachMediaType(key => {
|
|
2115
|
+
let type = MediaType[key];
|
|
2116
|
+
let mediaEl = this.mediaFactory_[type].call(this);
|
|
2117
|
+
this.initializeMediaPool_(type, mediaEl);
|
|
2118
|
+
});
|
|
2119
|
+
}
|
|
2120
|
+
}
|
|
2356
2121
|
function clearTextTracks(player) {
|
|
2357
|
-
|
|
2358
|
-
|
|
2122
|
+
const tracks = player.textTracks();
|
|
2123
|
+
let i = tracks.length;
|
|
2359
2124
|
while (i--) {
|
|
2360
2125
|
player.removeRemoteTextTrack(tracks[i]);
|
|
2361
2126
|
}
|
|
2362
2127
|
}
|
|
2363
2128
|
|
|
2364
|
-
|
|
2129
|
+
const media = {
|
|
2365
2130
|
playerPool: new MediaPool({
|
|
2366
|
-
playerCount:
|
|
2367
|
-
return features.isEnabled('large_player_pool') ? 10 : 4;
|
|
2368
|
-
}
|
|
2131
|
+
playerCount: () => features.isEnabled('large_player_pool') ? 10 : 4
|
|
2369
2132
|
}),
|
|
2370
2133
|
muteState: true,
|
|
2371
2134
|
get muted() {
|
|
2372
2135
|
return this.muteState;
|
|
2373
2136
|
},
|
|
2374
|
-
mute: function
|
|
2137
|
+
mute: function (value) {
|
|
2375
2138
|
this.muteState = value;
|
|
2376
2139
|
this.playerPool.blessAll(value);
|
|
2377
2140
|
this.trigger('change:muted', value);
|
|
2378
2141
|
},
|
|
2379
|
-
getPlayer: function
|
|
2142
|
+
getPlayer: function (fileSource, options) {
|
|
2380
2143
|
options.playerType = options.tagName || MediaType.VIDEO;
|
|
2381
|
-
|
|
2144
|
+
let player = this.playerPool.allocatePlayer(options);
|
|
2382
2145
|
if (player) {
|
|
2383
2146
|
player.muted(this.muteState);
|
|
2384
2147
|
player.src(fileSource);
|
|
2385
2148
|
if (options.textTrackSources) {
|
|
2386
|
-
options.textTrackSources.forEach(
|
|
2387
|
-
return player.addRemoteTextTrack(track, true);
|
|
2388
|
-
});
|
|
2149
|
+
options.textTrackSources.forEach(track => player.addRemoteTextTrack(track, true));
|
|
2389
2150
|
}
|
|
2390
2151
|
if (browser.has('video scaling bug fixed by load')) {
|
|
2391
2152
|
player.load();
|
|
@@ -2393,7 +2154,7 @@ var media = {
|
|
|
2393
2154
|
return player;
|
|
2394
2155
|
}
|
|
2395
2156
|
},
|
|
2396
|
-
releasePlayer: function
|
|
2157
|
+
releasePlayer: function (player) {
|
|
2397
2158
|
if (player) {
|
|
2398
2159
|
this.playerPool.unAllocatePlayer(player);
|
|
2399
2160
|
}
|
|
@@ -2406,7 +2167,7 @@ Object.assign(media, BackboneEvents);
|
|
|
2406
2167
|
*
|
|
2407
2168
|
* @class
|
|
2408
2169
|
*/
|
|
2409
|
-
|
|
2170
|
+
const MultiPlayer = function (pool, options) {
|
|
2410
2171
|
if (options.crossFade && options.playFromBeginning) {
|
|
2411
2172
|
throw 'pageflow.Audio.MultiPlayer: The options crossFade and playFromBeginning can not be used together at the moment.';
|
|
2412
2173
|
}
|
|
@@ -2501,12 +2262,12 @@ var MultiPlayer = function MultiPlayer(pool, options) {
|
|
|
2501
2262
|
}
|
|
2502
2263
|
}
|
|
2503
2264
|
function startEventPropagation(player, id) {
|
|
2504
|
-
|
|
2265
|
+
let playCallback = function () {
|
|
2505
2266
|
that.trigger('play', {
|
|
2506
2267
|
audioFileId: id
|
|
2507
2268
|
});
|
|
2508
2269
|
};
|
|
2509
|
-
|
|
2270
|
+
let pauseCallback = function () {
|
|
2510
2271
|
that.trigger('pause', {
|
|
2511
2272
|
audioFileId: id
|
|
2512
2273
|
});
|
|
@@ -2514,17 +2275,17 @@ var MultiPlayer = function MultiPlayer(pool, options) {
|
|
|
2514
2275
|
player._stopMultiPlayerEventPropagation();
|
|
2515
2276
|
}
|
|
2516
2277
|
};
|
|
2517
|
-
|
|
2278
|
+
let timeUpdateCallback = function () {
|
|
2518
2279
|
that.trigger('timeupdate', {
|
|
2519
2280
|
audioFileId: id
|
|
2520
2281
|
});
|
|
2521
2282
|
};
|
|
2522
|
-
|
|
2283
|
+
let endedCallback = function () {
|
|
2523
2284
|
that.trigger('ended', {
|
|
2524
2285
|
audioFileId: id
|
|
2525
2286
|
});
|
|
2526
2287
|
};
|
|
2527
|
-
|
|
2288
|
+
let playFailedCallback = function () {
|
|
2528
2289
|
that.trigger('playfailed', {
|
|
2529
2290
|
audioFileId: id
|
|
2530
2291
|
});
|
|
@@ -2545,16 +2306,16 @@ var MultiPlayer = function MultiPlayer(pool, options) {
|
|
|
2545
2306
|
};
|
|
2546
2307
|
Object.assign(MultiPlayer.prototype, BackboneEvents);
|
|
2547
2308
|
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2309
|
+
const PlayerSourceIDMap = function (media, {
|
|
2310
|
+
playerOptions
|
|
2311
|
+
} = {}) {
|
|
2551
2312
|
return {
|
|
2552
2313
|
current: undefined,
|
|
2553
2314
|
previous: undefined,
|
|
2554
|
-
mapSources: function
|
|
2315
|
+
mapSources: function (id, sources) {
|
|
2555
2316
|
this[id] = sources;
|
|
2556
2317
|
},
|
|
2557
|
-
get: function
|
|
2318
|
+
get: function (sourceID) {
|
|
2558
2319
|
if (!this[sourceID]) {
|
|
2559
2320
|
return new AudioPlayer.Null();
|
|
2560
2321
|
}
|
|
@@ -2562,7 +2323,7 @@ var PlayerSourceIDMap = function PlayerSourceIDMap(media) {
|
|
|
2562
2323
|
return this.current;
|
|
2563
2324
|
}
|
|
2564
2325
|
if (this.previous && this.previous.playerId === sourceID) {
|
|
2565
|
-
|
|
2326
|
+
let holder = this.current;
|
|
2566
2327
|
this.current = this.previous;
|
|
2567
2328
|
this.previous = holder;
|
|
2568
2329
|
} else {
|
|
@@ -2570,17 +2331,18 @@ var PlayerSourceIDMap = function PlayerSourceIDMap(media) {
|
|
|
2570
2331
|
media.releasePlayer(this.previous);
|
|
2571
2332
|
}
|
|
2572
2333
|
this.previous = this.current;
|
|
2573
|
-
this.current = media.getPlayer(this[sourceID],
|
|
2334
|
+
this.current = media.getPlayer(this[sourceID], {
|
|
2574
2335
|
filePermaId: sourceID,
|
|
2575
|
-
playerId: sourceID
|
|
2576
|
-
|
|
2336
|
+
playerId: sourceID,
|
|
2337
|
+
...playerOptions
|
|
2338
|
+
});
|
|
2577
2339
|
}
|
|
2578
2340
|
return this.current;
|
|
2579
2341
|
}
|
|
2580
2342
|
};
|
|
2581
2343
|
};
|
|
2582
2344
|
|
|
2583
|
-
|
|
2345
|
+
const PlayerPool = function (audio, options) {
|
|
2584
2346
|
this.players = {};
|
|
2585
2347
|
this.get = function (audioFileId) {
|
|
2586
2348
|
this.players[audioFileId] = this.players[audioFileId] || audio.createPlayer(audioFileId, options);
|
|
@@ -2596,7 +2358,7 @@ var PlayerPool = function PlayerPool(audio, options) {
|
|
|
2596
2358
|
* @alias pageflow.audio
|
|
2597
2359
|
* @member
|
|
2598
2360
|
*/
|
|
2599
|
-
|
|
2361
|
+
const Audio = function (options) {
|
|
2600
2362
|
this.getSources = options.getSources || function (audioFileId) {
|
|
2601
2363
|
return options.audioFiles[audioFileId] || '';
|
|
2602
2364
|
};
|
|
@@ -2617,9 +2379,10 @@ var Audio = function Audio(options) {
|
|
|
2617
2379
|
this.createPlayer = function (audioFileId, options) {
|
|
2618
2380
|
var sources = this.getSources(removeSuffix(audioFileId));
|
|
2619
2381
|
if (sources) {
|
|
2620
|
-
return new AudioPlayer(sources,
|
|
2621
|
-
volumeFading: true
|
|
2622
|
-
|
|
2382
|
+
return new AudioPlayer(sources, {
|
|
2383
|
+
volumeFading: true,
|
|
2384
|
+
...options
|
|
2385
|
+
});
|
|
2623
2386
|
} else {
|
|
2624
2387
|
return new AudioPlayer.Null();
|
|
2625
2388
|
}
|
|
@@ -2659,10 +2422,10 @@ Audio.setup = function (options) {
|
|
|
2659
2422
|
|
|
2660
2423
|
Audio.PlayerPool = PlayerPool;
|
|
2661
2424
|
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
callbacks.forEach(
|
|
2425
|
+
let isEventAdded = false;
|
|
2426
|
+
let callbacks = [];
|
|
2427
|
+
let muteInBackground = () => {
|
|
2428
|
+
callbacks.forEach(cb => {
|
|
2666
2429
|
cb(document.visibilityState);
|
|
2667
2430
|
});
|
|
2668
2431
|
};
|
|
@@ -2673,14 +2436,12 @@ function documentHiddenState(callback) {
|
|
|
2673
2436
|
document.addEventListener('visibilitychange', muteInBackground, false);
|
|
2674
2437
|
}
|
|
2675
2438
|
return {
|
|
2676
|
-
removeCallback:
|
|
2677
|
-
callbacks = callbacks.filter(
|
|
2678
|
-
return c !== callback;
|
|
2679
|
-
});
|
|
2439
|
+
removeCallback: () => {
|
|
2440
|
+
callbacks = callbacks.filter(c => c !== callback);
|
|
2680
2441
|
}
|
|
2681
2442
|
};
|
|
2682
2443
|
}
|
|
2683
2444
|
|
|
2684
|
-
|
|
2445
|
+
const consent = Consent.create();
|
|
2685
2446
|
|
|
2686
2447
|
export { Audio, AudioPlayer, Consent, Features, MediaPool, MediaType, MultiPlayer, PlayerSourceIDMap, VideoPlayer, assetUrls, audioContext, blankSources, browser, consent, cookies, debugMode, documentHiddenState, events, features, log, media, mediaPlayer, setItemCookieString, settings };
|