Version in base suite: 2.1.6-1 Base version: compactheader_2.1.6-1 Target version: compactheader_3.0.0~beta5-2~deb10u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/c/compactheader/compactheader_2.1.6-1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/c/compactheader/compactheader_3.0.0~beta5-2~deb10u1.dsc .hgignore | 13 .hgtags | 78 .travis.yml | 30 README.md | 8 appveyor.yml | 18 build.xml | 83 chrome.manifest | 23 chrome/CompactHeader/content/RSSLinkify.js | 28 chrome/CompactHeader/content/compactHeaderOverlay.js | 2274 ++++++------ chrome/CompactHeader/content/compactHeaderOverlay.xul | 87 chrome/CompactHeader/content/compactHeaderOverlayPost69.xul | 67 chrome/CompactHeader/content/compactHeaderOverlayPre69.xul | 105 chrome/CompactHeader/content/debug.js | 8 chrome/CompactHeader/content/preferences.js | 19 chrome/CompactHeader/content/preferences.xul | 52 chrome/CompactHeader/content/toolbar.js | 155 chrome/CompactHeader/skin/global/headerButtons69.css | 61 debian/changelog | 56 debian/compat | 1 debian/control | 40 debian/copyright | 6 debian/gbp.conf | 6 debian/patches/Add-German-localization-to-install.rdf.patch | 49 debian/patches/series | 1 debian/rules | 15 debian/upstream-changelog | 133 debian/webext-compactheader.install | 4 debian/webext-compactheader.links | 2 defaults/preferences/prefs.js | 5 install.rdf | 145 manifest.json | 23 test/compactheader/default_off.json | 4 test/compactheader/test-compactheader-collapse.js | 1007 ++--- test/compactheader/test-compactheader-context-copy.js | 37 test/compactheader/test-compactheader-dark-on-focus.js | 37 test/compactheader/test-compactheader-preferences.js | 37 test/compactheader/test-compactheader-toolbar.js | 1851 +++++---- test/compactheader/test-ewait.js | 38 test/compactheader/test-more-button.js | 119 test/compactheader/test-other-actions-button.js | 37 test/executeTests.py | 393 +- test/find_beta_build.py | 37 test/find_nightly_build.py | 168 test/shared-modules/test-compactheader-helpers.js | 98 test/testapps.json | 80 test/testapps_template.json | 132 46 files changed, 4333 insertions(+), 3337 deletions(-) diff -Nru compactheader-2.1.6/.hgignore compactheader-3.0.0~beta5/.hgignore --- compactheader-2.1.6/.hgignore 2018-08-18 00:45:39.000000000 +0000 +++ compactheader-3.0.0~beta5/.hgignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - -syntax: regexp -^AMO$ -syntax: regexp -^test/ftp$ -syntax: regexp -^test/test-.* -syntax: regexp -log-.*.txt -syntax: regexp -^pushgit\.bat$ -syntax: regexp -^test/large-to-header\.txt$ \ No newline at end of file diff -Nru compactheader-2.1.6/.hgtags compactheader-3.0.0~beta5/.hgtags --- compactheader-2.1.6/.hgtags 2018-08-18 00:45:39.000000000 +0000 +++ compactheader-3.0.0~beta5/.hgtags 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -002da0706241988afec0b00a362cfbca6140d8ce V_1_2_5_beta1 -085b2719688adfab60ef0cb648fa9ec9a1f615d3 V_1_3_0beta2 -0f12028638c1015b898c349aa83e3ccac9421916 V_1_0_2 -1226d206722edf67e78f48940a5be569f837a4ca version_0_6_2 -39d5f3ae71e050d1fc659cdab6f3814bc8f32ec3 V_2_0_0_beta_1 -559d76f889883711eb45a1f86a3a04aebbe8a374 V_1_2_1 -5eabf7c2d13978843074a086bd379d6c0cb51205 V_1_1_7 -669232304adc0ab90bf9f044eab4a8b8b9884c93 V_1_0_1 -790f50d88c2f0ab1c2d711ceb4fe954676fc6a51 V_1_0_0_ -8e15c04db83e5d40229b4a11b60c17ae23d6e1dc V_1_2_0 -952966e5f96d7f3c2e8eb3dce053bf702b5b8cc5 V_1_2_4 -97ac414e643557d62944df95b9a5aa5fe00de5eb V_1_1_6 -a2ad32711fcb9f1dd3498f144bbb81e5e742f0bb V_1_1_4 -c70cdc3efd29cffeb0f33441b39f1f998a711d72 V_1_2_3 -dd6a10b05ff33395ddbd8d47923e31e98cb9adb7 V_1_1_5 -e6befa63248936b65cf6dc11a647f31932d23275 V_1_1_5beta5 -eb681a4e600a4fca43a9706ff8ce8fb462f6b1bd V_1_3_0beta1 -ed7ee91b2ad0d6a02fc46720541212fa81533506 V_1_1_8 -ee6fecef652aebb739e29ca90012b33200b27299 V_1_2_0_beta1 -ee879e086607a15e7b4c8a3c356789154b36bed5 V_1_2_2 -ba8d44d825b0448ce5ef9f33caebf15fc51aedd4 V_1_4_0_beta2 -f701d2ede22af41f9e8db469148cf392d09c4f5a V_1_4_0 -67883ad600135a8d1766c686f890a0c7785081ca V_1_4_0 -d0476065ffe9a7be12de5fc68457eb969a4edaa5 V_1_4_1 -af7b065e63b91b036c92b3561706e7786ec352af V_1_4_2beta1 -8b74d6a6478a5d275908be59fc6aa1237a93b938 V_1_4_2beta2 -53a597dd8ac666f1dd87d33fabb8058aa2fb8811 V_1_4_2beta3 -90c661c94af0d16d1849c857b27b54417e434385 V_1_4_2beta4 -72e6ecaa24f3a1dea2b44a3c5f9bb2b109bf80f0 V_1_4_2beta5 -86d7f79a2a512f6b9405317f668aa5f077e77ead V_1_4_2 -71562d5ae32061477168fc780c12ad7dc5a25785 V_1_4_3beta1 -7340faf767f21b96806d758113fec406ed1fe677 V_1_4_3beta2 -c767ab47cef466eafd7845cecdfcd1e978c32009 V_1_4_3 -c767ab47cef466eafd7845cecdfcd1e978c32009 V_1_4_3 -a76216e6063ee82ac8f4c0c6a2b8321abfe42103 V_1_4_3 -d4b86697975aafe96e0b5e025d4b3231f0d891af V_1_4_4beta1 -573c3715fdb341de9b95dd9b6e90491b1f6409da V_1_4_5beta1 -4657fb5172bb49de040d78da819b02a29bd93df8 V_1_4_5beta2 -ba6106561e04402ecc908d85e037d34d7fe69122 V_1_4_5beta3 -6093962e4e97b7f9451d1a38f45ca072b6913e45 V_1_4_5beta4 -dd65a796824167b7e2501ba96fea6d2916fcfdea V_1_4_5 -61522db0c6303e234f877ac881f4dbf3fbb78f1a V_1_4_6beta1 -6579eab72d38bdd667e9b53b93bb14c04dda071e V_1_4_6beta2 -e4638c75258ad5ed4cd0ec5d4d5c7367541e8e78 V_1_4_6 -a9e41c7ef236eb30a9d7d28d935430f340dfab73 V_2_0_0_alpha_2 -9e1fb21fa7bf041255271ef8d9d5ce5a82ec40ee V_2_0_0beta1 -78fe2c5d07d3641ea1efbe8d5167fc76aeb2a7bb V_2_0_0 -28a57cc041c57af84326c06ea7b54ff235432be4 V_2_0_1beta1 -a2c94a80f2a4d848cf79d6ec527b4085042a5e64 V_2_0_1 -030deedd51fbdf8b613a8abe116d6254aa56f972 V_2_0_2 -fdbf7519af86535ed7cf0f59292b5b7527858217 V_2_0_3beta1 -c8ecafdab7a5d4f2e0f7c8212e1a49552d4ef6bd V_2_0_3beta2 -611249bdd06e8392cd7c44d29fc3fc56eb01385c V_2_0_2beta2 -9f87f64510eeaa0822aa0066d1fc246d155d1371 V_2_0_3beta3 -8c20b89055fb6e909f3fd5caee8e1cba5cb2e03a V_2_0_2beta1 -82ebe90f78532a39a0371ea7fe3bfd6e41209459 V_2_0_3 -b2265790f2ebae3b1647a15dbda086e99f795c51 V_2_0_4beta1 -cbb7989ca07ebb0eb7126862827613e94d0b9cc0 V_2_0_4beta2 -c34c3658de7ec2270be8db18770aa8c081449166 V_2_0_4 -131add685e554e4d43bed78d54fd132a82e03188 V_2_0_5beta1 -6fda259f7966ccbcd4529b04225244971a2280d2 V_2_0_5beta2 -d2543c3bafb7b63c9c57a590e22f4bcd5ed2f975 V_2_0_5 -83b89b2afbfa8191937e713686eb9dfe3a9bc744 V_2_0_6beta1 -b1ff0d2731183bbd9130f30fa678e6fee1c8cc3a V_2_0_6beta2 -300bc6edc45b79caf8a21756abd2803ac05baebd V_2_0_6 -27bfd053a909fa87a29d6ea5251a1238013fc75e V_2_0_7beta1 -180585cd620ca43ffb060c052ec7fbcf484a35c8 V_2_0_7beta2 -a196237349559c4f2eca0b41c01f46510e28f983 V_2_0_7beta3 -7ceb9d1fa0c47793820704c73df0cfe309bc1893 V_2_0_7 -f215e89b748cd8e1538584a16e29a8aef818569f V_2_0_8beta1 -d1a2a848c5763af882effe3f1b149071e47e147b V_2_0_8beta2 -8da8524e4c60557a3c3c4723103e0e00dff4e826 V_2_0_8 -3e87cf97c71255ef133cdea5ce67f40f6d0128f3 V_2_0_8beta3 -3e87cf97c71255ef133cdea5ce67f40f6d0128f3 V_2_0_8beta3 -0000000000000000000000000000000000000000 V_2_0_8beta3 -c3072d9044c63860604fd62830cf6ec836720fac V_2_0_9beta2 -06ff59781da900fa0e3ac6c60c2a49cff5e9fdab V_2_0_9 -290d2ce7fc8e01e56ad284f325704f74d7f739a3 github/branch36.0a1 diff -Nru compactheader-2.1.6/.travis.yml compactheader-3.0.0~beta5/.travis.yml --- compactheader-2.1.6/.travis.yml 2018-08-18 00:45:39.000000000 +0000 +++ compactheader-3.0.0~beta5/.travis.yml 2019-11-20 20:21:33.000000000 +0000 @@ -1,13 +1,11 @@ language: java os: - - osx - linux +# - osx env: - - VERSION=ESR -# - VERSION=beta -# - VERSION=nightly + - VERSION=esr68 cache: directories: @@ -23,24 +21,26 @@ fi before_script: - - wget https://downloads.sourceforge.net/project/xmltask/xmltask/1.16.1/xmltask.jar - - export CLASSPATH=`pwd`/xmltask.jar:$CLASSPATH - | if [[ $TRAVIS_OS_NAME != 'osx' ]]; then export DISPLAY=:99.0 /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1920x1080x16 -extension RANDR sleep 5 # give xvfb some time to start metacity --sm-disable --replace 2>/dev/null & - sudo python -m pip install bs4 - sudo python -m pip install lxml - sudo python -m pip install requests + sudo python2 -m pip install --upgrade pyOpenSSL + sudo python2 -m pip install bs4 + sudo python2 -m pip install requests + sudo python2 -m pip install treeherder-client fi - | if [[ $TRAVIS_OS_NAME == 'osx' ]]; then - wget -qO- https://bootstrap.pypa.io/get-pip.py | sudo python - sudo python -m pip install bs4 - sudo python -m pip install lxml - sudo python -m pip install requests + /Library/Application\ Support/VMware\ Tools/vmware-resolutionSet 1400 1200 # 1280 x 1024 + system_profiler SPDisplaysDataType | grep Resolution + wget -qO- https://bootstrap.pypa.io/get-pip.py | sudo python2 + sudo python2 -m pip install urllib3[secure] + sudo python2 -m pip install bs4 + sudo python2 -m pip install requests + sudo python2 -m pip install treeherder-client export PIP_INDEX_URL=http://pypi.pub.build.mozilla.org/pub export PIP_TRUSTED_HOST="pypi.pub.build.mozilla.org" export PIP_FIND_LINKS="/tmp/compactheader http://pypi.pub.build.mozilla.org/pub" @@ -49,5 +49,5 @@ script: - ant buildAMO - cd test - - python ./find_beta_build.py - - python ./executeTests.py --version $VERSION + - python2 ./find_nightly_build.py --version $VERSION + - python2 ./executeTests.py --version $VERSION diff -Nru compactheader-2.1.6/README.md compactheader-3.0.0~beta5/README.md --- compactheader-2.1.6/README.md 2018-08-18 00:45:39.000000000 +0000 +++ compactheader-3.0.0~beta5/README.md 2019-11-20 20:21:33.000000000 +0000 @@ -5,6 +5,14 @@ compact and expanded view. Options to switch between one or two lines compact view, which buttons should be displayed in header pane. +### Build status +|TB branch|Linux builds|Windows builds| +| ------------- | ------------- | ------------- | +|ESR 60: |![Build Status](https://travis-ci.org/jmozmoz/compactheader.svg?branch=esr)|![Build Status](https://ci.appveyor.com/api/projects/status/mmvvkm83lajuunms/branch/esr?svg=true)| +|ESR 68: |![Build Status](https://travis-matrix-badges.herokuapp.com/repos/jmozmoz/compactheader/branches/master/2)|![Build Status](https://appveyor-matrix-badges.herokuapp.com/repos/jmozmoz/compactheader/branch/master/2)| +|beta: |disabled|disabled| +|beta: |disabled|disabled| + ### Description Thunderbird does not anymore have the ability to reduce the display size of diff -Nru compactheader-2.1.6/appveyor.yml compactheader-3.0.0~beta5/appveyor.yml --- compactheader-2.1.6/appveyor.yml 2018-08-18 00:45:39.000000000 +0000 +++ compactheader-3.0.0~beta5/appveyor.yml 2019-11-20 20:21:33.000000000 +0000 @@ -1,11 +1,10 @@ environment: matrix: - - VERSION: ESR + - VERSION: esr68 PYTHON: "C:\\Python27_64" -# - VERSION: beta -# PYTHON: "C:\\Python27_64" -# - VERSION: nightly -# PYTHON: "C:\\Python27_64" + +cache: + - C:\tmp\compactheader\ftp install: - ECHO "Filesystem root:" @@ -35,9 +34,10 @@ - "where wget" - "sed --version" - "where sed" + - "pip install wheel" - "pip install bs4" - - "pip install lxml" - "pip install requests" + - "pip install treeherder-client" - ps: choco install ant --ignore-dependencies # - wget -q --no-check-certificate https://www.us.apache.org/dist//ant/binaries/apache-ant-1.10.2-bin.zip @@ -47,8 +47,8 @@ - "ant -h" - "where ant" - - wget -q --no-check-certificate https://downloads.sourceforge.net/project/xmltask/xmltask/1.16.1/xmltask.jar - - set "CLASSPATH=%CD%\\xmltask.jar;%CLASSPATH%" + - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/set-screenresolution.ps1')) + - ps: Set-ScreenResolution 1920 1080 build: false # Not a C# project, build stuff at the test step instead. @@ -56,6 +56,6 @@ # Build the compiled extension and run the project tests - ant buildAMO - cd test - - python ./find_beta_build.py + - if not %VERSION%==ESR ( python ./find_nightly_build.py --version %VERSION% ) - python ./executeTests.py --version %VERSION% diff -Nru compactheader-2.1.6/build.xml compactheader-3.0.0~beta5/build.xml --- compactheader-2.1.6/build.xml 2018-08-18 00:45:39.000000000 +0000 +++ compactheader-3.0.0~beta5/build.xml 2019-11-20 20:21:33.000000000 +0000 @@ -1,38 +1,51 @@ - + + - - - - - - - - - + + + + + + + + + + + + + + + - + + - - - + + + @@ -41,58 +54,36 @@ - + - + + - + - - - - - - - + - - - - - - - - - - - - - - - - - - + + replace="\1${version}\2${version}\3"/> diff -Nru compactheader-2.1.6/chrome/CompactHeader/content/RSSLinkify.js compactheader-3.0.0~beta5/chrome/CompactHeader/content/RSSLinkify.js --- compactheader-2.1.6/chrome/CompactHeader/content/RSSLinkify.js 2018-08-18 00:45:39.000000000 +0000 +++ compactheader-3.0.0~beta5/chrome/CompactHeader/content/RSSLinkify.js 2019-11-20 20:21:33.000000000 +0000 @@ -66,6 +66,7 @@ return; } if (cohePrefBranch.getBoolPref("headersize.linkify")) { + org_mozdev_compactHeader.debug.log("updateheaderview start 1"); if (!RSSLinkify.newSubject) pub.InitializeHeaderViewTables(); var url = currentHeaderData["content-base"] || currentHeaderData["x-post-url"]; if(url) { @@ -117,7 +118,22 @@ org_mozdev_compactHeader.debug.log("rss InitializeHeaderViewTables start"); if (cohePrefBranch.getBoolPref("headersize.linkify")) { org_mozdev_compactHeader.debug.log("rss InitializeHeaderViewTables start 1"); - RSSLinkify.newSubject = document.getElementById("CompactHeader_collapsedsubjectlinkBox") || document.createElement("label"); + let newSubject = document.getElementById("CompactHeader_collapsedsubjectlinkBox"); + org_mozdev_compactHeader.debug.log("rss InitializeHeaderViewTables newSubject: " + newSubject); + if (newSubject) { + RSSLinkify.newSubject = newSubject; + } else + { + org_mozdev_compactHeader.debug.log("try to create label"); + try { + RSSLinkify.newSubject = document.createXULElement("label"); + org_mozdev_compactHeader.debug.log("created XUL label"); + } + catch(e) { + RSSLinkify.newSubject = document.createElement("label"); + org_mozdev_compactHeader.debug.log("created label"); + } + } org_mozdev_compactHeader.debug.log("rss InitializeHeaderViewTables start 2"); RSSLinkify.newSubject.setAttribute("id", "CompactHeader_collapsedsubjectlinkBox"); RSSLinkify.newSubject.setAttribute("class", "headerValue plain headerValueUrl"); @@ -141,6 +157,7 @@ }; function linkifySubject(subjectValueStr) { + org_mozdev_compactHeader.debug.log("linkifySubject start"); var subjectNode = document.getElementById(subjectValueStr); while(subjectNode.childNodes.length > 0) { subjectNode.removeChild(subjectNode.firstChild) @@ -177,25 +194,30 @@ } else { subjectNode.appendChild(document.createTextNode(subject)); } + org_mozdev_compactHeader.debug.log("linkifySubject stop"); } /* :::: Subject Link onClick Listener Functions :::: */ pub.subjectLinkOnClickListenter = function(event) { + org_mozdev_compactHeader.debug.log("subjectLinkOnClickListenter start"); if (event.originalTarget && event.originalTarget.getAttribute("href")) { try { messenger.launchExternalURL(event.originalTarget.getAttribute("href")); } catch (e) { Application.console.log(e); } } - } + org_mozdev_compactHeader.debug.log("subjectLinkOnClickListenter stop"); + }; pub.CopyToClipboard = function(node, attr) { + org_mozdev_compactHeader.debug.log("CopyToClipboard start"); if (node) { var contractid = "@mozilla.org/widget/clipboardhelper;1"; var iid = Components.interfaces.nsIClipboardHelper; var clipboard = Components.classes[contractid].getService(iid); clipboard.copyString( node.getAttribute(attr) ); } - } + org_mozdev_compactHeader.debug.log("CopyToClipboard stop"); + }; return pub; }(); diff -Nru compactheader-2.1.6/chrome/CompactHeader/content/compactHeaderOverlay.js compactheader-3.0.0~beta5/chrome/CompactHeader/content/compactHeaderOverlay.js --- compactheader-2.1.6/chrome/CompactHeader/content/compactHeaderOverlay.js 2018-08-18 00:45:39.000000000 +0000 +++ compactheader-3.0.0~beta5/chrome/CompactHeader/content/compactHeaderOverlay.js 2019-11-20 20:21:33.000000000 +0000 @@ -1,1005 +1,1269 @@ -/*# -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (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.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is Mozilla Communicator client code, released -# March 31, 1998. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998-1999 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Joachim Herb -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** -*/ - -/* This is where functions related to displaying the headers for a selected message in the - message pane live. */ - -//////////////////////////////////////////////////////////////////////////////////// -// Warning: if you go to modify any of these JS routines please get a code review from -// scott@scott-macgregor.org. It's critical that the code in here for displaying -// the message headers for a selected message remain as fast as possible. In particular, -// right now, we only introduce one reflow per message. i.e. if you click on a message in the thread -// pane, we batch up all the changes for displaying the header pane (to, cc, attachements button, etc.) -// and we make a single pass to display them. It's critical that we maintain this one reflow per message -// view in the message header pane. -//////////////////////////////////////////////////////////////////////////////////// - - -if (typeof org_mozdev_compactHeader == "undefined") { - var org_mozdev_compactHeader = {}; -}; - -org_mozdev_compactHeader.pane = function() { - var pub = {}; - - const COMPACTHEADER_EXTENSION_UUID = "{58D4392A-842E-11DE-B51A-C7B855D89593}"; - -// var regex = { -// /* taken from https://bugzilla.mozilla.org/show_bug.cgi?id=57104 */ -// links : /((\w+):\/\/[^<>()'"\s]+|www(\.[-\w]+){2,})/ -// }; -// - var gCoheCollapsedHeaderViewMode = false; - var gCoheBuiltCollapsedView = false; - - /** - * The collapsed view: very lightweight. We only show a couple of fields. See - * msgHdrViewOverlay.js for details of the field definition semantics. - */ - var gCoheCollapsedHeader1LListLongAddresses = [ - {name:"subject", outputFunction:coheOutputSubject}, - {name:"from", useToggle:true, outputFunction:coheOutputEmailAddresses}, -// {name:"toCcBcc", useToggle:true, outputFunction:coheOutputEmailAddresses}, - {name:"date", outputFunction:coheUpdateDateValue} - ]; - - var gCoheCollapsedHeader2LListLongAddresses = [ - {name:"subject", outputFunction:coheOutputSubject}, - {name:"from", useToggle:true, outputFunction:coheOutputEmailAddresses}, - {name:"toCcBcc", useToggle:true, outputFunction:coheOutputEmailAddresses}, - {name:"date", outputFunction:coheUpdateDateValue} - ]; - - var prefserv = Components.classes["@mozilla.org/preferences-service;1"] - .getService(Components.interfaces.nsIPrefBranch); - - var cohePrefBranch = Components.classes["@mozilla.org/preferences-service;1"] - .getService(Components.interfaces.nsIPrefService) - .getBranch("extensions.CompactHeader."); - - var browserPreferences = Components.classes["@mozilla.org/preferences-service;1"] - .getService(Components.interfaces.nsIPrefService) - .getBranch("browser.preferences."); - - var cohe={ - version: -1, - firstrun: true, - current: -1 - }; - - var coheFirstTime = true; - var headerFirstTime = true; - - var pressMores = null; - var gMoreTooltip = ""; - - function coheOutputSubject(headerEntry, headerValue) { - var subjectBox; - - if (cohePrefBranch.getBoolPref("headersize.twolineview")) { - subjectBox = document.getElementById("CompactHeader_collapsed2LsubjectOutBox") - } else { - subjectBox = document.getElementById("CompactHeader_collapsed1LsubjectOutBox") - } - -// if (subjectBox) { -// subjectBox.setAttribute("tooltiptext", headerValue); -// } - updateHeaderValue(headerEntry, headerValue); - } - - function coheOutputEmailAddresses(headerEntry, emailAddresses, addressType) { - /* function copied from comm-1.9.1/ mail/ base/ content/ msgHdrViewOverlay.js 771135e6aaf5 */ - if (!emailAddresses) - return; - - var addresses = {}; - var fullNames = {}; - var names = {}; - var numAddresses = 0; - - let moreButton = document.getAnonymousElementByAttribute(document.getElementById("CompactHeader_collapsed2LtoCcBccBox"), - "anonid", "more"); - let moreTooltip = gMoreTooltip; -// let moreTooltip = moreButton.getAttribute("tooltiptext"); - - var msgHeaderParser = Components.classes["@mozilla.org/messenger/headerparser;1"] - .getService(Components.interfaces.nsIMsgHeaderParser); - numAddresses = msgHeaderParser.parseHeadersWithArray(emailAddresses, addresses, names, fullNames); - var index = 0; - while (index < numAddresses) - { - // if we want to include short/long toggle views and we have a long view, always add it. - // if we aren't including a short/long view OR if we are and we haven't parsed enough - // addresses to reach the cutoff valve yet then add it to the default (short) div. - var address = {}; - address.emailAddress = addresses.value[index]; - address.fullAddress = fullNames.value[index]; - address.addressType = addressType; - if (cohePrefBranch.getBoolPref("headersize.addressstyle")) { - address.displayName = address.emailAddress; - address.fullAddress = address.emailAddress; - } else { - address.displayName = names.value[index]; - } - org_mozdev_compactHeader.debug.log("0: " + address.fullAddress); - org_mozdev_compactHeader.debug.log("0: " + addressType); - if (address.fullAddress != "" && - (addressType == "to" || addressType == "cc" || addressType == "bcc")) { - if (moreTooltip == "") { - moreTooltip = address.fullAddress; - org_mozdev_compactHeader.debug.log("1: " + address.fullAddress); - } else { - moreTooltip = moreTooltip + ", " + address.fullAddress; - org_mozdev_compactHeader.debug.log("2: " + address.fullAddress); - } - } -// window.alert(address); - if (headerEntry.useToggle && (typeof headerEntry.enclosingBox.addAddressView == 'function')) { - headerEntry.enclosingBox.addAddressView(address); - } else { - updateEmailAddressNode(headerEntry.enclosingBox.emailAddressNode, address); - } - index++; - } - org_mozdev_compactHeader.debug.log("tooltiptext: " + moreTooltip); - moreButton.setAttribute("tooltiptext", moreTooltip); - gMoreTooltip = moreTooltip; - - if (headerEntry.useToggle && (typeof headerEntry.enclosingBox.buildViews == 'function')) - headerEntry.enclosingBox.buildViews(); - //OutputEmailAddresses(headerEntry, emailAddresses); - } - - // Now, for each view the message pane can generate, we need a global table - // of headerEntries. These header entry objects are generated dynamically - // based on the static data in the header lists (see above) and elements - // we find in the DOM based on properties in the header lists. - var gCoheCollapsedHeaderView = {}; - - function coheInitializeHeaderViewTables() - { - org_mozdev_compactHeader.debug.log("coheInitializeHeaderViewTables start"); - gCoheCollapsedHeaderView = {}; - var index; - - if (prefserv.getBoolPref("extensions.CompactHeader.headersize.twolineview")) { - for (index = 0; index < gCoheCollapsedHeader2LListLongAddresses.length; index++) { - gCoheCollapsedHeaderView[gCoheCollapsedHeader2LListLongAddresses[index].name] = - new createHeaderEntry('CompactHeader_collapsed2L', gCoheCollapsedHeader2LListLongAddresses[index]); - } - let moreButton = document.getAnonymousElementByAttribute(document.getElementById("CompactHeader_collapsed2LtoCcBccBox"), - "anonid", "more"); - - if (moreButton) { - let oldToggleWrap = moreButton.parentNode.toggleWrap; - moreButton.parentNode.toggleWrap = function() { - pressMores = pressMoreButtons; - pub.coheToggleHeaderView(); - }; - } - } else { - for (index = 0; index < gCoheCollapsedHeader1LListLongAddresses.length; index++) { - gCoheCollapsedHeaderView[gCoheCollapsedHeader1LListLongAddresses[index].name] = - new createHeaderEntry('CompactHeader_collapsed1L', gCoheCollapsedHeader1LListLongAddresses[index]); - } - } - - org_mozdev_compactHeader.debug.log("call to org_mozdev_compactHeader.RSSLinkify.InitializeHeaderViewTables"); - org_mozdev_compactHeader.RSSLinkify.InitializeHeaderViewTables(); - - org_mozdev_compactHeader.debug.log("coheInitializeHeaderViewTables stop"); - } - - function pressMoreButtons() { - let moreButtonTo = document.getAnonymousElementByAttribute(document.getElementById("expandedtoBox"), - "anonid", "more"); - let moreButtonCC = document.getAnonymousElementByAttribute(document.getElementById("expandedccBox"), - "anonid", "more"); - let moreButtonBCC = document.getAnonymousElementByAttribute(document.getElementById("expandedbccBox"), - "anonid", "more"); - if (!moreButtonTo.hasAttribute("collapsed")) { - moreButtonTo.click(); - org_mozdev_compactHeader.debug.log("toggle To"); - } - if (!moreButtonCC.hasAttribute("collapsed")) { - moreButtonCC.click(); - org_mozdev_compactHeader.debug.log("toggle cc"); - } - if (!moreButtonBCC.hasAttribute("collapsed")) { - moreButtonBCC.click(); - org_mozdev_compactHeader.debug.log("toggle bcc"); - } - pressMores = null; - } - - pub.coheOnLoadMsgHeaderPane = function() { - org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane start"); - - coheInitializeHeaderViewTables(); - - // Add an address book listener so we can update the header view when things - // change. - Components.classes["@mozilla.org/abmanager;1"] - .getService(Components.interfaces.nsIAbManager) - .addAddressBookListener(coheAddressBookListener, - Components.interfaces.nsIAbListener.all); - - var deckHeaderView = document.getElementById("msgHeaderViewDeck"); - - gCoheCollapsedHeaderViewMode = - deckHeaderView.selectedPanel == document.getElementById('CompactHeader_collapsedHeaderView'); - - org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 1"); - - // work around XUL deck bug where collapsed header view, if it's the persisted - // default, wouldn't be sized properly because of the larger expanded - // view "stretches" the deck. - if (gCoheCollapsedHeaderViewMode) - document.getElementById('expandedHeaderView').collapsed = true; - else - document.getElementById('CompactHeader_collapsedHeaderView').collapsed = true; - - if (cohePrefBranch.getBoolPref("headersize.twolineview")) { - document.getElementById('CompactHeader_collapsed1LHeadersBox').collapsed = true; - document.getElementById('CompactHeader_collapsed2LHeadersBox').collapsed = false; - } else { - document.getElementById('CompactHeader_collapsed1LHeadersBox').collapsed = false; - document.getElementById('CompactHeader_collapsed2LHeadersBox').collapsed = true; - } - - org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 2"); - - if (coheFirstTime) - { - org_mozdev_compactHeader.debug.log("coheFirstTime"); - coheFirstTime = false; - gMessageListeners.push(coheMessageListener); - org_mozdev_compactHeader.messenger.loadToolboxData(); - org_mozdev_compactHeader.toolbar.fillToolboxPalette(); - org_mozdev_compactHeader.messenger.saveToolboxData(); - - let collapsed2LtoCcBccBox = document.getElementById("CompactHeader_collapsed2LtoCcBccBox"); - if (collapsed2LtoCcBccBox) { - let updateEmailAddressNodeFunction = collapsed2LtoCcBccBox.updateEmailAddressNode; - collapsed2LtoCcBccBox.updateEmailAddressNode = function(aEmailNode, aAddress) { - try { - updateEmailAddressNodeFunction(aEmailNode, aAddress); - } - catch(e) { - org_mozdev_compactHeader.debug.log("got execption " + e + - " from updateEmailAddressNode"); - } - aEmailNode.setAttribute("addressType", aAddress.addressType); - }; - if (typeof collapsed2LtoCcBccBox.setNMoreTooltiptext == 'function') { - // remove setNMoreTooltiptext because we have our own function - collapsed2LtoCcBccBox.setNMoreTooltiptext = function() { - let moreButton = document.getAnonymousElementByAttribute(document.getElementById("CompactHeader_collapsed2LtoCcBccBox"), - "anonid", "more"); - if (moreButton) { - moreButton.setAttribute("tooltiptext", gMoreTooltip); - } - }; - } - } - } - - org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 2a"); - - if (cohe.firstrun) { - coheCheckFirstRun(); - } - - org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 3"); - - org_mozdev_compactHeader.toolbar.setButtonStyle(); - org_mozdev_compactHeader.messenger.saveToolboxData(); - org_mozdev_compactHeader.toolbar.dispMUACheck(); - - org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 4"); - - coheToggleHeaderContent(); - - org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane stop"); - } - - var coheMessageListener = - { - onStartHeaders: - function cML_onStartHeaders () { - gCoheBuiltCollapsedView = false; - }, - - onEndHeaders: - function cML_onEndHeaders() { - ClearHeaderView(gCoheCollapsedHeaderView); - coheUpdateMessageHeaders(); - if (pressMores) { - pressMoreButtons(); - pressMore = null; - } - }, - - onEndAttachments: function cML_onEndAttachments(){} - }; - - pub.coheOnUnloadMsgHeaderPane = function() - { - Components.classes["@mozilla.org/abmanager;1"] - .getService(Components.interfaces.nsIAbManager) - .removeAddressBookListener(coheAddressBookListener); - - removeEventListener('messagepane-loaded', - pub.coheOnLoadMsgHeaderPane, true); - removeEventListener('messagepane-unloaded', - pub.coheOnUnloadMsgHeaderPane, true); - } - - var coheAddressBookListener = - { - onItemAdded: function(aParentDir, aItem) { - coheOnAddressBookDataChanged(nsIAbListener.itemAdded, - aParentDir, aItem); - }, - onItemRemoved: function(aParentDir, aItem) { - coheOnAddressBookDataChanged(aItem instanceof nsIAbCard ? - nsIAbListener.directoryItemRemoved : - nsIAbListener.directoryRemoved, - aParentDir, aItem); - }, - - onItemPropertyChanged: function(aItem, aProperty, aOldValue, aNewValue) { - // We only need updates for card changes, address book and mailing list - // ones don't affect us here. - if (aItem instanceof Components.interfaces.nsIAbCard) - coheOnAddressBookDataChanged(nsIAbListener.itemChanged, null, aItem); - } - } - - function coheOnAddressBookDataChanged(aAction, aParentDir, aItem) { - gEmailAddressHeaderNames.forEach(function (headerName) { - var headerEntry = null; - - if (headerName in gCoheCollapsedHeaderView) { - headerEntry = gCoheCollapsedHeaderView[headerName]; - if (headerEntry) - headerEntry.enclosingBox.updateExtraAddressProcessing(aAction, - aParentDir, - aItem); - } - }); - } - - // make sure the appropriate fields within the currently displayed view header mode - // are collapsed or visible... - function coheUpdateHeaderView() - { - if (gCoheCollapsedHeaderViewMode) - showHeaderView(gCoheCollapsedHeaderView); - - org_mozdev_compactHeader.RSSLinkify.UpdateHeaderView(currentHeaderData); - - if (cohePrefBranch.getBoolPref("headersize.addressstyle")) { - selectEmailDisplayed(); - } - - //org_mozdev_compactHeader.toolbar.fillToolboxPalette(document); - coheToggleHeaderContent(); - org_mozdev_compactHeader.toolbar.CHTUpdateReplyButton(); - org_mozdev_compactHeader.toolbar.CHTUpdateJunkButton(); - org_mozdev_compactHeader.buttons.coheToggleStar(); - } - - function enableButtons() { - var hdrToolbar = document.getElementById("header-view-toolbar"); - if (hdrToolbar) { - var buttons = hdrToolbar.querySelectorAll("[disabled*='true']"); - for (var i=0; i +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** +*/ + +/* This is where functions related to displaying the headers for a selected message in the + message pane live. */ + +//////////////////////////////////////////////////////////////////////////////////// +// Warning: if you go to modify any of these JS routines please get a code review from +// scott@scott-macgregor.org. It's critical that the code in here for displaying +// the message headers for a selected message remain as fast as possible. In particular, +// right now, we only introduce one reflow per message. i.e. if you click on a message in the thread +// pane, we batch up all the changes for displaying the header pane (to, cc, attachements button, etc.) +// and we make a single pass to display them. It's critical that we maintain this one reflow per message +// view in the message header pane. +//////////////////////////////////////////////////////////////////////////////////// + + +if (typeof org_mozdev_compactHeader == "undefined") { + var org_mozdev_compactHeader = {}; +}; + +org_mozdev_compactHeader.pane = function() { + var pub = {}; + + const COMPACTHEADER_EXTENSION_UUID = "{58D4392A-842E-11DE-B51A-C7B855D89593}"; + ChromeUtils.import("resource:///modules/MailServices.jsm"); + +// var regex = { +// /* taken from https://bugzilla.mozilla.org/show_bug.cgi?id=57104 */ +// links : /((\w+):\/\/[^<>()'"\s]+|www(\.[-\w]+){2,})/ +// }; +// + var gCoheCollapsedHeaderViewMode = false; + var gCoheBuiltCollapsedView = false; + + /** + * The collapsed view: very lightweight. We only show a couple of fields. See + * msgHdrViewOverlay.js for details of the field definition semantics. + */ + var gCoheCollapsedHeader1LListLongAddresses = [ + {name:"subject", outputFunction:coheOutputSubject}, + {name:"from", useToggle:true, outputFunction:coheOutputEmailAddresses}, +// {name:"toCcBcc", useToggle:true, outputFunction:coheOutputEmailAddresses}, + {name:"date", outputFunction:coheUpdateDateValue} + ]; + + var gCoheCollapsedHeader2LListLongAddresses = [ + {name:"subject", outputFunction:coheOutputSubject}, + {name:"from", useToggle:true, outputFunction:coheOutputEmailAddresses}, + {name:"toCcBcc", useToggle:true, outputFunction:coheOutputEmailAddresses}, + {name:"date", outputFunction:coheUpdateDateValue} + ]; + + var prefserv = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefBranch); + + var cohePrefBranch = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefService) + .getBranch("extensions.CompactHeader."); + + var browserPreferences = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefService) + .getBranch("browser.preferences."); + + var cohe={ + version: -1, + firstrun: true, + current: -1 + }; + + var coheFirstTime = true; + var headerFirstTime = true; + + var pressMores = null; + var gMoreTooltip = ""; + + function coheOutputSubject(headerEntry, headerValue) { + var subjectBox; + + if (cohePrefBranch.getBoolPref("headersize.twolineview")) { + subjectBox = document.getElementById("CompactHeader_collapsed2LsubjectOutBox") + } else { + subjectBox = document.getElementById("CompactHeader_collapsed1LsubjectOutBox") + } + +// if (subjectBox) { +// subjectBox.setAttribute("tooltiptext", headerValue); +// } + updateHeaderValue(headerEntry, headerValue); + } + + function coheOutputEmailAddresses(headerEntry, emailAddresses, addressType) { + /* function copied from comm-1.9.1/ mail/ base/ content/ msgHdrViewOverlay.js 771135e6aaf5 */ + if (!emailAddresses) + return; + + var addresses = {}; + var fullNames = {}; + var names = {}; + var numAddresses = 0; + + let moreButton = document.getElementById("CompactHeader_collapsed2LtoCcBccBox") + .getElementsByClassName("moreIndicator")[0]; + let moreTooltip = gMoreTooltip; + + numAddresses = MailServices.headerParser + .parseHeadersWithArray(emailAddresses, addresses, + names, fullNames); + + + var index = 0; + + // we are called for to, cc, bcc addresses separately, so this will delete + // the other entries! So we should not call it! +// if (headerEntry.useToggle && (typeof headerEntry.enclosingBox.resetAddressView == 'function')) +// headerEntry.enclosingBox.resetAddressView(); // make sure we start clean + + if (numAddresses == 0 && emailAddresses.includes(":")) { + // No addresses and a colon, so an empty group like "undisclosed-recipients: ;". + // Add group name so at least something displays. + let address = { displayName: emailAddresses }; + if (headerEntry.useToggle) + headerEntry.enclosingBox.addAddressView(address); + else + updateEmailAddressNode(headerEntry.enclosingBox.emailAddressNode, address); + } + + while (index < numAddresses) + { + // if we want to include short/long toggle views and we have a long view, always add it. + // if we aren't including a short/long view OR if we are and we haven't parsed enough + // addresses to reach the cutoff valve yet then add it to the default (short) div. + var address = {}; + address.emailAddress = addresses.value[index]; + address.fullAddress = fullNames.value[index]; + address.addressType = addressType; + + if (cohePrefBranch.getBoolPref("headersize.addressstyle")) { + address.displayName = address.emailAddress; + address.fullAddress = address.emailAddress; + } else { + address.displayName = names.value[index]; + } + + org_mozdev_compactHeader.debug.log("0 index: " + index); + org_mozdev_compactHeader.debug.log("0: " + address.fullAddress); + org_mozdev_compactHeader.debug.log("0 type: " + addressType); + + if (address.fullAddress != "" && + (addressType == "to" || addressType == "cc" || addressType == "bcc")) { + if (moreTooltip == "") { + moreTooltip = address.fullAddress; + org_mozdev_compactHeader.debug.log("1 first in list: " + address.fullAddress); + } else { + moreTooltip = moreTooltip + ", " + address.fullAddress; + org_mozdev_compactHeader.debug.log("2 add to list: " + address.fullAddress); + } + } +// window.alert(address); + if (headerEntry.useToggle && (typeof headerEntry.enclosingBox.addAddressView == 'function')) { + org_mozdev_compactHeader.debug.log("call addAddressView"); + headerEntry.enclosingBox.addAddressView(address); + org_mozdev_compactHeader.debug.log("headerEntry: " + headerEntry); + org_mozdev_compactHeader.debug.log("enclosingBox: " + headerEntry.enclosingBox); + let emailAddressNode = document.getAnonymousElementByAttribute( + headerEntry.enclosingBox, 'anonid', 'emailAddressNode' + ); +// emailAddressNode.setAttribute("addressType", addressType); + } else { + try { + org_mozdev_compactHeader.debug.log("call updateEmailAddressNode"); + updateEmailAddressNode(headerEntry.enclosingBox.emailAddressNode, address); + headerEntry.enclosingBox.emailAddressNode.setAttribute("addressType", addressType); + } + catch(e) { + org_mozdev_compactHeader.debug.log("got execption " + e + + " from updateEmailAddressNode"); + } + } + index++; + } + org_mozdev_compactHeader.debug.log("tooltiptext: " + moreTooltip); + org_mozdev_compactHeader.debug.log("moreButton: " + moreButton); + if (moreButton) { + moreButton.setAttribute("tooltiptext", moreTooltip); + } + gMoreTooltip = moreTooltip; + + if (headerEntry.useToggle && (typeof headerEntry.enclosingBox.buildViews == 'function')) + headerEntry.enclosingBox.buildViews(); + //OutputEmailAddresses(headerEntry, emailAddresses); + } + + // Now, for each view the message pane can generate, we need a global table + // of headerEntries. These header entry objects are generated dynamically + // based on the static data in the header lists (see above) and elements + // we find in the DOM based on properties in the header lists. + var gCoheCollapsedHeaderView = {}; + + function coheInitializeHeaderViewTables() + { + org_mozdev_compactHeader.debug.log("coheInitializeHeaderViewTables start"); + gCoheCollapsedHeaderView = {}; + var index; + + if (prefserv.getBoolPref("extensions.CompactHeader.headersize.twolineview")) { + for (index = 0; index < gCoheCollapsedHeader2LListLongAddresses.length; index++) { + gCoheCollapsedHeaderView[gCoheCollapsedHeader2LListLongAddresses[index].name] = + new createHeaderEntry('CompactHeader_collapsed2L', gCoheCollapsedHeader2LListLongAddresses[index]); + } + let moreButton = document.getElementById("CompactHeader_collapsed2LtoCcBccBox") + .getElementsByClassName("moreIndicator")[0]; + + if (moreButton) { + org_mozdev_compactHeader.debug.log("add togglewrap 1"); + let oldToggleWrap = moreButton.parentNode.toggleWrap; + org_mozdev_compactHeader.debug.log("add togglewrap 2: " + oldToggleWrap); + moreButton.parentNode.toggleWrap = function() { + org_mozdev_compactHeader.debug.log("toggleWrap start"); + pressMores = pressMoreButtons; + org_mozdev_compactHeader.debug.log("toggleWrap 1"); + + let deck = document.getElementById('msgHeaderViewDeck'); + // Work around a xul deck bug where the height of the deck is determined + // by the tallest panel in the deck even if that panel is not selected... + + org_mozdev_compactHeader.debug.log("togglewrap old panel: " + + deck.selectedPanel.id); + org_mozdev_compactHeader.debug.log("togglewrap old panel collapsed: " + + deck.selectedPanel.collapsed); + + pub.coheToggleHeaderView(); + org_mozdev_compactHeader.debug.log("toggleWrap stop"); + }; + org_mozdev_compactHeader.debug.log("add togglewrap 3"); + if (moreButton.hasAttribute("onclick")) { + org_mozdev_compactHeader.debug.log( + "add togglewrap: existing onclick" + + moreButton.getAttribute("onclick")); + } + else { + org_mozdev_compactHeader.debug.log("add togglewrap: no existing onclick"); + } + moreButton.setAttribute("onclick", "this.parentNode.toggleWrap()"); + org_mozdev_compactHeader.debug.log("add togglewrap 4"); + } + } else { + for (index = 0; index < gCoheCollapsedHeader1LListLongAddresses.length; index++) { + gCoheCollapsedHeaderView[gCoheCollapsedHeader1LListLongAddresses[index].name] = + new createHeaderEntry('CompactHeader_collapsed1L', gCoheCollapsedHeader1LListLongAddresses[index]); + } + } + + org_mozdev_compactHeader.debug.log("call to org_mozdev_compactHeader.RSSLinkify.InitializeHeaderViewTables"); + org_mozdev_compactHeader.RSSLinkify.InitializeHeaderViewTables(); + + org_mozdev_compactHeader.debug.log("coheInitializeHeaderViewTables stop"); + } + + function pressMoreButtons() { + let moreButtonTo = document.getElementById("expandedtoBox") + .getElementsByClassName("moreIndicator")[0]; + + let moreButtonCC = document.getElementById("expandedccBox") + .getElementsByClassName("moreIndicator")[0]; + + let moreButtonBCC = document.getElementById("expandedbccBox") + .getElementsByClassName("moreIndicator")[0]; + + if (!moreButtonTo.hasAttribute("collapsed")) { + moreButtonTo.click(); + org_mozdev_compactHeader.debug.log("toggle To"); + } + if (!moreButtonCC.hasAttribute("collapsed")) { + moreButtonCC.click(); + org_mozdev_compactHeader.debug.log("toggle cc"); + } + if (!moreButtonBCC.hasAttribute("collapsed")) { + moreButtonBCC.click(); + org_mozdev_compactHeader.debug.log("toggle bcc"); + } + pressMores = null; + } + + function getCollapseState() { + org_mozdev_compactHeader.debug.log("getCollapseState start"); + + var deckHeaderView = document.getElementById("msgHeaderViewDeck"); + + let collapseState = + deckHeaderView.selectedPanel == + document.getElementById('CompactHeader_collapsedHeaderView'); + + let collapseStatePrefs = cohePrefBranch.getBoolPref( + document.documentElement.getAttribute("windowtype") + + "collapseState"); + + collapseState = collapseState || collapseStatePrefs; + + org_mozdev_compactHeader.debug.log("getCollapseState: " + + collapseState); + + setCollapseState(collapseState); + org_mozdev_compactHeader.debug.log("getCollapseState stop"); + + return collapseState; + } + + function setCollapseState(collapseState) { + org_mozdev_compactHeader.debug.log("setCollapseState start"); + + cohePrefBranch.setBoolPref( + document.documentElement.getAttribute("windowtype") + + "collapseState", collapseState); + + org_mozdev_compactHeader.debug.log("setCollapseState: " + + collapseState); + + org_mozdev_compactHeader.debug.log("setCollapseState stop"); + } + + function selectMsgHeaderPanePanel() { + org_mozdev_compactHeader.debug.log("selectMsgHeaderPanePanel start"); + let deck = document.getElementById('msgHeaderViewDeck'); + // Work around a xul deck bug where the height of the deck is determined + // by the tallest panel in the deck even if that panel is not selected... + + let wantedselectedPanel; + + if (gCoheCollapsedHeaderViewMode) { + wantedselectedPanel = document.getElementById("CompactHeader_collapsedHeaderView") + } else { + wantedselectedPanel = document.getElementById("expandedHeaderView"); + } + + if (wantedselectedPanel == deck.selectedPanel) { + org_mozdev_compactHeader.debug.log("selectMsgHeaderPanePanel no need to change, stop"); + return; + } + + + deck.selectedPanel.collapsed = true; + deck.selectedPanel = wantedselectedPanel; + + org_mozdev_compactHeader.debug.log("selectMsgHeaderPanePanel gCoheCollapsedHeaderViewMode: " + + gCoheCollapsedHeaderViewMode); + + org_mozdev_compactHeader.debug.log("selectMsgHeaderPanePanel selectedPanel: " + + deck.selectedPanel.id); + + org_mozdev_compactHeader.debug.log("selectMsgHeaderPanePanel 1"); + + // Work around a xul deck bug where the height of the deck is determined + // by the tallest panel in the deck even if that panel is not selected... + deck.selectedPanel.collapsed = false; + //syncGridColumnWidths(); + org_mozdev_compactHeader.debug.log("selectMsgHeaderPanePanel stop"); + } + + pub.coheOnLoadMsgHeaderPane = function() { + org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane start"); + + coheInitializeHeaderViewTables(); + + // Add an address book listener so we can update the header view when things + // change. + Components.classes["@mozilla.org/abmanager;1"] + .getService(Components.interfaces.nsIAbManager) + .addAddressBookListener(coheAddressBookListener, + Components.interfaces.nsIAbListener.all); + + var deckHeaderView = document.getElementById("msgHeaderViewDeck"); + + selectMsgHeaderPanePanel(); + + org_mozdev_compactHeader.debug.log("coheFirstTime window type: " + + document.documentElement.getAttribute("windowtype")); + + + gCoheCollapsedHeaderViewMode = getCollapseState(); + + org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 1"); + + // work around XUL deck bug where collapsed header view, if it's the persisted + // default, wouldn't be sized properly because of the larger expanded + // view "stretches" the deck. + if (gCoheCollapsedHeaderViewMode) + document.getElementById('expandedHeaderView').collapsed = true; + else + document.getElementById('CompactHeader_collapsedHeaderView').collapsed = true; + + if (cohePrefBranch.getBoolPref("headersize.twolineview")) { + document.getElementById('CompactHeader_collapsed1LHeadersBox').collapsed = true; + document.getElementById('CompactHeader_collapsed2LHeadersBox').collapsed = false; + } else { + document.getElementById('CompactHeader_collapsed1LHeadersBox').collapsed = false; + document.getElementById('CompactHeader_collapsed2LHeadersBox').collapsed = true; + } + + org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 2"); + + org_mozdev_compactHeader.messenger.loadToolboxData(); + org_mozdev_compactHeader.toolbar.fillToolboxPalette(); + org_mozdev_compactHeader.messenger.saveToolboxData(); + + if (coheFirstTime) + { + org_mozdev_compactHeader.debug.log("coheFirstTime start"); + coheFirstTime = false; + gMessageListeners.push(coheMessageListener); +// org_mozdev_compactHeader.messenger.loadToolboxData(); +// org_mozdev_compactHeader.toolbar.fillToolboxPalette(); +// org_mozdev_compactHeader.messenger.saveToolboxData(); + + org_mozdev_compactHeader.debug.log("coheFirstTime 1"); + + let collapsed2LtoCcBccBox = document.getElementById("CompactHeader_collapsed2LtoCcBccBox"); + if (collapsed2LtoCcBccBox) { + org_mozdev_compactHeader.debug.log("overwrite collapsed2LtoCcBccBox._updateEmailAddressNode"); + let updateEmailAddressNodeFunction = collapsed2LtoCcBccBox._updateEmailAddressNode; + org_mozdev_compactHeader.debug.log("overwrite collapsed2LtoCcBccBox.updateEmailAddressNode: " + + updateEmailAddressNodeFunction); + + collapsed2LtoCcBccBox._updateEmailAddressNode = function(aEmailNode, aAddress) { + org_mozdev_compactHeader.debug.log("collapsed2LtoCcBccBox.updateEmailAddressNode start"); + try { + updateEmailAddressNodeFunction(aEmailNode, aAddress); + } + catch(e) { + org_mozdev_compactHeader.debug.log("got execption " + e + + " from updateEmailAddressNode"); + } + org_mozdev_compactHeader.debug.log("collapsed2LtoCcBccBox.updateEmailAddressNode type:" + + aAddress.addressType); + aEmailNode.setAttribute("addressType", aAddress.addressType); + org_mozdev_compactHeader.debug.log("collapsed2LtoCcBccBox.updateEmailAddressNode start"); + }; + + if (typeof collapsed2LtoCcBccBox.setNMoreTooltiptext == 'function') { + // remove setNMoreTooltiptext because we have our own function + collapsed2LtoCcBccBox.setNMoreTooltiptext = function() { + let moreButton = document.getElementById("CompactHeader_collapsed2LtoCcBccBox") + .getElementsByClassName("moreIndicator")[0]; + if (moreButton) { + moreButton.setAttribute("tooltiptext", gMoreTooltip); + } + }; + } + } + org_mozdev_compactHeader.debug.log("coheFirstTime stop"); + } + + org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 2a"); + + if (cohe.firstrun) { + coheCheckFirstRun(); + } + + org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 3"); + + org_mozdev_compactHeader.toolbar.setButtonStyle(); + org_mozdev_compactHeader.messenger.saveToolboxData(); + org_mozdev_compactHeader.toolbar.dispMUACheck(); + + org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 4"); + + coheToggleHeaderContent(); + + org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane 5"); + + // Make sure the correct panel is selected + + + org_mozdev_compactHeader.debug.log("coheOnLoadMsgHeaderPane stop"); + } + + var coheMessageListener = + { + onStartHeaders: + function cML_onStartHeaders () { + org_mozdev_compactHeader.debug.log("cML_onStartHeaders start"); + selectMsgHeaderPanePanel(); + gCoheBuiltCollapsedView = false; + org_mozdev_compactHeader.debug.log("cML_onStartHeaders stop"); + }, + + onEndHeaders: + function cML_onEndHeaders() { + org_mozdev_compactHeader.debug.log("cML_onEndHeaders start"); + ClearHeaderView(gCoheCollapsedHeaderView); + coheUpdateMessageHeaders(); + if (pressMores) { + pressMoreButtons(); + pressMore = null; + } + org_mozdev_compactHeader.debug.log("cML_onEndHeaders stop"); + }, + + onEndAttachments: function cML_onEndAttachments(){} + }; + + pub.coheOnUnloadMsgHeaderPane = function() + { + org_mozdev_compactHeader.debug.log("coheOnUnloadMsgHeaderPane start"); + + Components.classes["@mozilla.org/abmanager;1"] + .getService(Components.interfaces.nsIAbManager) + .removeAddressBookListener(coheAddressBookListener); + + removeEventListener('messagepane-loaded', + pub.coheOnLoadMsgHeaderPane, true); + removeEventListener('messagepane-unloaded', + pub.coheOnUnloadMsgHeaderPane, true); + org_mozdev_compactHeader.debug.log("coheOnUnloadMsgHeaderPane stop"); + } + + var coheAddressBookListener = + { + onItemAdded: function(aParentDir, aItem) { + coheOnAddressBookDataChanged(nsIAbListener.itemAdded, + aParentDir, aItem); + }, + onItemRemoved: function(aParentDir, aItem) { + coheOnAddressBookDataChanged(aItem instanceof nsIAbCard ? + nsIAbListener.directoryItemRemoved : + nsIAbListener.directoryRemoved, + aParentDir, aItem); + }, + + onItemPropertyChanged: function(aItem, aProperty, aOldValue, aNewValue) { + // We only need updates for card changes, address book and mailing list + // ones don't affect us here. + if (aItem instanceof Components.interfaces.nsIAbCard) + coheOnAddressBookDataChanged(nsIAbListener.itemChanged, null, aItem); + } + } + + function coheOnAddressBookDataChanged(aAction, aParentDir, aItem) { + gEmailAddressHeaderNames.forEach(function (headerName) { + var headerEntry = null; + + if (headerName in gCoheCollapsedHeaderView) { + headerEntry = gCoheCollapsedHeaderView[headerName]; + if (headerEntry) + headerEntry.enclosingBox.updateExtraAddressProcessing(aAction, + aParentDir, + aItem); + } + }); + } + + // make sure the appropriate fields within the currently displayed view header mode + // are collapsed or visible... + function coheUpdateHeaderView() + { + if (gCoheCollapsedHeaderViewMode) + showHeaderView(gCoheCollapsedHeaderView); + + org_mozdev_compactHeader.RSSLinkify.UpdateHeaderView(currentHeaderData); + + if (cohePrefBranch.getBoolPref("headersize.addressstyle")) { + selectEmailDisplayed(); + } + +// org_mozdev_compactHeader.messenger.loadToolboxData(); +// org_mozdev_compactHeader.toolbar.fillToolboxPalette(); +// org_mozdev_compactHeader.messenger.saveToolboxData(); + + coheToggleHeaderContent(); + org_mozdev_compactHeader.toolbar.CHTUpdateReplyButton(); + org_mozdev_compactHeader.toolbar.CHTUpdateJunkButton(); + org_mozdev_compactHeader.buttons.coheToggleStar(); + } + + function enableButtons() { + var hdrToolbar = document.getElementById("header-view-toolbar"); + if (hdrToolbar) { + var buttons = hdrToolbar.querySelectorAll("[disabled*='true']"); + for (var i=0; i