[qt_honey] [8] * Update the Lemur Query Log Toolbar base code to 2.0.

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2009年 10月 9日 (金) 18:20:45 JST


Revision: 8
          http://sourceforge.jp/projects/cres/svn/view?view=rev&revision=8
Author:   kyagroup
Date:     2009-10-09 18:20:45 +0900 (Fri, 09 Oct 2009)

Log Message:
-----------
* Update the Lemur Query Log Toolbar base code to 2.0.
* Bug fix: '0' is logged properly instead of 'NULL' at the search result page number column. (chrome/content/qth.js)

Modified Paths:
--------------
    src/chrome/content/aescipher.js
    src/chrome/content/configuration.js
    src/chrome/content/logtoolbar.js
    src/chrome/content/logtoolbar.xul
    src/chrome/content/qth.js
    src/chrome/content/service.js
    src/chrome/content/settings.js
    src/chrome/content/settings.xul
    src/chrome/content/specialblacklist.xul
    src/chrome/content/upload.js
    src/chrome/content/upload.xul
    src/chrome/content/utils.js
    src/defaults/preferences/defaults.js
    src/install.rdf

Added Paths:
-----------
    src/chrome/content/privateBrowserListener.js
    src/chrome/content/scrubbingscreen.xul

Modified: src/chrome/content/aescipher.js
===================================================================
--- src/chrome/content/aescipher.js	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/aescipher.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -9,16 +9,16 @@
  *   applies Nr rounds (10/12/14) using key schedule w for 'add round key' stage
  *
  *   returns byte-array encrypted value (16 bytes)
- *
- * Code under LGPL use from:
- * (c) 2005–2007 Chris Veness
- * Website: http://www.movable-type.co.uk/scripts/aes.html
+ * 
+ * Code under LGPL usage from:
+ * (C) 2005-2008 - Chris Veness
+ * http://www.movable-type.co.uk/scripts/aes.html
  */
-function Cipher(input, w) {    // main Cipher function [§5.1]
+function Cipher(input, w) {    // main Cipher function [5.1]
   var Nb = 4;               // block size (in words): no of columns in state (fixed at 4 for AES)
   var Nr = w.length/Nb - 1; // no of rounds: 10/12/14 for 128/192/256-bit keys
 
-  var state = [[],[],[],[]];  // initialise 4xNb byte-array 'state' with input [§3.4]
+  var state = [[],[],[],[]];  // initialise 4xNb byte-array 'state' with input [3.4]
   for (var i=0; i<4*Nb; i++) state[i%4][Math.floor(i/4)] = input[i];
 
   state = AddRoundKey(state, w, 0, Nb);
@@ -34,13 +34,13 @@
   state = ShiftRows(state, Nb);
   state = AddRoundKey(state, w, Nr, Nb);
 
-  var output = new Array(4*Nb);  // convert state to 1-d array before returning [§3.4]
+  var output = new Array(4*Nb);  // convert state to 1-d array before returning [3.4]
   for (var i=0; i<4*Nb; i++) output[i] = state[i%4][Math.floor(i/4)];
   return output;
 }
 
 
-function SubBytes(s, Nb) {    // apply SBox to state S [§5.1.1]
+function SubBytes(s, Nb) {    // apply SBox to state S [5.1.1]
   for (var r=0; r<4; r++) {
     for (var c=0; c<Nb; c++) s[r][c] = Sbox[s[r][c]];
   }
@@ -48,7 +48,7 @@
 }
 
 
-function ShiftRows(s, Nb) {    // shift row r of state S left by r bytes [§5.1.2]
+function ShiftRows(s, Nb) {    // shift row r of state S left by r bytes [5.1.2]
   var t = new Array(4);
   for (var r=1; r<4; r++) {
     for (var c=0; c<4; c++) t[c] = s[r][(c+r)%Nb];  // shift into temp copy
@@ -58,15 +58,15 @@
 }
 
 
-function MixColumns(s, Nb) {   // combine bytes of each col of state S [§5.1.3]
+function MixColumns(s, Nb) {   // combine bytes of each col of state S [5.1.3]
   for (var c=0; c<4; c++) {
     var a = new Array(4);  // 'a' is a copy of the current column from 's'
-    var b = new Array(4);  // 'b' is a•{02} in GF(2^8)
+    var b = new Array(4);  // 'b' is a{02} in GF(2^8)
     for (var i=0; i<4; i++) {
       a[i] = s[i][c];
       b[i] = s[i][c]&0x80 ? s[i][c]<<1 ^ 0x011b : s[i][c]<<1;
     }
-    // a[n] ^ b[n] is a•{03} in GF(2^8)
+    // a[n] ^ b[n] is a{03} in GF(2^8)
     s[0][c] = b[0] ^ a[1] ^ b[1] ^ a[2] ^ a[3]; // 2*a0 + 3*a1 + a2 + a3
     s[1][c] = a[0] ^ b[1] ^ a[2] ^ b[2] ^ a[3]; // a0 * 2*a1 + 3*a2 + a3
     s[2][c] = a[0] ^ a[1] ^ b[2] ^ a[3] ^ b[3]; // a0 + a1 + 2*a2 + 3*a3
@@ -76,7 +76,7 @@
 }
 
 
-function AddRoundKey(state, w, rnd, Nb) {  // xor Round Key into state S [§5.1.4]
+function AddRoundKey(state, w, rnd, Nb) {  // xor Round Key into state S [5.1.4]
   for (var r=0; r<4; r++) {
     for (var c=0; c<Nb; c++) state[r][c] ^= w[rnd*4+c][r];
   }
@@ -84,7 +84,7 @@
 }
 
 
-function KeyExpansion(key) {  // generate Key Schedule (byte-array Nr+1 x Nb) from Key [§5.2]
+function KeyExpansion(key) {  // generate Key Schedule (byte-array Nr+1 x Nb) from Key [5.2]
   var Nb = 4;            // block size (in words): no of columns in state (fixed at 4 for AES)
   var Nk = key.length/4  // key length (in words): 4/6/8 for 128/192/256-bit keys
   var Nr = Nk + 6;       // no of rounds: 10/12/14 for 128/192/256-bit keys
@@ -118,13 +118,14 @@
 }
 
 function RotWord(w) {    // rotate 4-byte word w left by one byte
-  w[4] = w[0];
+  var tmp = w[0];
   for (var i=0; i<4; i++) w[i] = w[i+1];
+  w[3] = tmp;
   return w;
 }
 
 
-// Sbox is pre-computed multiplicative inverse in GF(2^8) used in SubBytes and KeyExpansion [§5.1.1]
+// Sbox is pre-computed multiplicative inverse in GF(2^8) used in SubBytes and KeyExpansion [5.1.1]
 var Sbox =  [0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
              0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
              0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
@@ -142,7 +143,7 @@
              0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
              0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];
 
-// Rcon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [§5.2]
+// Rcon is Round Constant used for the Key Expansion [1st col is 2^(r-1) in GF(2^8)] [5.2]
 var Rcon = [ [0x00, 0x00, 0x00, 0x00],
              [0x01, 0x00, 0x00, 0x00],
              [0x02, 0x00, 0x00, 0x00],
@@ -167,16 +168,16 @@
  */
 function AESEncryptCtr(plaintext, password, nBits) {
   if (!(nBits==128 || nBits==192 || nBits==256)) return '';  // standard allows 128/192/256 bit keys
-  
-  // for this example script, generate the key by applying Cipher to 1st 16/24/32 chars of password; 
-  // for real-world applications, a more secure approach would be to hash the password e.g. with SHA-1
+
+  // use AES itself to encrypt password to get cipher key (using plain password as source for key 
+  // expansion) - gives us well encrypted key to use
   var nBytes = nBits/8;  // no bytes in key
   var pwBytes = new Array(nBytes);
   for (var i=0; i<nBytes; i++) pwBytes[i] = password.charCodeAt(i) & 0xff;
-  var key = Cipher(pwBytes, KeyExpansion(pwBytes));
+  var key = Cipher(pwBytes, KeyExpansion(pwBytes));  // gives us 16-byte key
   key = key.concat(key.slice(0, nBytes-16));  // key is now 16/24/32 bytes long
 
-  // initialise counter block (NIST SP800-38A §B.2): millisecond time-stamp for nonce in 1st 8 bytes,
+  // initialise counter block (NIST SP800-38A B.2): millisecond time-stamp for nonce in 1st 8 bytes,
   // block counter in 2nd 8 bytes
   var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
   var counterBlock = new Array(blockSize);  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES
@@ -194,7 +195,7 @@
   
   for (var b=0; b<blockCount; b++) {
     // set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)
-    // again done in two stages for 32-bit ops
+    // done in two stages for 32-bit ops: using two words allows us to go past 2^32 blocks (68GB)
     for (var c=0; c<4; c++) counterBlock[15-c] = (b >>> c*8) & 0xff;
     for (var c=0; c<4; c++) counterBlock[15-c-4] = (b/0x100000000 >>> c*8)
 
@@ -288,3 +289,100 @@
 }
 
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+
+/*
+ * if escCtrlChars()/unescCtrlChars() still gives problems, use encodeBase64()/decodeBase64() instead
+ */
+var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+function encodeBase64(str) {  // http://tools.ietf.org/html/rfc4648
+   var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc='';
+   
+   str = encodeUTF8(str);  // encode multi-byte chars into UTF-8 for byte-array
+
+   do {  // pack three octets into four hexets
+      o1 = str.charCodeAt(i++);
+      o2 = str.charCodeAt(i++);
+      o3 = str.charCodeAt(i++);
+      
+      bits = o1<<16 | o2<<8 | o3;
+      
+      h1 = bits>>18 & 0x3f;
+      h2 = bits>>12 & 0x3f;
+      h3 = bits>>6 & 0x3f;
+      h4 = bits & 0x3f;
+      
+      // end of string? index to '=' in b64
+      if (isNaN(o3)) h4 = 64;
+      if (isNaN(o2)) h3 = 64;
+      
+      // use hexets to index into b64, and append result to encoded string
+      enc += b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
+   } while (i < str.length);
+   
+   return enc;
+}
+
+function decodeBase64(str) {
+   var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc='';
+
+   do {  // unpack four hexets into three octets using index points in b64
+      h1 = b64.indexOf(str.charAt(i++));
+      h2 = b64.indexOf(str.charAt(i++));
+      h3 = b64.indexOf(str.charAt(i++));
+      h4 = b64.indexOf(str.charAt(i++));
+      
+      bits = h1<<18 | h2<<12 | h3<<6 | h4;
+      
+      o1 = bits>>16 & 0xff;
+      o2 = bits>>8 & 0xff;
+      o3 = bits & 0xff;
+      
+      if (h3 == 64)      enc += String.fromCharCode(o1);
+      else if (h4 == 64) enc += String.fromCharCode(o1, o2);
+      else               enc += String.fromCharCode(o1, o2, o3);
+   } while (i < str.length);
+
+   return decodeUTF8(enc);  // decode UTF-8 byte-array back to Unicode
+}
+
+function encodeUTF8(str) {  // encode multi-byte string into utf-8 multiple single-byte characters 
+  str = str.replace(
+      /[\u0080-\u07ff]/g,  // U+0080 - U+07FF = 2-byte chars
+      function(c) { 
+        var cc = c.charCodeAt(0);
+        return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); }
+    );
+  str = str.replace(
+      /[\u0800-\uffff]/g,  // U+0800 - U+FFFF = 3-byte chars
+      function(c) { 
+        var cc = c.charCodeAt(0); 
+        return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); }
+    );
+  return str;
+}
+
+function decodeUTF8(str) {  // decode utf-8 encoded string back into multi-byte characters
+  str = str.replace(
+      /[\u00c0-\u00df][\u0080-\u00bf]/g,                 // 2-byte chars
+      function(c) { 
+        var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f;
+        return String.fromCharCode(cc); }
+    );
+  str = str.replace(
+      /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,  // 3-byte chars
+      function(c) { 
+        var cc = (c.charCodeAt(0)&0x0f)<<12 | (c.charCodeAt(1)&0x3f<<6) | c.charCodeAt(2)&0x3f; 
+        return String.fromCharCode(cc); }
+    );
+  return str;
+}
+
+
+function byteArrayToHexStr(b) {  // convert byte array to hex string for displaying test vectors
+  var s = '';
+  for (var i=0; i<b.length; i++) s += b[i].toString(16) + ' ';
+  return s;
+}
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */

Modified: src/chrome/content/configuration.js
===================================================================
--- src/chrome/content/configuration.js	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/configuration.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -15,9 +15,17 @@
 
 var LemurLogToolbarConfiguration = {
 
+  _isCurrentlyUploading: false,
+
   _needToRefreshSettings: true,
 
   _serverBaseURL: "",
+  
+  _serverAllowAutoUploads: true,
+  _useAutomaticUploads: true,
+  _askWhenUsingAutoUploads: false,
+  _nextTimeToAutoUpload: 0,
+  _autoUploadIntervalTime: 604800000,
 
   _allowRandomSessionId: true,
   _useRandomSessionId: false,
@@ -47,20 +55,47 @@
   _blacklistPropernameRegex: "",
   _blacklistKeywordRegex: "",
   
+  _knownSearchEngines: "",
+  
   prefs: null,
   
   startup: function () {
   },
+  
+  arrayToString: function(thisArray) {
+    var retString="";
+    var hasOne=false;
+    for (var i=0; i < thisArray.length; i++) {
+      if (hasOne) { retString +="\n"; }
+      retString += thisArray[i];
+      hasOne=true;
+    }
+    return retString;
+  },
+  
+  arrayFromString: function (inString) {
+    var thisArray=new Array();
+    var items=inString.split("\n");
+    for (var i=0; i < items.length; i++) {
+      if (items[i].length > 0) {
+        thisArray[i]=items[i];
+      }
+    }
+    return thisArray;
+  },
 
-  getDefaultServerConfiguration: function (forceReload) {
+  getDefaultServerConfiguration: function (forceReload, checkOnStartup) {
+    var forceReload = (forceReload == null) ? false : forceReload;
+    var checkOnStartup = (checkOnStartup == null) ? false : checkOnStartup;
+    
     this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
                  .getService(Components.interfaces.nsIPrefService)
-                 .getBranch("extensions.lemurquerylog.");
+                 .getBranch("extensions.qthlog.");
     this._serverBaseURL=this.prefs.getCharPref("server");
                  
     if (this._needToRefreshSettings==true || (forceReload && forceReload==true)) {
     
-      if (this.loadServerConfiguration()==true) {
+      if (this.loadServerConfiguration(checkOnStartup)==true) {
         // save user prefs
         this.saveLocalUserConfiguration();
       }
@@ -75,25 +110,41 @@
   
   getEncryptedCharPref: function(prefName) {
     var encValue=this.prefs.getCharPref(prefName);
-    return encValue;
-    // return (AESDecryptCtr(encValue, this.prefPwd(), 192));
+    return (AESDecryptCtr(encValue, this.prefPwd(), 192));
   },
   
   setEncryptedCharPref: function(prefName, prefValue) {
-    //var encValue=AESEncryptCtr(prefValue.trim(), this.prefPwd(), 192);
-    //this.prefs.setCharPref(prefName, encValue);
-    this.prefs.setCharPref(prefName, prefValue);
+    var encValue=AESEncryptCtr(prefValue.trim(), this.prefPwd(), 192);
+    this.prefs.setCharPref(prefName, encValue);
   },
   
   loadLocalUserConfiguration: function() {
     this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
                  .getService(Components.interfaces.nsIPrefService)
-                 .getBranch("extensions.lemurquerylog.");
+                 .getBranch("extensions.qthlog.");
     
     this._serverBaseURL=this.prefs.getCharPref("server").trim();
     this._useRandomSessionId=this.prefs.getBoolPref("userandomsession");
     this._useDesktopSearch=this.prefs.getBoolPref("logdesktopsearch");
+    
+    this._useAutomaticUploads=this.prefs.getBoolPref("useautouploads");
+    this._askWhenUsingAutoUploads=this.prefs.getBoolPref("askwhenautouploads");
+    var thisNextUploadTime=this.prefs.getCharPref("nextautouploadtime");
+    if (thisNextUploadTime=="undefined") {
+      thisNextUploadTime=0;
+    }
+    var thisNextUploadTimeLong=(+thisNextUploadTime);
 
+    if (thisNextUploadTimeLong==0) {
+      var todaysDate = new Date; // Generic JS date object
+      var unixtime_ms = todaysDate.getTime(); // Returns milliseconds since the epoch
+      this._nextTimeToAutoUpload=unixtime_ms + this._autoUploadIntervalTime;
+      // and set it in the prefs
+      this.prefs.setCharPref("nextautouploadtime", new String(this._nextTimeToAutoUpload));
+    } else {
+      this._nextTimeToAutoUpload=thisNextUploadTimeLong;
+    }
+
     this._useBlacklistPersonal=this.prefs.getBoolPref("usepersonalbl");
     this._useBlacklistAddress=this.prefs.getBoolPref("useaddressbl");
     this._useBlacklistProperName=this.prefs.getBoolPref("usepropernamebl");
@@ -111,17 +162,23 @@
     this._blacklistAddressRegex=this.getEncryptedCharPref("bl.addressrx");
     this._blacklistPropernameRegex=this.getEncryptedCharPref("bl.propernamerx");
     this._blacklistKeywordRegex=this.getEncryptedCharPref("bl.keywordrx");
+    
+    this._knownSearchEngines=this.prefs.getCharPref("searchengines").trim();
   },
 
   saveLocalUserConfiguration: function () {
     this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
                  .getService(Components.interfaces.nsIPrefService)
-                 .getBranch("extensions.lemurquerylog.");
+                 .getBranch("extensions.qthlog.");
                  
     this.prefs.setCharPref("server", this._serverBaseURL.trim());
     this.prefs.setBoolPref("userandomsession", this._useRandomSessionId);
     this.prefs.setBoolPref("logdesktopsearch", this._useDesktopSearch);
-    
+
+    this.prefs.setBoolPref("useautouploads", this._useAutomaticUploads);
+    this.prefs.setBoolPref("askwhenautouploads", this._askWhenUsingAutoUploads);
+    this.prefs.setCharPref("nextautouploadtime", new String(this._nextTimeToAutoUpload));
+
     this.prefs.setBoolPref("usepersonalbl", this._useBlacklistPersonal);
     this.prefs.setBoolPref("useaddressbl", this._useBlacklistAddress);
     this.prefs.setBoolPref("usepropernamebl", this._useBlacklistProperName);
@@ -138,9 +195,47 @@
     this.setEncryptedCharPref("bl.addressrx", this._blacklistAddressRegex);
     this.setEncryptedCharPref("bl.propernamerx", this._blacklistPropernameRegex);
     this.setEncryptedCharPref("bl.keywordrx", this._blacklistKeywordRegex);
+    
+    this.prefs.setCharPref("searchengines", this._knownSearchEngines);
   },
+  
+  getSearchEnginePrefixArray: function() {
+    var thisArray=new Array();
+    var items=this._knownSearchEngines.split("\n");
+    for (var i=0; i < items.length; i++) {
+      if (items[i].length > 0) {
+        thisArray[i]=items[i];
+      }
+    }
+    return thisArray;
+  },
+  
+  isTimeToAutomaticUpload: function () {
+    if (this._serverAllowAutoUploads && this._useAutomaticUploads) {
+      var currentTime=new Date;
+      var currentTimeMs=currentTime.getTime();
+      if (currentTimeMs > this._nextTimeToAutoUpload) {
+        return true;
+      }
+    }
+    return false;
+  },
+  
+  setNextAutomaticUploadTime: function () {
+    var currentTime=new Date;
+    var currentTimeMs=currentTime.getTime();
+    this._nextTimeToAutoUpload=currentTimeMs + this._autoUploadIntervalTime;
+    this.saveLocalUserConfiguration();
+  },
+  
+  getNextAutoUploadTimeString: function () {
+    var nextUploadTimeSec=new Date(this._nextTimeToAutoUpload);
+    return nextUploadTimeSec.toString();
+  },
 
-  loadServerConfiguration: function () {
+  loadServerConfiguration: function (checkOnStartup) {
+  
+    var checkOnStartup = (checkOnStartup == null) ? false : checkOnStartup;
 
     if (this._serverBaseURL.length==0) {
       return false;
@@ -153,12 +248,16 @@
       xmlRequest.open("GET", configUrl, false);
       xmlRequest.send(null);
     } catch (e) {
-      alert("QT Honey Toolbar:\nError retrieving configuration from server.\n Is the server URL set properly?");
+      if (!checkOnStartup) {
+        alert("Lemur Query Log Toolbar:\nError retrieving configuration from server.\n Is the server URL set properly?");
+      }
       return false;
     }
     
     if (xmlRequest.status!=200) {
-      alert("QT Honey Toolbar:\nError retrieving configuration from server.\n Is the server URL set properly?");
+      if (!checkOnStartup) {
+        alert("Lemur Query Log Toolbar:\nError retrieving configuration from server.\n Is the server URL set properly?");
+      }
       return false;
     }
 
@@ -179,6 +278,27 @@
 
     this._serverEncryptionModulus=modulus[0].firstChild.nodeValue;
     this._serverEncryptionExponent=exponent[0].firstChild.nodeValue;
+    
+    var autouploadsElement=xmlDoc.getElementsByTagName("automaticuploads");
+    if (autouploadsElement && autouploadsElement.length > 0) {
+      var allowsAutoUploadElement=autouploadsElement[0].getElementsByTagName("allowautouploads");
+      var autoUploadsIntervalElement=autouploadsElement[0].getElementsByTagName("autouploadinterval");
+      if (allowsAutoUploadElement && allowsAutoUploadElement.length==1) {
+        var allowsAutoUploadValue=allowsAutoUploadElement[0].firstChild.nodeValue;
+        if (allowsAutoUploadValue=='false') {
+          this._serverAllowAutoUploads=false;
+        } else {
+          this._serverAllowAutoUploads=true;
+        }
+      }
+      if (autoUploadsIntervalElement && autoUploadsIntervalElement.length==1) {
+        var dayInterval=autoUploadsIntervalElement[0].firstChild.nodeValue;
+        var dayIntervalNumber=new Number(dayInterval);
+        if (dayIntervalNumber!=Number.NaN) {
+          this._autoUploadIntervalTime=dayIntervalNumber*86400000;
+        }
+      }
+    }
 
     var rndSessionElement=xmlDoc.getElementsByTagName("allowrandomsession");
     var allowPersonalBLElement=xmlDoc.getElementsByTagName("allowpersonalblacklist");
@@ -230,6 +350,35 @@
         this._allowBlacklistKeywords=true;
       }
     }
+    
+    // get the known search engines if available
+    var currentSEArray=Array();
+    currentSEArray=this.arrayFromString(this._knownSearchEngines);
+    
+    var seElement=xmlDoc.getElementsByTagName("searchengines");
+    if (seElement.length > 0) {
+      var engineElements=seElement[0].getElementsByTagName("engine");
+      for (var e=0; e < engineElements.length; e++) {
+        var thisEngineValue=engineElements[e].firstChild.nodeValue;
+        if (thisEngineValue.indexOf("http://127.0.0.1") >= 0) {
+          continue; 
+        } else {
+          var foundSE=false;
+          for (var sea=0; sea < currentSEArray.length; sea++) {
+            if (currentSEArray[sea]==thisEngineValue) {
+              foundSE=true;
+              break;
+            }
+          }
+          if (!foundSE) {
+            currentSEArray.splice(currentSEArray.length, 0, thisEngineValue);
+          }
+        }
+      }
+    }
+    
+    this._knownSearchEngines=this.arrayToString(currentSEArray);
+    
 
     this._needToRefreshSettings=false;
     return true;
@@ -237,3 +386,14 @@
 };
 
 
+// UMass logging only to ensure the registry accepts it as a change
+// and not the default value...
+// try {
+//   var prefs = Components.classes["@mozilla.org/preferences-service;1"]
+//                 .getService(Components.interfaces.nsIPrefService)
+//                 .getBranch("extensions.qthlog.");
+//  prefs.setCharPref("server", LemurLogToolbarConfiguration._serverBaseURL.trim());
+// } catch (prefEx) {
+//  // ignore any errors
+// }
+

Modified: src/chrome/content/logtoolbar.js
===================================================================
--- src/chrome/content/logtoolbar.js	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/logtoolbar.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -17,7 +17,83 @@
 
 var lemurlog_upload_service = null;
 
+// support for private browsing
+var inPrivateBrowseMode=false;
+var isLoggingInPrivate=true;
+
 ///////////////////////////////////////////////////////////////////////
+// Handler for writing to the log - checking for auto uploads
+///////////////////////////////////////////////////////////////////////
+function lemurlog_DoWriteLogFile(fileName, text) {
+  lemurlog_WriteLogFile(fileName, text);
+  lemurlog_checkAutoUpload();
+}
+
+function lemurlog_checkAutoUpload() {
+  if (LemurLogToolbarConfiguration._isCurrentlyUploading) { return; }
+  
+  LemurLogToolbarConfiguration._isCurrentlyUploading=true;
+  
+  // see if we are using auto uploads in the configuration
+  if (LemurLogToolbarConfiguration._serverBaseURL!="" && LemurLogToolbarConfiguration._serverAllowAutoUploads && LemurLogToolbarConfiguration._useAutomaticUploads) {
+  
+    // get the current unix time
+    var currentDate = new Date; // Generic JS date object
+    var unixtime_ms = currentDate.getTime(); // Returns milliseconds since the epoch
+    
+    // see if it's time for an upload
+    if (LemurLogToolbarConfiguration._nextTimeToAutoUpload < unixtime_ms) {
+      // it's time!
+      // do we need to ask the user first?
+      if (LemurLogToolbarConfiguration._askWhenUsingAutoUploads) {
+      
+        // yes - check and see
+        var currentTime=new Date;
+        var currentTimeMs=currentTime.getTime();
+        var nextTimeToAutoUpload=currentTimeMs + LemurLogToolbarConfiguration._autoUploadIntervalTime;
+        
+        var nextUploadTimeSec=new Date(nextTimeToAutoUpload);
+        var nextUploadTimeStr=nextUploadTimeSec.toString();
+        
+        var userConfirm=window.confirm(
+          "An automatic upload of toolbar data is scheduled to run now.\n" + 
+          "(If you cancel, the next upload is scheduled for: " + nextUploadTimeStr + "\nProceed?"
+        );
+
+        if (userConfirm) {
+          lemurlog_DoActualUpload_Log();
+        } else {
+          // user clicked cancel
+          LemurLogToolbarConfiguration.setNextAutomaticUploadTime();
+          LemurLogToolbarConfiguration.saveLocalUserConfiguration();
+          LemurLogToolbarConfiguration._isCurrentlyUploading=false;
+          return;
+        }
+      } else {
+        // no - don't need user input to auto-upload
+        lemurlog_DoActualUpload_Log();
+      }
+    }
+  } else {
+    LemurLogToolbarConfiguration._isCurrentlyUploading=false;
+  }
+}
+
+///////////////////////////////////////////////////////////////////////
+// performs the upload of log files to remote server w/out prompt
+///////////////////////////////////////////////////////////////////////
+function lemurlog_DoActualUpload_Log()
+{
+  // before uploading - scrub the log files
+  // remember to remove any search results that match
+  // a query where any query term is blacklisted...
+  
+  lemurlog_upload_service = new lemurlog_uploadService();
+  window.openDialog("chrome://qthtoolbar/content/upload.xul", "LogTB-Upload", "chrome=yes,modal=no,centerscreen=yes,status=no,height=400,width=600", window);
+}
+
+
+///////////////////////////////////////////////////////////////////////
 // Upload log files to remote server
 ///////////////////////////////////////////////////////////////////////
 function lemurlog_Upload_Log(event)
@@ -28,13 +104,7 @@
     return;
   }
   
-  // before uploading - scrub the log files
-  // remember to remove any search results that match
-  // a query where any query term is blacklisted...
-  
-  lemurlog_upload_service = new lemurlog_uploadService();
-  window.openDialog("chrome://qthtoolbar/content/upload.xul", "LogTB-Upload", "chrome=yes,modal=no,centerscreen=yes,status=no", window);
-
+  lemurlog_DoActualUpload_Log();
 }
 
 function lemurlog_showsettings(event) {
@@ -91,12 +161,13 @@
   var text="";
   if (str) 
   {
-    text = str.data.substring(0,strLength.value / 2); 
+    // text = str.data.substring(0,strLength.value / 2); 
+    text = str.data.substring(0); 
   }
   //remove repeated spaces
   text = washAndRinse(lemurlog_TrimString(text));
 
-  lemurlog_WriteLogFile(lemurlog_LOG_FILE, "CtrlC\t" + time +"\t"+ text.length +"\t" + text +"\n");
+  lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "CtrlC\t" + time +"\t"+ text.length +"\t" + text +"\n");
 } 
 
 ///////////////////////////////////////////////////////////////////////
@@ -149,13 +220,13 @@
   switch(event.button)
   {
     case 0:
-      lemurlog_WriteLogFile(lemurlog_LOG_FILE, "LClick\t" + time +"\t"+ url +"\n");
+      lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "LClick\t" + time +"\t"+ url +"\n");
       break;
     case 1:
-      lemurlog_WriteLogFile(lemurlog_LOG_FILE, "MClick\t" + time +"\t"+ url +"\n");
+      lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "MClick\t" + time +"\t"+ url +"\n");
       break;
     case 2:
-      lemurlog_WriteLogFile(lemurlog_LOG_FILE, "RClick\t" + time +"\t"+ url +"\n");
+      lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "RClick\t" + time +"\t"+ url +"\n");
       break;
     default:
   }
@@ -178,7 +249,7 @@
   if (event.target.localName == "vbox")// Firefox
   { 
     var time = new Date().getTime();
-    lemurlog_WriteLogFile(lemurlog_LOG_FILE, "AddTab\t" + time + "\n");
+    lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "AddTab\t" + time + "\n");
   }
 }
 
@@ -198,7 +269,7 @@
   if (event.target.localName == "vbox")// Firefox
   { 
     var time = new Date().getTime();
-    lemurlog_WriteLogFile(lemurlog_LOG_FILE, "RmTab\t" + time + "\n");
+    lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "RmTab\t" + time + "\n");
   }
 }
 
@@ -217,7 +288,7 @@
   {
     var time = new Date().getTime();
     url=washAndRinse(url, true);
-    lemurlog_WriteLogFile(lemurlog_LOG_FILE, "SelTab\t" + time + "\t" + url + "\n");
+    lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "SelTab\t" + time + "\t" + url + "\n");
   }
 }
 
@@ -231,7 +302,7 @@
     return;
   }
   var time = new Date().getTime();
-  lemurlog_WriteLogFile(lemurlog_LOG_FILE, "AddTab\t" + time + "\n");
+  lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "AddTab\t" + time + "\n");
 }
 
 ///////////////////////////////////////////////////////////////////////
@@ -244,7 +315,7 @@
     return;
   }
   var time = new Date().getTime();
-  lemurlog_WriteLogFile(lemurlog_LOG_FILE, "RmTab\t" + time + "\n");
+  lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "RmTab\t" + time + "\n");
 }
 
 
@@ -268,7 +339,7 @@
   {
     var time = new Date().getTime();
     url=washAndRinse(url, true);
-    lemurlog_WriteLogFile(lemurlog_LOG_FILE, "SelTab\t" + time + "\t" + url + "\n");
+    lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "SelTab\t" + time + "\t" + url + "\n");
   }
 }
 
@@ -285,23 +356,28 @@
   }
 
   var time = new Date().getTime();
-  var url = window.content.location.href;
-  if(url == lemurlog_prev_focus_url)
-  {
-    return;
+  
+  if ((typeof(event.originalTarget)!="undefined") && (typeof(event.originalTarget.location)!="undefined")) {
+
+    var url = event.originalTarget.location.href;
+
+    if(url == lemurlog_prev_focus_url)
+    {
+      return;
+    }
+    lemurlog_prev_focus_url = url;
+    if(lemurlog_IsRecordableURL(url))
+    {
+      lemurlog_g_recordable = true;
+    }
+    else
+    {
+      lemurlog_g_recordable = false;
+      return;
+    }
+    url=washAndRinse(url, true);
+    lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "Focus\t" + time + "\t" + url + "\n");
   }
-  lemurlog_prev_focus_url = url;
-  if(lemurlog_IsRecordableURL(url))
-  {
-    lemurlog_g_recordable = true;
-  }
-  else
-  {
-    lemurlog_g_recordable = false;
-    return;
-  }
-  url=washAndRinse(url, true);
-  lemurlog_WriteLogFile(lemurlog_LOG_FILE, "Focus\t" + time + "\t" + url + "\n");
 
 }
 
@@ -323,7 +399,7 @@
     return;
   }
   lemurlog_prev_blur_time = time;
-  lemurlog_WriteLogFile(lemurlog_LOG_FILE, "Blur\t" + time + "\n");
+  lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "Blur\t" + time + "\n");
 }
 
 ///////////////////////////////////////////////////////////////////////
@@ -343,7 +419,7 @@
     return;
   }
   lemurlog_prev_scroll_time = time;
-  lemurlog_WriteLogFile(lemurlog_LOG_FILE, "Scroll\t" + time + "\n");
+  lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "Scroll\t" + time + "\n");
 }
 
 ///////////////////////////////////////////////////////////////////////
@@ -357,7 +433,9 @@
     return;
   }
   var time = new Date().getTime();
-  var url = window.content.location.href;
+
+  var url = event.originalTarget.location.href;
+  
   if(lemurlog_IsRecordableURL(url))
   {
     lemurlog_g_recordable = true;
@@ -375,7 +453,7 @@
   }
   lemurlog_prev_show_time = time;
   url=washAndRinse(url, true);
-  lemurlog_WriteLogFile(lemurlog_LOG_FILE, "Show\t" + time + "\t" + url + "\n");
+  lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "Show\t" + time + "\t" + url + "\n");
 
 }
 
@@ -395,7 +473,7 @@
     return;
   }
   lemurlog_prev_hide_time = time;
-  lemurlog_WriteLogFile(lemurlog_LOG_FILE, "Hide\t" + time + "\n");
+  lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "Hide\t" + time + "\n");
 }
 
 ///////////////////////////////////////////////////////////////////////
@@ -403,17 +481,21 @@
 ///////////////////////////////////////////////////////////////////////
 function lemurlog_Switch(event, mode)
 {
-  var time = new Date().getTime();
-  if(mode === true)
-  {
-    lemurlog_WriteLogFile(lemurlog_LOG_FILE, "StartLogging\t" + time + "\n");
+  // don't allow switch if we're in private browse mode!
+  if (!inPrivateBrowseMode) {
+    var time = new Date().getTime();
+    
+    lemurlog_g_enable = mode;
+    if(mode === true)
+    {
+      lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "StartLogging\t" + time + "\n");
+    }
+    else
+    {
+      lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "PauseLogging\t" + time + "\n");
+    }
+    lemurlog_SetButtons();
   }
-  else
-  {
-    lemurlog_WriteLogFile(lemurlog_LOG_FILE, "PauseLogging\t" + time + "\n");
-  }
-  lemurlog_g_enable = mode;
-  lemurlog_SetButtons();
 }
 
 ///////////////////////////////////////////////////////////////////////
@@ -427,53 +509,58 @@
   {
     return;
   }
-  var url = window.content.location.href;
-  if(url == lemurlog_prev_load_url)
-  {
-    return;
-  }
-  lemurlog_prev_load_url = url;
 
-  if(!lemurlog_IsRecordableURL(url))
-  {
-    // alert("LoadCapEvent - not recordable: " + url);
-    return;
-  }
-  var time = new Date().getTime();
-  var printableurl=washAndRinse(url, true);
-  lemurlog_WriteLogFile(lemurlog_LOG_FILE, "LoadCap\t" + time + "\t" + printableurl + "\n");
+  if ((typeof(event.originalTarget)!="undefined") && (typeof(event.originalTarget.location)!="undefined")) {
+    var url = event.originalTarget.location.href;
+    if(url == lemurlog_prev_load_url)
+    {
+      return;
+    }
+    lemurlog_prev_load_url = url;
 
-  //add mousedown listeners to all links
-  var links = window.content.document.links;
-  for (i = 0; i < links.length; i++)
-  {
-    links[i].addEventListener('mousedown', lemurlog_OnMouseDown, true);
-  }
+    if(!lemurlog_IsRecordableURL(url))
+    {
+      // alert("LoadCapEvent - not recordable: " + url);
+      return;
+    }
+    var time = new Date().getTime();
+    var printableurl=washAndRinse(url, true);
+    lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "LoadCap\t" + time + "\t" + printableurl + "\n");
 
-  //log search history
-  // if it's a search URL and our last URL wasn't sanitized...
-  if(lemurlog_IsSearchURL(url) && (printableurl.indexOf(sanitizedSubstitution) < 0)) 
-  { 
-    //save new  search results
-    var found = false;
-    var i;
-    for(i = lemurlog_search_urls.length -1 ; i>=0; i--)
-    {
-      if(url == lemurlog_search_urls[i])
+    //add mousedown listeners to all links
+    var links = window.content.document.links;
+    if (links!="undefined") {
+      for (i = 0; i < links.length; i++)
       {
-        found = true;
-        break;
+        links[i].addEventListener('mousedown', lemurlog_OnMouseDown, true);
       }
+    }
 
+    //log search history
+    // if it's a search URL and our last URL wasn't sanitized...
+    if(lemurlog_IsSearchURL(url) && (printableurl.indexOf(sanitizedSubstitution) < 0)) 
+    { 
+      //save new  search results
+      var found = false;
+      var i;
+      for(i = lemurlog_search_urls.length -1 ; i>=0; i--)
+      {
+        if(url == lemurlog_search_urls[i])
+        {
+          found = true;
+          break;
+        }
+
+      }
+      if(found === false)//new search url
+      {
+        var thisUrl=washAndRinse(url, true);
+        lemurlog_search_urls[lemurlog_search_urls.length]=thisUrl;
+        var html_content = washAndRinse(window.content.document.documentElement.innerHTML);
+        lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "Search\t"+time+"\t"+html_content.length+"\n");
+        lemurlog_DoWriteLogFile(lemurlog_PAGE_FILE, "LOGTB_BEGIN_SEARCH_PAGE\nID="+time+"\nURL="+thisUrl+"\nLength="+html_content.length+"\n<html>\n"+html_content+"\n</html>\n");
+      }
     }
-    if(found === false)//new search url
-    {
-      var thisUrl=washAndRinse(url, true);
-      lemurlog_search_urls[lemurlog_search_urls.length]=thisUrl;
-      var html_content = washAndRinse(window.content.document.documentElement.innerHTML);
-      lemurlog_WriteLogFile(lemurlog_LOG_FILE, "Search\t"+time+"\t"+html_content.length+"\n");
-      lemurlog_WriteLogFile(lemurlog_PAGE_FILE, "LOGTB_BEGIN_SEARCH_PAGE\nID="+time+"\nURL="+thisUrl+"\nLength="+html_content.length+"\n<html>\n"+html_content+"\n</html>\n");
-    }
   }
 }
 ///////////////////////////////////////////////////////////////////////
@@ -488,7 +575,9 @@
   {
     return;
   }
-  var url = window.content.location.href;
+
+  var url = event.originalTarget.location.href;
+  
   if(url == lemurlog_prev_load_url)
   {
     return;
@@ -499,7 +588,7 @@
   if(lemurlog_IsRecordableURL(url))
   {
     url=washAndRinse(url, true);
-    lemurlog_WriteLogFile(lemurlog_LOG_FILE, "LoadBub\t" + time + "\t" + url + "\n");
+    lemurlog_DoWriteLogFile(lemurlog_LOG_FILE, "LoadBub\t" + time + "\t" + url + "\n");
   }
 
 }
@@ -544,9 +633,66 @@
 }
 
 
+// add support for private browsing - do not allow logging!
 
+var privateBrowserListener = new PrivateBrowsingListener();  
+privateBrowserListener.watcher = {  
+  onEnterPrivateBrowsing : function() {  
+    // we have just entered private browsing mode!
+    isLoggingInPrivate=lemurlog_g_enable;
+    lemurlog_Switch(null, false);
+    
+    // disable any buttons
+    var button = document.getElementById("LogTB-Pause-Button");
+    if (button) { button.disabled = true; }
+    button = document.getElementById("LogTB-Pause-Button-Gray");
+    if (button) { button.disabled = true; }
+    button = document.getElementById("LogTB-Start-Button");
+    if (button) { button.disabled = true; }
+    button = document.getElementById("LogTB-Start-Button-Gray");
+    if (button) { button.disabled = true; }
+    
+    inPrivateBrowseMode=true;
+  },  
+   
+  onExitPrivateBrowsing : function() {  
+    // we have just left private browsing mode!  
+    inPrivateBrowseMode=false;
+    lemurlog_Switch(null, isLoggingInPrivate);
+  }  
+};
+
+
+// see if we started in private browse mode
+try {
+  var pbs = Components.classes["@mozilla.org/privatebrowsing;1"].getService(Components.interfaces.nsIPrivateBrowsingService);
+  var inPrivateBrowsingMode = pbs.privateBrowsingEnabled;  
+
+  if (inPrivateBrowsingMode) {  
+    // we are in private browsing mode!
+    isLoggingInPrivate=lemurlog_g_enable;
+    lemurlog_Switch(null, false);
+    
+    // disable any buttons
+    var button = document.getElementById("LogTB-Pause-Button");
+    if (button) { button.disabled = true; }
+    button = document.getElementById("LogTB-Pause-Button-Gray");
+    if (button) { button.disabled = true; }
+    button = document.getElementById("LogTB-Start-Button");
+    if (button) { button.disabled = true; }
+    button = document.getElementById("LogTB-Start-Button-Gray");
+    if (button) { button.disabled = true; }
+    
+    inPrivateBrowseMode=true;
+  }  
+} catch (ex) {
+ // ignore exception for older versions
+ alert("Exception (Private Browse): " + ex.description);
+}
+
 //add listeners
-window.addEventListener('load', lemurlog_OnLoad_Cap, true);//if false, sometimes isn't triggerred
+// window.addEventListener('load', lemurlog_OnLoad_Cap, true);//if false, sometimes isn't triggerred
+document.addEventListener('load', lemurlog_OnLoad_Cap, true);//if false, will fire just for the document - no frames
 window.addEventListener('load', lemurlog_OnLoad_Bub, false);//if true, gBrowser is not ready yet
 
 window.addEventListener('pageshow', lemurlog_OnShow, false);
@@ -586,7 +732,6 @@
 }
 
 
-
 ///////////////////////////////////////////////////////////
 // Supported log records:
 ///////////////////////////////////////////////////////////

Modified: src/chrome/content/logtoolbar.xul
===================================================================
--- src/chrome/content/logtoolbar.xul	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/logtoolbar.xul	2009-10-09 09:20:45 UTC (rev 8)
@@ -14,6 +14,7 @@
   <script type="application/x-javascript" src="chrome://qthtoolbar/content/configuration.js" />
   <script type="application/x-javascript" src="chrome://qthtoolbar/content/utils.js" />
   <script type="application/x-javascript" src="chrome://qthtoolbar/content/service.js" />
+  <script type="application/x-javascript" src="chrome://qthtoolbar/content/privateBrowserListener.js"/>
   <script type="application/x-javascript" src="chrome://qthtoolbar/content/logtoolbar.js" />
   <script type="application/x-javascript" src="chrome://qthtoolbar/content/qth.js" />
 
@@ -21,7 +22,7 @@
 
     <toolbar 
       id="LogTB-Toolbar" 
-      toolbarname="QT Honey Toolbar" 
+      toolbarname="Lemur Query Log Toolbar" 
       accesskey="L" 
       class="chromeclass-toolbar" 
       context="toolbar-context-menu" 
@@ -62,17 +63,16 @@
         >
           <menupopup>
             <menuitem
+              id="qth_view_log"
               label="QT Honey log"
-              tooltiptext="View QT Honey log"
-              id="qth_view_log"
             />
             <menuitem
-              label="Lemur Activity log"
+              label="Activity log"
               tooltiptext="View activity log"
               oncommand="lemurlog_View_Log(event, 0)" 
             />
             <menuitem
-              label="Lemur Search log"
+              label="Search log"
               tooltiptext="View search log"
               oncommand="lemurlog_View_Log(event, 1)" 
             />

Added: src/chrome/content/privateBrowserListener.js
===================================================================
--- src/chrome/content/privateBrowserListener.js	                        (rev 0)
+++ src/chrome/content/privateBrowserListener.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -0,0 +1,62 @@
+
+// an object to listen for 
+// private browsing requests
+// based on:
+//   https://developer.mozilla.org/En/Supporting_private_browsing_mode
+
+function PrivateBrowsingListener() {  
+  this.init();  
+}  
+PrivateBrowsingListener.prototype = {  
+  _os: null,  
+  _inPrivateBrowsing: false, // whether we are in private browsing mode  
+  _watcher: null, // the watcher object  
+   
+  init : function () {  
+    this._inited = true;  
+    this._os = Components.classes["@mozilla.org/observer-service;1"]  
+                         .getService(Components.interfaces.nsIObserverService);  
+    this._os.addObserver(this, "private-browsing", false);  
+    this._os.addObserver(this, "quit-application", false);  
+    try {  
+      var pbs = Components.classes["@mozilla.org/privatebrowsing;1"]  
+                          .getService(Components.interfaces.nsIPrivateBrowsingService);  
+      this._inPrivateBrowsing = pbs.privateBrowsingEnabled;  
+    } catch(ex) {  
+      // ignore exceptions in older versions of Firefox  
+    }  
+  },  
+   
+  observe : function (aSubject, aTopic, aData) {  
+    if (aTopic == "private-browsing") {  
+      if (aData == "enter") {  
+        this._inPrivateBrowsing = true;  
+        if (this.watcher &&  
+            "onEnterPrivateBrowsing" in this._watcher) {  
+          this.watcher.onEnterPrivateBrowsing();  
+        }  
+      } else if (aData == "exit") {  
+        this._inPrivateBrowsing = false;  
+        if (this.watcher &&  
+            "onExitPrivateBrowsing" in this._watcher) {  
+          this.watcher.onExitPrivateBrowsing();  
+        }  
+      }  
+    } else if (aTopic == "quit-application") {  
+      this._os.removeObserver(this, "quit-application");  
+      this._os.removeObserver(this, "private-browsing");  
+    }  
+  },  
+   
+  get inPrivateBrowsing() {  
+    return this._inPrivateBrowsing;  
+  },  
+   
+  get watcher() {  
+    return this._watcher;  
+  },  
+   
+  set watcher(val) {  
+    this._watcher = val;  
+  }  
+};  
\ No newline at end of file

Modified: src/chrome/content/qth.js
===================================================================
--- src/chrome/content/qth.js	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/qth.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -309,10 +309,10 @@
 	return target;
 }
 
-function dict_get( dict, key, default_value )
+function dict_get(dict, key, default_value)
 {
-	if( !( key in dict ) )
-		return default_value || null
+	if(!(key in dict))
+		return default_value
 	return dict[key]
 }
 
@@ -342,6 +342,8 @@
 }
 
 function url_parse_query(queries) {
+	if(!queries)
+		return {}
 	return array_reduce(queries.split('&'), {}, 
 		function(results, query, index) {
 			var key_value = query.split('=')
@@ -384,10 +386,13 @@
 		case 'CtrlC': log['event_label'] = 'copy'; break;
 		case 'RmTab': log['event_label'] = 'close'; break;
 		//処理しない。
-		case 'SelTab': //log['event_label'] = 'change'; break;	//-> 独自に検出するので処理しない。
-		case 'AddTab':
+//		case 'SelTab': //log['event_label'] = 'change'; break;	//-> 独自に検出するので処理しない。
+//		case 'AddTab':
 		case 'Show':
 		case 'Hide':
+		case 'RClick':
+		case 'LClick':
+		case 'Search':
 			return;
 		default: debug_log(original_log); return;
 	}
@@ -419,7 +424,9 @@
 // ログ文字列作成用のパラメータを作って返す。
 // ログ項目のデフォルト値を持った辞書を作成する。
 // 作成した辞書に、引数の辞書で上書きしたものを返す。
-function build_log(log_option) {
+function build_log(log_option, document) {
+	document = document || gBrowser.contentDocument;
+	
 	// ログ用の辞書を用意
 	var log = {};
 
@@ -436,8 +443,8 @@
 	log['session_time'] = date_time_get_epoch() - tab_data.created;
 
 	// URLやタイトルを記録
-	log['title'] = gBrowser.contentDocument.title;
-	log['url'] = gBrowser.contentDocument.location.href;
+	log['title'] = document.title;
+	log['url'] = document.location.href;
 
 	// ページIDを取得
 	log['page_id'] = get_page_id(tab_data, log['url']);
@@ -634,7 +641,7 @@
 	ifile_append(log_ifile, log_text);
 	
 	// ステータスダイアログを更新
-	// window.openDialog('chrome://qthtoolbar/content/status.xul', 'qth_status', 'width=300,height=100,chrome', log, debug_log);
+	window.openDialog('chrome://qthtoolbar/content/status.xul', 'qth_status', 'width=300,height=100,chrome', log, debug_log);
 }
 
 
@@ -703,8 +710,8 @@
 // すべてのAタグにアタッチしてlinkイベントを取る。
 function attach_on_content_loaded() {
 	event_observe(document.getElementById('appcontent'), 'DOMContentLoaded',
-		function(){
-			append_log(build_log({'event_label': 'load'}));
+		function(event){
+			append_log(build_log({'event_label': 'load'}, event.target));
 		},
 		true
 	)
@@ -734,7 +741,7 @@
 					)
 				}
 			)
-			
+
 			// linkイベントのためにaタグのclickイベントにアタッチ
 			var a_tags = document.getElementsByTagName('A');
 			array_each(a_tags,
@@ -748,6 +755,9 @@
 								'anchor_text': event.target.textContent,
 								'next_url': event.target.getAttribute('href')
 							};
+							
+							if(null == log['next_url'])
+								log['next_url'] = '(href not found)'
 
 							log['next_page_id'] = get_page_id(tab_data, log['next_url']);
 
@@ -811,4 +821,4 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-})()
+})()
\ No newline at end of file

Added: src/chrome/content/scrubbingscreen.xul
===================================================================
--- src/chrome/content/scrubbingscreen.xul	                        (rev 0)
+++ src/chrome/content/scrubbingscreen.xul	2009-10-09 09:20:45 UTC (rev 8)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
+
+<dialog 
+  id="LogTB-Scrubbing-Dialog"
+  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 
+  title="Query Log Toolbar - Scrubbing log files"
+  buttons="cancel"
+  ondialogcancel="return true;"
+  onclose="return true;"
+>
+  <vbox>
+    <label id="lblScrubbing" value="Scrubbing: " />
+    <progressmeter id="pbrScrubbingProgress" mode="determined" value="0%" />
+  </vbox>
+
+</dialog>

Modified: src/chrome/content/service.js
===================================================================
--- src/chrome/content/service.js	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/service.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -11,10 +11,12 @@
   this.cgi_url = null;
   this._request = null;
   this._finish = false;
+  this._userId = "";
 
   // Public methods
-  this.upload = function()
+  this.upload = function ()
   {
+  
     var button = document.getElementById("LogTB-Clear-Button");
     button.disabled = true;
     button = document.getElementById("LogTB-View-Button");
@@ -30,8 +32,9 @@
 
     //set args
     var args= new Object();
+    
 
-    args.user_id = lemurlog_GetUniqueStringFromProfilePath(true);
+    args.user_id = this._userId;
     args.timestamp = this.timestamp;
     args.rel_filename = this.cur_file;
     args.file_size = file.fileSize;
@@ -221,6 +224,15 @@
     lemurlog_RemoveLogFile(lemurlog_LOCK_FILE);
     //change UI status
     this._setFinalUI("Uploaded successfully!");
+    
+    // reset the next auto-upload time
+    var autoIntervalTime=LemurLogToolbarConfiguration._autoUploadIntervalTime;
+    var currentDate = new Date; // Generic JS date object
+    var unixtime_ms = currentDate.getTime(); // Returns milliseconds since the epoch
+    
+    LemurLogToolbarConfiguration._nextTimeToAutoUpload=unixtime_ms+autoIntervalTime;
+    LemurLogToolbarConfiguration.saveLocalUserConfiguration();
+    LemurLogToolbarConfiguration._isCurrentlyUploading=false;
   };
 
   this._onError = function()
@@ -229,6 +241,7 @@
     lemurlog_RemoveLogFile(lemurlog_LOCK_FILE);
     //change UI status
     this._setFinalUI("Cannot upload right now, please try later.");
+    LemurLogToolbarConfiguration._isCurrentlyUploading=false;
   };
 
   this._setFinalUI = function(text)

Modified: src/chrome/content/settings.js
===================================================================
--- src/chrome/content/settings.js	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/settings.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -7,6 +7,8 @@
 var ProperNameBLItemsRegex=new Array();
 var KeywordBLItemsRegex=new Array();
 
+var KnownSearchEnginePrefixes=new Array();
+
 /**
  * retrieves the value as a boolean from a checkbox element
  * @param checkboxId the name of the checkbox component
@@ -85,14 +87,15 @@
   }
 }
 
-function populateArrayFromString(thisArray, inString) {
-  thisArray=new Array();
+function populateArrayFromString(inString) {
+  var thisArray=new Array();
   var items=inString.split("\n");
   for (var i=0; i < items.length; i++) {
     if (items[i].length > 0) {
       thisArray[i]=items[i];
     }
   }
+  return thisArray;
 }
 
 function setOptionsSettings() {
@@ -147,10 +150,10 @@
   populateListboxFromString('lstBlacklistNameData', LemurLogToolbarConfiguration._blacklistPropernameItems);
   populateListboxFromString('lstBlacklistKeywordData', LemurLogToolbarConfiguration._blacklistKeywordItems);
   
-  populateArrayFromString(PersonalBLItemsRegex, LemurLogToolbarConfiguration._blacklistPersonalRegex);
-  populateArrayFromString(AddressBLItemsRegex, LemurLogToolbarConfiguration._blacklistAddressRegex);
-  populateArrayFromString(ProperNameBLItemsRegex, LemurLogToolbarConfiguration._blacklistPropernameRegex);
-  populateArrayFromString(KeywordBLItemsRegex, LemurLogToolbarConfiguration._blacklistKeywordRegex);
+  PersonalBLItemsRegex=populateArrayFromString(LemurLogToolbarConfiguration._blacklistPersonalRegex);
+  AddressBLItemsRegex=populateArrayFromString(LemurLogToolbarConfiguration._blacklistAddressRegex);
+  ProperNameBLItemsRegex=populateArrayFromString(LemurLogToolbarConfiguration._blacklistPropernameRegex);
+  KeywordBLItemsRegex=populateArrayFromString(LemurLogToolbarConfiguration._blacklistKeywordRegex);
   
   setCheckboxItemValue('chkAnonSession', LemurLogToolbarConfiguration._useRandomSessionId);
   setCheckboxItemValue('chkUseDesktopSearch', LemurLogToolbarConfiguration._useDesktopSearch);
@@ -159,6 +162,8 @@
   setCheckboxItemValue('chkProperNameData', LemurLogToolbarConfiguration._useBlacklistProperName);
   setCheckboxItemValue('chkKeywordData', LemurLogToolbarConfiguration._useBlacklistKeywords);
   
+  populateListboxFromString('lstSearchEngines', LemurLogToolbarConfiguration._knownSearchEngines);
+  
   chkPersonalDataOnChange();
   chkAddressDataOnChange();
   chkProperNameDataOnChange();
@@ -166,8 +171,46 @@
      
   var txtServer=document.getElementById('txtServer');
   txtServer.value=LemurLogToolbarConfiguration._serverBaseURL;
+  
+  setAutoUploadVisualSettings();
 }
 
+function setAutoUploadVisualSettings() {
+  var autoUploadRB=document.getElementById('btnAllowAutoUploads');
+  var manualUploadOnlyRB=document.getElementById('btnManualUploadsOnly');
+  var autoUploadAskRB=document.getElementById('btnAutoUploadsWithAsk');
+  var grpAutoUploadBox=document.getElementById('rdoGroupAutoUploads');
+  var lblAutoUploads=document.getElementById('lblAutoUploads');
+  
+  grpAutoUploadBox.selectedIndex=1;
+  if (LemurLogToolbarConfiguration._serverAllowAutoUploads==false) {
+    // manual upload only
+    manualUploadOnlyRB.disabled=false;
+    autoUploadRB.disabled=true;
+    autoUploadAskRB.disabled=true;
+    lblAutoUploads.label="Automatic Uploads: (server does not allow)";
+  } else {
+    manualUploadOnlyRB.disabled=false;
+    autoUploadRB.disabled=false;
+    autoUploadAskRB.disabled=false;
+    lblAutoUploads.label="Automatic Uploads: (manual upload selected)";
+    if (LemurLogToolbarConfiguration._useAutomaticUploads==true) {
+      lblAutoUploads.label="Automatic Uploads: next upload at:\n" + LemurLogToolbarConfiguration.getNextAutoUploadTimeString();
+      grpAutoUploadBox.selectedIndex=0;
+      if (LemurLogToolbarConfiguration._askWhenUsingAutoUploads==true) {
+        grpAutoUploadBox.selectedIndex=2;
+      }
+    }
+  }
+  
+  // var thisDialog=document.getElementById('dlgToolbarSettings');
+  try {
+    window.sizeToContent();
+  } catch (excp) {
+    // do nothing
+  }
+}
+
 function saveSettings() {
   // LemurLogToolbarConfiguration.loadLocalUserConfiguration();
   
@@ -177,6 +220,24 @@
   LemurLogToolbarConfiguration._useRandomSessionId=getCheckboxItemValue('chkAnonSession');
   LemurLogToolbarConfiguration._useDesktopSearch=getCheckboxItemValue('chkUseDesktopSearch');
   
+  var autoUploadRB=document.getElementById('btnAllowAutoUploads');
+  var manualUploadOnlyRB=document.getElementById('btnManualUploadsOnly');
+  var autoUploadAskRB=document.getElementById('btnAutoUploadsWithAsk');
+  
+  if (autoUploadRB.selected==true) {
+    // auto upload without ask
+    LemurLogToolbarConfiguration._useAutomaticUploads=true;
+    LemurLogToolbarConfiguration._askWhenUsingAutoUploads=false;
+  } else if (autoUploadAskRB.selected==true) {
+    // auto upload ask
+    LemurLogToolbarConfiguration._useAutomaticUploads=true;
+    LemurLogToolbarConfiguration._askWhenUsingAutoUploads=true;
+  } else {
+    // manual upload
+    LemurLogToolbarConfiguration._useAutomaticUploads=false;
+    LemurLogToolbarConfiguration._askWhenUsingAutoUploads=false;
+  }
+  
   LemurLogToolbarConfiguration._blacklistPersonalItems=getListItemAsString('lstBlacklistPersonalData');
   LemurLogToolbarConfiguration._blacklistAddressItems=getListItemAsString('lstBlacklistAddressData');
   LemurLogToolbarConfiguration._blacklistPropernameItems=getListItemAsString('lstBlacklistNameData');
@@ -192,7 +253,12 @@
   LemurLogToolbarConfiguration._useBlacklistProperName=getCheckboxItemValue('chkProperNameData');
   LemurLogToolbarConfiguration._useBlacklistKeywords=getCheckboxItemValue('chkKeywordData');
   
+  LemurLogToolbarConfiguration._knownSearchEngines=getListItemAsString('lstSearchEngines');
+  
   LemurLogToolbarConfiguration.saveLocalUserConfiguration();
+
+  setAutoUploadVisualSettings();
+
   return true;
 }
 
@@ -346,6 +412,33 @@
   }  
 }
 
+function btnRemoveSEListItemOnClick() {
+  var thisListBox=document.getElementById('lstSearchEngines')
+  if (thisListBox.selectedIndex > -1) {
+    KnownSearchEnginePrefixes.splice(thisListBox.selectedIndex, 1);
+    thisListBox.removeItemAt(thisListBox.selectedIndex);
+  }
+}
+
+function btnAddSEListItemOnClick() {
+  var thisListBox=document.getElementById('lstSearchEngines')
+  var thisTextBox=document.getElementById('txtNewSEListItem');
+  var thisValue=thisTextBox.value;
+  if (thisValue.length > 0) {
+    thisListBox.appendItem(thisValue, thisValue);
+    KnownSearchEnginePrefixes.splice(KnownSearchEnginePrefixes.length, 0, thisValue.safeForRegEx());
+  }
+}
+
+function doSEListItemSelection() {
+  var thisListBox=document.getElementById('lstSearchEngines')
+  if (thisListBox.selectedIndex > -1) {
+    document.getElementById('btnRemoveSEListItem').disabled=false;
+  } else {
+    document.getElementById('btnRemoveListItem').disabled=true;
+  }  
+}
+
 function btnAddSpecialPersonalOnClick() {
   window.openDialog('chrome://qthtoolbar/content/specialblacklist.xul', 'Personal Information Blacklist', 'chrome=yes,modal=yes,status=no', this, PersonalBLItemsRegex);
 }

Modified: src/chrome/content/settings.xul
===================================================================
--- src/chrome/content/settings.xul	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/settings.xul	2009-10-09 09:20:45 UTC (rev 8)
@@ -4,7 +4,7 @@
 
 <dialog 
   id="dlgToolbarSettings"
-  title="QT Honey Toolbar - Settings"
+  title="Query Log Toolbar - Settings"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   buttons="accept,cancel,extra1"
   ondialogaccept="return saveSettings();"
@@ -22,6 +22,7 @@
   <tabs>
     <tab label="General" />
     <tab label="Blacklists" />
+    <tab label="Search Engines" />
   </tabs>
   <tabpanels>
   
@@ -36,10 +37,24 @@
         </groupbox>
         <groupbox>
           <caption label="Server Settings" />
-          <hbox>
-            <label value="Address:" control="txtServer" />
-            <textbox id="txtServer" value="" size="48" onchange="txtServerOnChange();" />
-          </hbox>
+          <vbox>
+            <hbox>
+              <label value="Address:" control="txtServer" />
+              <textbox id="txtServer" value="" size="48" onchange="txtServerOnChange();" />
+            </hbox>
+            <groupbox>
+              <caption id="lblAutoUploads" label="Automatic Uploads" />
+              <radiogroup id="rdoGroupAutoUploads">
+                <vbox>
+                  <hbox>
+                    <radio id="btnAllowAutoUploads" label="Allow automatic uploads" />
+                    <radio id="btnManualUploadsOnly" label="Manual uploads only" />
+                  </hbox>
+                  <radio id="btnAutoUploadsWithAsk" label="Allow automatic uploads, but ask first" />
+                </vbox>
+              </radiogroup>
+            </groupbox>
+          </vbox>
         </groupbox>
         <groupbox>
           <caption label="Blacklist Settings" />
@@ -116,6 +131,25 @@
       </vbox>
     </tabpanel>
   
+    <tabpanel id="tabSearchEngines">
+      <vbox>
+        <label id="lblSearchEnginesList" value="Known Search Engines:" />
+        <listbox id="lstSearchEngines" seltype="single" onselect="doSEListItemSelection();"  />
+        <hbox>
+          <button id="btnRemoveSEListItem" align="end" label="Remove Selected" disabled="true" oncommand="btnRemoveSEListItemOnClick();" />
+        </hbox>
+        <hbox>
+          <label value="New item:" control="txtNewSEListItem" />
+          <textbox id="txtNewSEListItem" />
+          <button id="btnAddSEListItem" align="end" label="Add" oncommand="btnAddSEListItemOnClick();" />
+        </hbox>
+        <label value="Note: to add a new search engine to the list" />
+        <label value="of search engines the system will log results" />
+        <label value="for, use the beginning of the search URL for" />
+        <label value="the engine (i.e. http://www.google.com/search?)" />
+      </vbox>
+    </tabpanel>
+  
   </tabpanels>
 </tabbox>
 

Modified: src/chrome/content/specialblacklist.xul
===================================================================
--- src/chrome/content/specialblacklist.xul	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/specialblacklist.xul	2009-10-09 09:20:45 UTC (rev 8)
@@ -4,7 +4,7 @@
 
 <dialog 
   id="dlgSpecialBlacklist"
-  title="QT Honey Toolbar - Special Blacklist Items"
+  title="Query Log Toolbar - Special Blacklist Items"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   buttons="cancel"
   ondialogcancel="return true;"

Modified: src/chrome/content/upload.js
===================================================================
--- src/chrome/content/upload.js	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/upload.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -34,6 +34,7 @@
 
   // Add labels
   var item;
+
   item = document.getElementById("LogTB-Up-Desc0");
   item.setAttribute("value", "Uploading log files to " + LemurLogToolbarConfiguration._serverBaseURL + ":");
 
@@ -47,18 +48,26 @@
   item = document.getElementById("LogTB-Up-Result");
   item.setAttribute("value", "Scrubbing log files before upload");
   
-  lemurlog_scrubLogFiles();
+  var scrubbingWindow=window.openDialog("chrome://qthtoolbar/content/scrubbingscreen.xul", "LogTB-Scrubbing", "chrome=yes,modal=no,centerscreen=yes,status=no,height=120,width=320");
   
+  var progressMeterLabel=scrubbingWindow.document.getElementById("lblScrubbing");
+  var progressMeterItem=scrubbingWindow.document.getElementById("pbrScrubbingProgress");
+  scrubbingWindow.focus();
+  lemurlog_scrubLogFiles(progressMeterItem, progressMeterLabel);
+  scrubbingWindow.close();
+  
   item.setAttribute("value", "Uploading...");
 
   //upload the first file
   // var cgi_url = "http://"+lemurlog_UPLOAD_HOST+lemurlog_UPLOAD_CGI;
   
   var cgi_url=baseURL + "/Upload";
+  lemurlog_MainWin.lemurlog_upload_service._hasScrubbedLogs=false;
   lemurlog_MainWin.lemurlog_upload_service.cgi_url = cgi_url;
   lemurlog_MainWin.lemurlog_upload_service.timestamp = new Date().getTime();
   lemurlog_MainWin.lemurlog_upload_service.cur_file = lemurlog_LOG_FILE;
-  lemurlog_MainWin.lemurlog_upload_service.upload();
+  lemurlog_MainWin.lemurlog_upload_service._userId=lemurlog_GetUniqueStringFromProfilePath(true);
+  lemurlog_MainWin.lemurlog_upload_service.upload(progressMeterItem, item);
 }
 
 function lemurlog_up_onAccept()

Modified: src/chrome/content/upload.xul
===================================================================
--- src/chrome/content/upload.xul	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/upload.xul	2009-10-09 09:20:45 UTC (rev 8)
@@ -5,7 +5,7 @@
 <dialog 
   id="LogTB-Upload-Dialog"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 
-  title="Upload log files"
+  title="[Lemur Query Log Toolbar] - Upload log files"
   buttons="accept, cancel"
   onload="lemurlog_up_onLoad();"
   ondialogaccept="return lemurlog_up_onAccept();"

Modified: src/chrome/content/utils.js
===================================================================
--- src/chrome/content/utils.js	2009-10-09 09:09:37 UTC (rev 7)
+++ src/chrome/content/utils.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -1,18 +1,18 @@
 //To avoid confliction with other extensions, we put prefix "logtb_" on every global variables and functions
 //constant variables
-const lemurlog_DATA_DIR = "qthtoolbar_data";
-const lemurlog_LOG_FILE = "qthtoolbar_log";
-const lemurlog_PAGE_FILE = "qthtoolbar_pages";
-const lemurlog_TEMP_LOG_FILE = "qthtoolbar_log_tmp";
-const lemurlog_TEMP_PAGE_FILE = "qthtoolbar_pages_tmp";
-const lemurlog_LOCK_FILE = "qthtoolbar_lock";
+const lemurlog_DATA_DIR = "lemurlogtoolbar_data";
+const lemurlog_LOG_FILE = "lemurlogtoolbar_log";
+const lemurlog_PAGE_FILE = "lemurlogtoolbar_pages";
+const lemurlog_TEMP_LOG_FILE = "lemurlogtoolbar_log_tmp";
+const lemurlog_TEMP_PAGE_FILE = "lemurlogtoolbar_pages_tmp";
+const lemurlog_LOCK_FILE = "lemurlogtoolbar_lock";
 
 const lemurlog_UPLOAD_SUCCEED_STR="LOGTOOLBAR_UPLOAD_SUCCEED";
 
 const lemurlog_MIN_INTERVAL = 500;//milliseconds
 
 LemurLogToolbarConfiguration.loadLocalUserConfiguration();
-LemurLogToolbarConfiguration.getDefaultServerConfiguration(true);
+LemurLogToolbarConfiguration.getDefaultServerConfiguration(true, true);
 
 var sanitizedSubstitution="##--##";
 
@@ -31,10 +31,12 @@
 function washAndRinse(inputString, isUrl) {
   if (isUrl==null) { isUrl=false; }
   var outputString=inputString;
-  if (isUrl) {
-    outputString = outputString.replace(/\+/g, "%20");
-    outputString=unescape(outputString);
-  }
+
+  // if (isUrl) {
+  //   outputString = outputString.replace(/\+/g, "%20");
+  //   outputString=unescape(outputString);
+  // }
+
   if (LemurLogToolbarConfiguration._allowBlacklistPersonal && LemurLogToolbarConfiguration._useBlacklistPersonal) {
     outputString=sanitizeString(outputString, LemurLogToolbarConfiguration._blacklistPersonalRegex);
   }
@@ -65,6 +67,16 @@
 ///////////////////////////////////////////////////////////////////////
 function lemurlog_IsSearchURL(url)
 {
+  // get the array of search engine prefixes from the configuration
+  var sePrefixArray=LemurLogToolbarConfiguration.getSearchEnginePrefixArray();
+  
+  for (var i=0; i < sePrefixArray.length; i++) {
+    if (url.indexOf(sePrefixArray[i]) === 0) {
+      return true;
+    }
+  }
+  
+  /*
   if (url.indexOf("http://www.google.com/search?") === 0
       ||url.indexOf("http://search.live.com/results.aspx?") === 0
       ||url.indexOf("http://search.msn.com/results.aspx?") === 0
@@ -72,6 +84,7 @@
 
       return true;
   }
+  */
   
   // check for desktop search?
   if (LemurLogToolbarConfiguration._useDesktopSearch==true) {
@@ -112,21 +125,24 @@
 ///////////////////////////////////////////////////////////////////////
 function lemurlog_SetButtons()
 {
-  var button = document.getElementById("LogTB-Pause-Button");
-  button.collapsed = (!lemurlog_g_enable);
-  button.disabled = (!lemurlog_g_enable);
+  try {
+    var button = document.getElementById("LogTB-Pause-Button");
+    button.collapsed = (!lemurlog_g_enable);
+    button.disabled = (!lemurlog_g_enable);
 
-  var button = document.getElementById("LogTB-Pause-Button-Gray");
-  button.collapsed = lemurlog_g_enable;
-  button.disabled = true;
+    button = document.getElementById("LogTB-Pause-Button-Gray");
+    button.collapsed = lemurlog_g_enable;
+    button.disabled = true;
 
-  button = document.getElementById("LogTB-Start-Button");
-  button.collapsed = lemurlog_g_enable;
-  button.disabled = lemurlog_g_enable;
+    button = document.getElementById("LogTB-Start-Button");
+    button.collapsed = lemurlog_g_enable;
+    button.disabled = lemurlog_g_enable;
 
-  button = document.getElementById("LogTB-Start-Button-Gray");
-  button.collapsed = (!lemurlog_g_enable);
-  button.disabled = true;
+    button = document.getElementById("LogTB-Start-Button-Gray");
+    button.collapsed = (!lemurlog_g_enable);
+    button.disabled = true;
+  } catch (ex) {
+  }
 }
 
 
@@ -200,7 +216,8 @@
 // also - if any blacklist term occurs in a known search query
 // remove the search results for that item
 ///////////////////////////////////////////////////////////////////////
-function lemurlog_scrubLogFiles() {
+function lemurlog_scrubLogFiles(progressMeter, progressLabel) {
+  if (progressMeter==null) { return; }
 
   // if we're locked - just return
   var lockfile = lemurlog_GetLogFile(lemurlog_LOCK_FILE);
@@ -233,6 +250,7 @@
   // Search <ID> <SIZE>
   
   var logfile = lemurlog_GetLogFile(lemurlog_LOG_FILE);
+  var logFileSize = lemurlog_GetLogFileSize(lemurlog_LOG_FILE);
   var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);  
   istream.init(logfile, 0x01, 0444, 0);
   istream.QueryInterface(Components.interfaces.nsILineInputStream);
@@ -244,11 +262,23 @@
   var currentWorkingLine="";
   var hasMore;
   
+  progressLabel.setAttribute("value", "Scrubbing activity log...");
+  
+  var charsRead=0;
   do {
     hasMore=istream.readLine(readingLine);
     if (readingLine.value!=null) {
       currentWorkingLine=readingLine.value;
       
+      // set our progress meter
+      charsRead+=currentWorkingLine.length;
+      if (logFileSize > 0) {
+        var pctSizeCurrent=Math.floor((charsRead / logFileSize)*100.0);
+        progressMeter.setAttribute("value", "" + pctSizeCurrent);
+      } else {
+        progressMeter.setAttribute("value", "100");
+      }
+      
       // split the current working line by tabs
       var stringSplit=currentWorkingLine.split(/\t/);
       if (stringSplit.length < 2) {
@@ -322,6 +352,9 @@
   foStream.close();
   istream.close();
   
+  // set the progress meter to 100%
+  progressMeter.setAttribute("value", "100");
+  
   // remove the old log and rename the new one
   lemurlog_RemoveLogFile(lemurlog_LOG_FILE);
   lemurlog_MoveLogFile(lemurlog_TEMP_LOG_FILE, lemurlog_LOG_FILE);
@@ -343,6 +376,11 @@
   pageinstream.init(pagefile, 0x01, 0444, 0);
   pageinstream.QueryInterface(Components.interfaces.nsILineInputStream);  
   
+  var pageFileSize = lemurlog_GetLogFileSize(lemurlog_PAGE_FILE);
+
+  progressLabel.setAttribute("value", "Scrubbing search page log...");
+  
+  charsRead=0;
   var skipThisOne=false;
   var lastLineWasHeader=false;
   do {
@@ -350,7 +388,15 @@
     if (readingLine.value!=null) {
       if (skipThisOne==false) {
         currentWorkingLine=readingLine.value;
-
+        
+        charsRead+=currentWorkingLine.length;
+        if (pageFileSize > 0) {
+          var pctSizeCurrent=Math.floor((charsRead / pageFileSize)*100.0);
+          progressMeter.setAttribute("value", "" + pctSizeCurrent);
+        } else {
+          progressMeter.setAttribute("value", "100");
+        }
+        
         if (lastLineWasHeader) {
           // should be our ID
           // ID=1194982335173
@@ -390,6 +436,7 @@
           hasMore=pageinstream.readLine(readingLine);
           if (readingLine.value!=null) {
             currentWorkingLine=readingLine.value;
+            charsRead+=currentWorkingLine.length;
             if (currentWorkingLine.indexOf("LOGTB_BEGIN_SEARCH_PAGE") >= 0) {
               lastLineWasHeader=true;
               break;
@@ -403,6 +450,9 @@
     } // end if (readingLine.value!=null)
   } while (hasMore); // end do
 
+  // set the progress meter to 100%
+  progressMeter.setAttribute("value", "100");
+
   // we're done - close out output / input
   pageoutStream.close();
   pageinstream.close();
@@ -539,9 +589,17 @@
   {
     return;
   }
+  
+  
   var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
   foStream.init(file, 0x02 | 0x08 | 0x10, 0600, 0);//append
-  foStream.write(text, text.length);
+  //foStream.write(text, text.length);
+  // must use a conversion stream here to properly handle multi-byte character encodings
+  var converterStream = Components.classes['@mozilla.org/intl/converter-output-stream;1'].createInstance(Components.interfaces.nsIConverterOutputStream);
+  var charset = 'utf-8';
+  converterStream.init(foStream, charset, text.length, Components.interfaces.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
+  converterStream.writeString(text);
+  converterStream.close();
   foStream.close();
 }
 
@@ -552,8 +610,8 @@
 {
   if (forUpload!=null && forUpload==true) {
     if (LemurLogToolbarConfiguration._allowRandomSessionId && LemurLogToolbarConfiguration._useRandomSessionId) {
-      var rand_no = Math.random();
-      return "" + (rand_no*100000.0);
+      var rand_no = Math.floor(Math.random()*10000000+1);
+      return "" + rand_no;
     }
   }
   // Get profile directory.

Modified: src/defaults/preferences/defaults.js
===================================================================
--- src/defaults/preferences/defaults.js	2009-10-09 09:09:37 UTC (rev 7)
+++ src/defaults/preferences/defaults.js	2009-10-09 09:20:45 UTC (rev 8)
@@ -1,22 +1,28 @@
-pref("extensions.lemurquerylog.server", "");
-pref("extensions.lemurquerylog.userandomsession", false);
+pref("extensions.qthlog.server", "");
+pref("extensions.qthlog.userandomsession", false);
+pref("extensions.qthlog.useautouploads", true);
+pref("extensions.qthlog.askwhenautouploads", false);
+pref("extensions.qthlog.nextautouploadtime", "0");
 
-pref("extensions.lemurquerylog.logdesktopsearch", true);
+pref("extensions.qthlog.logdesktopsearch", true);
 
-pref("extensions.lemurquerylog.usepersonalbl", true);
-pref("extensions.lemurquerylog.useaddressbl", true);
-pref("extensions.lemurquerylog.usepropernamebl", true);
-pref("extensions.lemurquerylog.usekeywordbl", true);
+pref("extensions.qthlog.usepersonalbl", true);
+pref("extensions.qthlog.useaddressbl", true);
+pref("extensions.qthlog.usepropernamebl", true);
+pref("extensions.qthlog.usekeywordbl", true);
 
-pref("extensions.lemurquerylog.encmodulus", "");
-pref("extensions.lemurquerylog.encexponent", "");
+pref("extensions.qthlog.encmodulus", "");
+pref("extensions.qthlog.encexponent", "");
 
-pref("extensions.lemurquerylog.bl.personal", "");
-pref("extensions.lemurquerylog.bl.address", "");
-pref("extensions.lemurquerylog.bl.propername", "");
-pref("extensions.lemurquerylog.bl.keyword", "");
+pref("extensions.qthlog.bl.personal", "");
+pref("extensions.qthlog.bl.address", "");
+pref("extensions.qthlog.bl.propername", "");
+pref("extensions.qthlog.bl.keyword", "");
 
-pref("extensions.lemurquerylog.bl.personalrx", "");
-pref("extensions.lemurquerylog.bl.addressrx", "");
-pref("extensions.lemurquerylog.bl.propernamerx", "");
-pref("extensions.lemurquerylog.bl.keywordrx", "");
+pref("extensions.qthlog.bl.personalrx", "");
+pref("extensions.qthlog.bl.addressrx", "");
+pref("extensions.qthlog.bl.propernamerx", "");
+pref("extensions.qthlog.bl.keywordrx", "");
+
+pref("extensions.qthlog.searchengines", "http://www.google.com/search?\nhttp://search.live.com/results.aspx?\nhttp://search.msn.com/results.aspx?\nhttp://search.yahoo.com/search?\n");
+

Modified: src/install.rdf
===================================================================
--- src/install.rdf	2009-10-09 09:09:37 UTC (rev 7)
+++ src/install.rdf	2009-10-09 09:20:45 UTC (rev 8)
@@ -2,12 +2,6 @@
 <RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
          xmlns:NC="http://home.netscape.com/NC-rdf#"
          xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-  <RDF:Description RDF:about="rdf:#$nmAoG"
-                   em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
-                   em:maxVersion="3.*"
-                   em:minVersion="3.0" />
-  <RDF:Description RDF:about="urn:mozilla:extension:file:qth_toolbar.jar"
-                   em:package="content/" />
   <RDF:Description RDF:about="urn:mozilla:install-manifest"
                    em:creator="KYA group Corporation"
                    em:homepageURL="http://www.kyagroup.com/"
@@ -15,9 +9,15 @@
                    em:name="QT Honey Toolbar"
                    em:updateURL="http://www.kyagroup.com/qth_toolbar/update.rdf"
                    em:updateKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCa918ixPNbxR6b3vXcNGwrNqWtwr8MhxFbbJDOzq+NswRaoZoUWSKd0yrZOs8ZatfuclcwQLQOW95UG0y7Mi6nHz1O396KU7NGfARUXR2NgnR0mMjNFZ/wLJ+k9ej2oCuwUpFDgimM8LSEgE1quXBC2jcLrpFDbk1lOC/1xU3n0wIDAQAB"
-                   em:version="1.5.5"
+                   em:version="2.0.1"
                    em:description="A toolbar logging user behavior">
     <em:file RDF:resource="urn:mozilla:extension:file:qth_toolbar.jar"/>
     <em:targetApplication RDF:resource="rdf:#$nmAoG"/>
   </RDF:Description>
+  <RDF:Description RDF:about="urn:mozilla:extension:file:qth_toolbar.jar"
+                   em:package="content/" />
+  <RDF:Description RDF:about="rdf:#$nmAoG"
+                   em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
+                   em:maxVersion="3.*"
+                   em:minVersion="3.0" />
 </RDF:RDF>




Cres-cvs メーリングリストの案内
Back to archive index