Changeset 246094 in webkit


Ignore:
Timestamp:
Jun 4, 2019 7:21:26 PM (5 years ago)
Author:
Jon Davis
Message:

Improve performance of the lazy image loader
https://bugs.webkit.org/show_bug.cgi?id=198530

Reviewed by Devin Rousso.

  • wp-content/themes/webkit/scripts/global.js:

(enableScrollableTables):
(lazyLoadImages):
(findParentMenu): Deleted.
(i.m.menus.m.targetMenu.targetMenuClass.indexOf): Deleted.
(inView): Deleted.
(): Deleted.
(loadImage.else.img.onload): Deleted.
(loadImage): Deleted.
(onMovement): Deleted.
(updateImages): Deleted.

Location:
trunk/Websites/webkit.org
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Websites/webkit.org/ChangeLog

    r244992 r246094  
     12019-06-04  Jon Davis  <jond@apple.com>
     2
     3        Improve performance of the lazy image loader
     4        https://bugs.webkit.org/show_bug.cgi?id=198530
     5
     6        Reviewed by Devin Rousso.
     7
     8        * wp-content/themes/webkit/scripts/global.js:
     9        (enableScrollableTables):
     10        (lazyLoadImages):
     11        (findParentMenu): Deleted.
     12        (i.m.menus.m.targetMenu.targetMenuClass.indexOf): Deleted.
     13        (inView): Deleted.
     14        (): Deleted.
     15        (loadImage.else.img.onload): Deleted.
     16        (loadImage): Deleted.
     17        (onMovement): Deleted.
     18        (updateImages): Deleted.
     19
    1202019-05-06  Justin Fan  <justin_fan@apple.com>
    221
     
    99118
    100119        Reviewed by Devin Rousso.
    101        
     120
    102121        The short viewport breakpoint styles should apply for small width
    103         windows as well, and pagination styles need to accommodate wrapped 
     122        windows as well, and pagination styles need to accommodate wrapped
    104123        text labels.
    105124
  • trunk/Websites/webkit.org/wp-content/themes/webkit/scripts/global.js

    r238056 r246094  
    11document.addEventListener('DOMContentLoaded', function () {
    2     var openClass = ' open-menu',
    3         menuClass = 'menu-item-has-children',
    4         menus = document.querySelectorAll('#site-nav > div > .menu > .menu-item'),
    5         menuLinks = document.querySelectorAll('#site-nav > div > .menu > .menu-item > a'),
    6         menuitems = document.querySelectorAll('#site-nav .menu-item-has-children .menu-item > a');
    7 
    8     function findParentMenu (element, className) {
    9         while ( (element = element.parentElement) && ! element.classList.contains(className) );
    10         return element;
    11     }
    12 
    13     for (var i = 0; i < menuLinks.length; ++i) {
    14         menuLinks[i].addEventListener('focus', function (e) {
    15             var openMenus = findParentMenu(e.target, 'menu').getElementsByClassName(openClass.trim());
    16             for (var m = 0; m < openMenus.length; ++m) {
    17                 openMenus[m].className = openMenus[m].className.replace(openClass, "");
    18             }
    19         });
    20     }
    21 
    22     for (var i = 0; i < menuitems.length; ++i) {
    23         menuitems[i].addEventListener('focus', function (e) {
    24             var targetMenu = findParentMenu(e.target, menuClass),
    25                 targetMenuClass = null;
    26 
    27             if ( targetMenu != undefined )
    28                 targetMenuClass = targetMenu.className;
    29 
    30             for (var m = 0; m < menus.length; ++m) {
    31                 menus[m].className.replace(openClass, "");
    32                 if (menus[m] == targetMenu) {
    33                     if (targetMenuClass.indexOf(openClass) == -1) {
    34                         targetMenu.className += openClass;
    35                     }
    36                 } else {
    37                     menus[m].className = menus[m].className.replace(openClass, "");
    38                 }
    39             }
    40         });
    41     }
    42 
    43     var latest = [], updating = false;
    44     function inView(element) {
    45         var box = element.getBoundingClientRect();
    46         return ( (box.top >= 0 && box.left >= 0 && box.top) <= (window.innerHeight || document.documentElement.clientHeight));
    47     }
    48 
    49     function stageImage(element, src) {
    50         element.style.backgroundImage = 'url(' + src + ')';
    51         if (!element.parentElement.classList.contains('loaded'))
    52             element.parentElement.classList.add('loaded');
    53     }
    54 
    55     function loadImage(element) {
    56         var src = element.getAttribute('data-url');
    57 
    58         if (sessionStorage.getItem(src)) {
    59             setTimeout(function () { stageImage(element, src); }, 1);
    60         } else {
    61             var img = new Image();
    62             img.src = src;
    63             img.onload = function() {
    64                 stageImage(element,src);
    65 
    66                 try {
    67                     sessionStorage.setItem(src, true);
    68                 } catch (error) {
    69                     return false; // private browsing
    70                 }
    71                 img = undefined;
    72             }
    73         }
    74 
    75     }
    76 
    77     function onMovement() {
    78         if (!updating)
    79             requestAnimationFrame(updateImages);
    80         updating = true;
    81     }
    82 
    83     function updateImages() {
    84         updating = false;
    85 
    86         for (var i = 0; i < imgs.length; i++) {
    87             if ( inView(imgs[i]) )
    88                 loadImage(imgs[i]);
    89         }
    90 
    91     }
    922
    933    function enableScrollableTables () {
    94         var tables = document.querySelectorAll('.bodycopy > table');
    95         var tableCount = tables.length;
     4        let tables = document.querySelectorAll('#content .bodycopy > table');
    965
    97         for (var i = 0; i < tableCount; i++) {
    98             var scrollableDiv = document.createElement('div');
    99             var paddingDiv = document.createElement('div');
     6        for (let table of tables) {
     7            let scrollableDiv = document.createElement('div');
     8            let paddingDiv = document.createElement('div');
    1009
    10110            scrollableDiv.classList.add('scrollable');
     
    10312
    10413            scrollableDiv.appendChild(paddingDiv);
    105             tables[i].parentNode.insertBefore(scrollableDiv, tables[i]);
     14            table.parentNode.insertBefore(scrollableDiv, table);
    10615
    107             paddingDiv.appendChild(tables[i]);
     16            paddingDiv.appendChild(table);
    10817        }
    10918    }
    11019
    111     var imgs = document.querySelectorAll('div[data-url]');
    112     document.addEventListener('scroll', onMovement);
    113     document.addEventListener('resize', onMovement);
     20    function lazyLoadImages () {
     21        let backgroundImages = document.querySelectorAll('#content div[data-url]');
     22        if (backgroundImages.length == 0)
     23            return;
     24        let lazyloadImageObserver = new IntersectionObserver(function (changes) {
     25            for (let change of changes) {
     26                if (!change.isIntersecting)
     27                    return;
     28                change.target.style.backgroundImage = 'url(' + change.target.getAttribute('data-url') + ')';
     29                change.target.parentElement.classList.add('loaded');
     30                lazyloadImageObserver.unobserve(change.target);
     31            }
     32        });
     33        for (let element of backgroundImages)
     34            lazyloadImageObserver.observe(element);
     35    }
    11436
    115     updateImages();
     37    if (window.IntersectionObserver)
     38        lazyLoadImages();
    11639    enableScrollableTables();
    11740
Note: See TracChangeset for help on using the changeset viewer.