MDL-57608 media_videojs: load youtube module only when requested
authorMarina Glancy <marina@moodle.com>
Wed, 11 Jan 2017 06:13:56 +0000 (14:13 +0800)
committerMarina Glancy <marina@moodle.com>
Thu, 12 Jan 2017 02:55:11 +0000 (10:55 +0800)
media/player/videojs/amd/build/loader.min.js
media/player/videojs/amd/src/loader.js
media/player/videojs/classes/plugin.php

index 436b2da..c025c23 100644 (file)
Binary files a/media/player/videojs/amd/build/loader.min.js and b/media/player/videojs/amd/build/loader.min.js differ
index be7a1f0..0491576 100644 (file)
  * @copyright  2016 Frédéric Massart - FMCorz.net
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
-define(['jquery', 'media_videojs/video', 'core/event'], function($, videojs, Event) {
+define(['jquery', 'core/event'], function($, Event) {
+
+    /**
+     * Stores the method we need to execute on the first load of videojs module.
+     */
+    var onload;
 
     /**
      * Set-up.
      *
      * Adds the listener for the event to then notify video.js.
+     * @param {Function} executeonload function to execute when media_videojs/video is loaded
      */
-    var setUp = function() {
+    var setUp = function(executeonload) {
+        onload = executeonload;
+        // Notify Video.js about the nodes already present on the page.
+        notifyVideoJS(null, $('body'));
         // We need to call popover automatically if nodes are added to the page later.
         Event.getLegacyEvents().done(function(events) {
             $(document).on(events.FILTER_CONTENT_UPDATED, notifyVideoJS);
@@ -53,9 +62,20 @@ define(['jquery', 'media_videojs/video', 'core/event'], function($, videojs, Eve
             .addBack(selector)
             .find('audio, video').each(function() {
                 var id = $(this).attr('id'),
-                    config = $(this).data('setup');
+                    config = $(this).data('setup'),
+                    modules = ['media_videojs/video'];
 
-                videojs(id, config);
+                if (config.techOrder && config.techOrder.indexOf('youtube') !== -1) {
+                    // Add YouTube to the list of modules we require.
+                    modules.push('media_videojs/Youtube');
+                }
+                require(modules, function(videojs) {
+                    if (onload) {
+                        onload(videojs);
+                        onload = null;
+                    }
+                    videojs(id, config);
+                });
             });
     };
 
index ff82f98..f13352f 100644 (file)
@@ -334,21 +334,19 @@ class media_videojs_plugin extends core_media_player_native {
      */
     public function setup($page) {
 
-        // Load core video JS.
+        // Load dynamic loader. It will scan page for videojs media and load necessary modules.
+        // Loader will be loaded on absolutely every page, however the videojs will only be loaded
+        // when video is present on the page or added later to it in AJAX.
         $path = new moodle_url('/media/player/videojs/videojs/video-js.swf');
         $contents = 'videojs.options.flash.swf = "' . $path . '";' . "\n";
         $contents .= $this->find_language(current_language());
         $page->requires->js_amd_inline(<<<EOT
-require(["media_videojs/video"], function(videojs) {
-$contents
+require(["media_videojs/loader"], function(loader) {
+    loader.setUp(function(videojs) {
+        $contents
+    });
 });
 EOT
         );
-
-        // Load Youtube JS.
-        $page->requires->js_amd_inline('require(["media_videojs/Youtube"])');
-
-        // Load dynamic loader.
-        $page->requires->js_call_amd('media_videojs/loader', 'setUp');
     }
 }