blob: 31b2f3312ff5c22c39333cc1695ead1799855930 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @fileoverview Code for inlining low resolution critical images.
* This javascript is part of DelayImages filter.
*
* @author pulkitg@google.com (Pulkit Goyal)
*/
// Exporting functions using quoted attributes to prevent js compiler from
// renaming them.
// See http://code.google.com/closure/compiler/docs/api-tutorial3.html#dangers
window['pagespeed'] = window['pagespeed'] || {};
var pagespeed = window['pagespeed'];
/**
* @constructor
*/
pagespeed.DelayImagesInline = function() {
/**
* Map of images whose low resolution image is present.
* @type {Object}
* @private
*/
this.inlineMap_ = {};
};
/**
* Add low res images to inlineMap_.
* @param {string} url of the image.
* @param {string} lowResImage low resolution base64 encoded image.
*/
pagespeed.DelayImagesInline.prototype.addLowResImages =
function(url, lowResImage) {
this.inlineMap_[url] = lowResImage;
};
pagespeed.DelayImagesInline.prototype['addLowResImages'] =
pagespeed.DelayImagesInline.prototype.addLowResImages;
/**
* For given elements, replace src with low res data url by looking up
* data-pagespeed-high-res-src attribute value in inlineMap_ (does nothing if
* the latter attribute is absent).
* @param {!NodeList<!Element>} elements list of DOM elements to check.
*/
pagespeed.DelayImagesInline.prototype.replaceElementSrc =
function(elements) {
for (var i = 0; i < elements.length; ++i) {
var high_res_src = elements[i].getAttribute('data-pagespeed-high-res-src');
var src = elements[i].getAttribute('src');
if (high_res_src && !src) {
var low_res = this.inlineMap_[high_res_src];
if (low_res) {
elements[i].setAttribute('src', low_res);
}
}
}
};
pagespeed.DelayImagesInline.prototype['replaceElementSrc'] =
pagespeed.DelayImagesInline.prototype.replaceElementSrc;
/**
* Replace images with the low resolution version if available.
*/
pagespeed.DelayImagesInline.prototype.replaceWithLowRes = function() {
this.replaceElementSrc(document.getElementsByTagName('img'));
this.replaceElementSrc(document.getElementsByTagName('input'));
};
pagespeed.DelayImagesInline.prototype['replaceWithLowRes'] =
pagespeed.DelayImagesInline.prototype.replaceWithLowRes;
/**
* Initializes the inline delay images module.
*/
pagespeed.delayImagesInlineInit = function() {
var temp = new pagespeed.DelayImagesInline();
pagespeed['delayImagesInline'] = temp;
};
pagespeed['delayImagesInlineInit'] = pagespeed.delayImagesInlineInit;