| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | function toggleEnabled(event) { | 
 |   if (!document.body) | 
 |     return; | 
 |   if (document.body.hasAttribute('show-alt')) | 
 |     document.body.removeAttribute('show-alt'); | 
 |   else | 
 |     document.body.setAttribute('show-alt', ''); | 
 | } | 
 |  | 
 | function processImage(image) { | 
 |   image.style.setProperty('min-height', image.height + 'px'); | 
 |   image.style.setProperty('min-width', image.width + 'px'); | 
 |   var style = window.getComputedStyle(image, null); | 
 |   var contrastRatio = | 
 |       axs.utils.getContrastRatioForElementWithComputedStyle(style, image); | 
 |   if (contrastRatio != null && axs.utils.isLowContrast(contrastRatio, style)) { | 
 |     var bgColor = axs.utils.getBgColor(style, image); | 
 |     var fgColor = axs.utils.getFgColor(style, image, bgColor); | 
 |     var suggestedColors = axs.utils.suggestColors( | 
 |         bgColor, fgColor, contrastRatio, style); | 
 |     var suggestedColorsAA = suggestedColors['AA']; | 
 |     image.style.setProperty('color', suggestedColorsAA['fg']); | 
 |     image.style.setProperty( | 
 |         'background-color', suggestedColorsAA['bg'], 'important'); | 
 |   } | 
 |   if (!image.hasAttribute('alt')) { | 
 |     if (image.hasAttribute('_repaired')) | 
 |       return; | 
 |     var filename = image.src.split('/').pop(); | 
 |     image.setAttribute('_repaired', filename); | 
 |   } | 
 | } | 
 |  | 
 | var observer = new MutationObserver(function(mutations) { | 
 |   mutations.forEach(function(mutation) { | 
 |     if (!mutation.addedNodes || mutation.addedNodes.length == 0) | 
 |       return; | 
 |     for (var i = 0; i < mutation.addedNodes.length; i++) { | 
 |       var addedNode = mutation.addedNodes[i]; | 
 |       if (!(addedNode instanceof | 
 |           addedNode.ownerDocument.defaultView.HTMLImageElement)) { | 
 |         continue; | 
 |       } | 
 |       processImage(addedNode); | 
 |     } | 
 |   }); | 
 | }); | 
 | observer.observe(document, { childList: true, subtree: true }); | 
 |  | 
 | var images = document.querySelectorAll('img'); | 
 | for (var i = 0; i < images.length; i++) { | 
 |   processImage(images[i]); | 
 | } | 
 |  | 
 | if (!infobarDismissed) | 
 |     var infobarDismissed = false; | 
 |  | 
 | function createInfobar() { | 
 |   if (infobarDismissed) | 
 |       return; | 
 |  | 
 |   if (!document.body) | 
 |     return; | 
 |  | 
 |   if (document.querySelector('.show-alt-infobar')) | 
 |     return; | 
 |  | 
 |   var showAltInfobar = document.createElement('div'); | 
 |   showAltInfobar.className = 'show-alt-infobar'; | 
 |  | 
 |   var showAltInfoControls = document.createElement('div'); | 
 |   showAltInfoControls.className = 'controls'; | 
 |  | 
 |   var showAltInfoCloseButton = document.createElement('button'); | 
 |   showAltInfoCloseButton.className = 'close-button-gray'; | 
 |   showAltInfoCloseButton.addEventListener('click', function() { | 
 |     document.body.removeChild(showAltInfobar); | 
 |     infobarDismissed = true; | 
 |   }); | 
 |  | 
 |   showAltInfoControls.appendChild(showAltInfoCloseButton); | 
 |   showAltInfobar.appendChild(showAltInfoControls); | 
 |  | 
 |   var showAltInfoContent = document.createElement('div'); | 
 |   showAltInfoContent.className = 'content'; | 
 |   // TODO(aboxhall): i18n | 
 |   var showAltInfoText = document.createElement('span'); | 
 |   showAltInfoText.textContent = 'Images have been replaced by their alt text.'; | 
 |   showAltInfoText.setAttribute('role', 'status'); | 
 |   showAltInfoContent.appendChild(showAltInfoText); | 
 |  | 
 |   var undoButton = document.createElement('button'); | 
 |   undoButton.className = 'link-button'; | 
 |   undoButton.textContent = 'Undo'; | 
 |   undoButton.addEventListener('click', toggleEnabled); | 
 |  | 
 |   var closeButton = document.createElement('button'); | 
 |  | 
 |   showAltInfoContent.appendChild(undoButton); | 
 |   showAltInfobar.appendChild(showAltInfoContent); | 
 |  | 
 |   document.body.insertBefore(showAltInfobar, document.body.firstChild); | 
 | } |