Index: ui/accessibility/extensions/alt/hide-images.js |
diff --git a/ui/accessibility/extensions/alt/hide-images.js b/ui/accessibility/extensions/alt/hide-images.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2e9e37444e363ba8d4008d45b37f66bdb36ef1eb |
--- /dev/null |
+++ b/ui/accessibility/extensions/alt/hide-images.js |
@@ -0,0 +1,107 @@ |
+// 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); |
+} |