script.js revision f70fc4052b72a850bbb9be585d0f5a4877ee9448
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 18 19/** 20 * Returns the page offset of an element. 21 * 22 * @param {Element} element The element to return the page offset for. 23 * @return {left: number, top: number} A tuple including a left and top value representing 24 * the page offset of the element. 25 */ 26function getTotalOffset(el) { 27 var result = { 28 left: 0, 29 top: 0 30 }; 31 var parent = el; 32 33 while (parent) { 34 result.left += parent.offsetLeft; 35 result.top += parent.offsetTop; 36 parent = parent.offsetParent; 37 } 38 39 return result; 40} 41 42function toggleQuotedText(e) { 43 var toggleElement = e.target; 44 var elidedTextElement = toggleElement.nextSibling; 45 var isHidden = getComputedStyle(elidedTextElement).display == 'none'; 46 toggleElement.innerHTML = isHidden ? MSG_HIDE_ELIDED : MSG_SHOW_ELIDED; 47 elidedTextElement.style.display = isHidden ? 'block' : 'none'; 48} 49 50function collapseQuotedText() { 51 var i; 52 var elements = document.getElementsByClassName("elided-text"); 53 var elidedElement, toggleElement; 54 for (i = 0; i < elements.length; i++) { 55 elidedElement = elements[i]; 56 toggleElement = document.createElement("div"); 57 toggleElement.display = "mail-elided-text"; 58 toggleElement.innerHTML = MSG_SHOW_ELIDED; 59 toggleElement.onclick = toggleQuotedText; 60 elidedElement.parentNode.insertBefore(toggleElement, elidedElement); 61 } 62} 63 64function shrinkWideMessages() { 65 var i; 66 var elements = document.getElementsByClassName("mail-message-content"); 67 var messageElement; 68 var documentWidth = document.documentElement.offsetWidth; 69 var scale; 70 for (i = 0; i < elements.length; i++) { 71 messageElement = elements[i]; 72 if (messageElement.scrollWidth > documentWidth) { 73 scale = documentWidth / messageElement.scrollWidth; 74 75 // TODO: 'zoom' is nice because it does a proper layout, but WebView seems to clamp the 76 // minimum 'zoom' level. 77 if (false) { 78 // TODO: this alternative works well in Chrome but doesn't work in WebView. 79 messageElement.style.webkitTransformOrigin = "left top"; 80 messageElement.style.webkitTransform = "scale(" + scale + ")"; 81 messageElement.style.height = (messageElement.offsetHeight * scale) + "px"; 82 messageElement.style.overflowX = "visible"; 83 } else { 84 messageElement.style.zoom = documentWidth / messageElement.scrollWidth; 85 } 86 } 87 } 88} 89 90function measurePositions() { 91 var messageTops; 92 var i; 93 var len; 94 95 var headers = document.querySelectorAll(".mail-message"); 96 97 messageTops = new Array(headers.length); 98 for (i = 0, len = headers.length; i < len; i++) { 99 // addJavascriptInterface handler only supports string arrays 100 messageTops[i] = "" + getTotalOffset(headers[i]).top; 101 } 102 103 window.mail.onWebContentGeometryChange(messageTops); 104} 105 106collapseQuotedText(); 107shrinkWideMessages(); 108measurePositions(); 109 110