script.js revision 23014705ca9872cd5004a1aa76e83ae260165eca
1/* 2 * Copyright (C) 2012 Google Inc. 3 * Licensed to The Android Open Source Project. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18var BLOCKED_SRC_ATTR = "blocked-src"; 19 20/** 21 * Returns the page offset of an element. 22 * 23 * @param {Element} element The element to return the page offset for. 24 * @return {left: number, top: number} A tuple including a left and top value representing 25 * the page offset of the element. 26 */ 27function getTotalOffset(el) { 28 var result = { 29 left: 0, 30 top: 0 31 }; 32 var parent = el; 33 34 while (parent) { 35 result.left += parent.offsetLeft; 36 result.top += parent.offsetTop; 37 parent = parent.offsetParent; 38 } 39 40 return result; 41} 42 43function toggleQuotedText(e) { 44 var toggleElement = e.target; 45 var elidedTextElement = toggleElement.nextSibling; 46 var isHidden = getComputedStyle(elidedTextElement).display == 'none'; 47 toggleElement.innerHTML = isHidden ? MSG_HIDE_ELIDED : MSG_SHOW_ELIDED; 48 elidedTextElement.style.display = isHidden ? 'block' : 'none'; 49 measurePositions(); 50} 51 52function collapseQuotedText() { 53 var i; 54 var elements = document.getElementsByClassName("elided-text"); 55 var elidedElement, toggleElement; 56 for (i = 0; i < elements.length; i++) { 57 elidedElement = elements[i]; 58 toggleElement = document.createElement("div"); 59 toggleElement.className = "mail-elided-text"; 60 toggleElement.innerHTML = MSG_SHOW_ELIDED; 61 toggleElement.onclick = toggleQuotedText; 62 elidedElement.parentNode.insertBefore(toggleElement, elidedElement); 63 } 64} 65 66function normalizeMessageWidths() { 67 var i; 68 var elements = document.getElementsByClassName("mail-message-content"); 69 var messageElement; 70 var documentWidth = document.documentElement.offsetWidth; 71 var scale; 72 for (i = 0; i < elements.length; i++) { 73 messageElement = elements[i]; 74 messageElement.style.zoom = documentWidth / messageElement.scrollWidth; 75 } 76} 77 78function hideUnsafeImages() { 79 var i, bodyCount; 80 var j, imgCount; 81 var body, image; 82 var images; 83 var showImages; 84 var bodies = document.getElementsByClassName("mail-message-content"); 85 for (i = 0, bodyCount = bodies.length; i < bodyCount; i++) { 86 body = bodies[i]; 87 showImages = body.classList.contains("mail-show-images"); 88 89 images = body.getElementsByTagName("img"); 90 for (j = 0, imgCount = images.length; j < imgCount; j++) { 91 image = images[j]; 92 attachImageLoadListener(image); 93 // TODO: handle inline image attachments for all supported protocols 94 if (!showImages) { 95 blockImage(image); 96 } 97 } 98 } 99} 100 101function attachImageLoadListener(imageElement) { 102 // Reset the src attribute to the empty string because onload will only fire if the src 103 // attribute is set after the onload listener. 104 var originalSrc = imageElement.src; 105 imageElement.src = ''; 106 imageElement.onload = measurePositions; 107 imageElement.src = originalSrc; 108} 109 110function blockImage(imageElement) { 111 var src = imageElement.src; 112 if (src.indexOf("http://") == 0 || src.indexOf("https://") == 0) { 113 imageElement.setAttribute(BLOCKED_SRC_ATTR, src); 114 imageElement.src = "data:"; 115 } 116} 117 118function setWideViewport() { 119 var metaViewport = document.getElementById('meta-viewport'); 120 metaViewport.setAttribute('content', 'width=' + WIDE_VIEWPORT_WIDTH); 121} 122 123// BEGIN Java->JavaScript handlers 124function measurePositions() { 125 var overlayBottoms; 126 var h; 127 var i; 128 var len; 129 130 var expandedSpacerDivs = document.querySelectorAll(".expanded > .spacer"); 131 132 overlayBottoms = new Array(expandedSpacerDivs.length + 1); 133 for (i = 0, len = expandedSpacerDivs.length; i < len; i++) { 134 h = expandedSpacerDivs[i].offsetHeight; 135 // addJavascriptInterface handler only supports string arrays 136 overlayBottoms[i] = "" + (getTotalOffset(expandedSpacerDivs[i]).top + h); 137 } 138 // add an extra one to mark the bottom of the last message 139 overlayBottoms[i] = "" + document.body.offsetHeight; 140 141 window.mail.onWebContentGeometryChange(overlayBottoms); 142} 143 144function unblockImages(messageDomId) { 145 var i, images, imgCount, image, blockedSrc; 146 var msg = document.getElementById(messageDomId); 147 if (!msg) { 148 console.log("can't unblock, no matching message for id: " + messageDomId); 149 return; 150 } 151 images = msg.getElementsByTagName("img"); 152 for (i = 0, imgCount = images.length; i < imgCount; i++) { 153 image = images[i]; 154 blockedSrc = image.getAttribute(BLOCKED_SRC_ATTR); 155 if (blockedSrc) { 156 image.src = blockedSrc; 157 image.removeAttribute(BLOCKED_SRC_ATTR); 158 } 159 } 160} 161 162function setMessageHeaderSpacerHeight(messageDomId, spacerHeight) { 163 var spacer = document.querySelector("#" + messageDomId + " > .mail-message-header"); 164 if (!spacer) { 165 console.log("can't set spacer for message with id: " + messageDomId); 166 return; 167 } 168 spacer.style.height = spacerHeight + "px"; 169 measurePositions(); 170} 171 172function setMessageBodyVisible(messageDomId, isVisible, spacerHeight) { 173 var i, len; 174 var visibility = isVisible ? "block" : "none"; 175 var messageDiv = document.querySelector("#" + messageDomId); 176 var collapsibleDivs = document.querySelectorAll("#" + messageDomId + " > .collapsible"); 177 if (!messageDiv || collapsibleDivs.length == 0) { 178 console.log("can't set body visibility for message with id: " + messageDomId); 179 return; 180 } 181 messageDiv.classList.toggle("expanded"); 182 for (i = 0, len = collapsibleDivs.length; i < len; i++) { 183 collapsibleDivs[i].style.display = visibility; 184 } 185 setMessageHeaderSpacerHeight(messageDomId, spacerHeight); 186} 187 188function replaceSuperCollapsedBlock(startIndex) { 189 var parent, block, header; 190 191 block = document.querySelector(".mail-super-collapsed-block[index='" + startIndex + "']"); 192 if (!block) { 193 console.log("can't expand super collapsed block at index: " + startIndex); 194 return; 195 } 196 parent = block.parentNode; 197 block.innerHTML = window.mail.getTempMessageBodies(); 198 199 header = block.firstChild; 200 while (header) { 201 parent.insertBefore(header, block); 202 header = block.firstChild; 203 } 204 parent.removeChild(block); 205 measurePositions(); 206} 207// END Java->JavaScript handlers 208 209collapseQuotedText(); 210hideUnsafeImages(); 211normalizeMessageWidths(); 212//setWideViewport(); 213measurePositions(); 214 215