home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / mozil06.zip / bin / chrome / toolkit.jar / content / global / console.js < prev    next >
Text File  |  2001-02-14  |  9KB  |  290 lines

  1. /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  *
  13.  * The Original Code is mozilla.org code.
  14.  *
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are
  17.  * Copyright (C) 1998 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Contributor(s): 
  21.  */
  22.  
  23.  var bundle;
  24.  
  25. /*
  26.  * Functions for initializing and updating the JavaScript Console.
  27.  */
  28.  
  29. /*
  30.  * Listener to be registered with the console service, called on new errors.
  31.  */
  32. var consoleListener = {
  33.     observe : function(messageObject) {
  34.         appendMessage(messageObject);
  35.     }
  36. }
  37.  
  38. /*
  39.  * Keeps the number of errors to prevent leak
  40.  */
  41. var num_errors=0;
  42.  
  43. /*
  44.  * Gets the current context of the console service and dumps it to the window,
  45.  * and registers a listener with the service to be called on additional errors.
  46.  */
  47. function onLoadJSConsole() 
  48. {
  49.     try {
  50.         var cs_class = Components.classes['@mozilla.org/consoleservice;1'];
  51.         var cs_iface = Components.interfaces.nsIConsoleService;
  52.         var cs_isupports = cs_class.getService();
  53.         var cs = cs_isupports.QueryInterface(cs_iface);
  54.     } catch(exn) {
  55.         // Couldn't get the console service for some reason...
  56.         // pretend it never happened.
  57.  
  58.         appendMessage({ message:
  59.                         "Unable to display errors - " +
  60.                         "couldn't get Console Service component. " +
  61.                         "(Missing @mozilla.org/consoleservice;1)" });
  62.         return;
  63.     }
  64.  
  65.     var o1 = {}; // Throwaway references to support 'out' parameters.
  66.     var o2 = {};
  67.  
  68.     var messages;
  69.     cs.getMessageArray(o1, o2);
  70.     messages = o1.value;
  71.  
  72.     // In case getMessageArray returns 0-length array as null.
  73.     if (messages == null)
  74.         messages = [];
  75.  
  76.     var i;
  77.     var cleared=0;
  78.  
  79.     //Checks if console ever been cleared
  80.     for (i = messages.length-1; i >=0 ; i--) { 
  81.            if (messages[i].message == "__CLEAR__") {
  82.             cleared = i + 1;
  83.             break;
  84.         }
  85.     }
  86.  
  87.     //Populates tree with error messages after latest "clear"
  88.     for(i = cleared; i < messages.length; i++) {
  89.         appendMessage(messages[i]);
  90.     }
  91.  
  92.     cs.registerListener(consoleListener);
  93.  
  94.     bundle = srGetStrBundle("chrome://global/locale/console.properties");
  95.     
  96.     return true;
  97. }
  98.  
  99. function onUnloadJSConsole()
  100. {
  101.     // keep a global ref. to it instead???
  102.  
  103.     try {
  104.         var cs_class = Components.classes['@mozilla.org/consoleservice;1'];
  105.         var cs_iface = Components.interfaces.nsIConsoleService;
  106.         var cs_isupports = cs_class.getService();
  107.         var cs = cs_isupports.QueryInterface(cs_iface);
  108.     } catch(exn) {
  109.         // Couldn't get the console service for some reason...
  110.         // pretend it never happened.
  111.         return;
  112.     }
  113.  
  114.     cs.unregisterListener(consoleListener);
  115.  
  116.     return true;
  117. }
  118.  
  119. gErrorCount = 0;
  120. gWarningCount = 0;
  121.  
  122. /*
  123.  * Given a message, write it to the page.
  124.  *
  125.  * TODO: (When interesting subclasses of message objects become available) -
  126.  * reflect structure of messages (e.g. lineno, etc.) as CSS-decorable structure.
  127.  */
  128. function appendMessage(messageObject)
  129. {
  130.  
  131.     if(messageObject.message == "__CLEAR__") {return;}
  132.     var c = document.getElementById("consoleTreeChildren");
  133.     var item = document.createElement("treeitem");
  134.     var row = document.createElement("treerow");
  135.     var cell = document.createElement("treecell");
  136.     cell.setAttribute("class", "treecell-error");
  137.     var msgContent;
  138.     var text;
  139.     try {
  140.         // Try to QI it to a script error to get more info.
  141.         var nsIScriptError = Components.interfaces.nsIScriptError;
  142.         var scriptError =
  143.             messageObject.QueryInterface(nsIScriptError);
  144.  
  145.         // Is this error actually just a non-fatal warning?
  146.         var warning = scriptError.flags & nsIScriptError.warningFlag != 0;
  147.  
  148.         // Is this error or warning a result of JavaScript's strict mode,
  149.         // and therefore something we might decide to be lenient about?
  150.         var strict = scriptError.flags & nsIScriptError.strictFlag != 0;
  151.  
  152.         // If true, this error led to the creation of a (catchable!) javascript
  153.         // exception, and should probably be ignored.
  154.         // This is worth checking, as I'm not sure how the behavior falls
  155.         // out.  Does an uncaught exception result in this flag being raised?
  156.         var isexn = scriptError.flags & nsIScriptError.exceptionFlag != 0;
  157.  
  158.         /*
  159.          * It'd be nice to do something graphical with our column information,
  160.          * like what the old js console did, and the js shell does:
  161.          * js> var scooby = "I am an unterminated string!
  162.          * 1: unterminated string literal:
  163.          * 1: var scooby = "I am an unterminated string!
  164.          * 1: .............^
  165.          *
  166.          * But for now, I'm just pushing it out the door.
  167.          */
  168.          
  169.         cell.setAttribute("type", warning ? "warning" : "error");
  170.         // XXX localize
  171.         cell.setAttribute("typetext", warning ? "Warning: " : "Error: ");
  172.         cell.setAttribute("url", scriptError.sourceName);
  173.         cell.setAttribute("line", scriptError.lineNumber);
  174.         cell.setAttribute("col", scriptError.columnNumber);
  175.         cell.setAttribute("msg", scriptError.message);
  176.         cell.setAttribute("error", scriptError.sourceLine);
  177.         
  178.     } catch (exn) {
  179. //          dump(exn + '\n');
  180.         // QI failed, just try to treat it as an nsIConsoleMessage
  181.         cell.setAttribute("msg", messageObject.message);
  182.     }
  183.     row.appendChild(cell);
  184.     item.appendChild(row);
  185.     c.appendChild(item);
  186.  
  187.     /*
  188.     var warningBroadcaster = document.getElementById("Console:ShowWarnings");
  189.     var errorBroadcaster = document.getElementById("Console:ShowErrors");
  190.     var allBroadcaster = document.getElementById("Console:ShowAll");
  191.     if (warning) gWarningCount++;
  192.     else gErrorCount++;
  193.  
  194.     warningBroadcaster.setAttribute("value", 
  195.                                     (bundle.GetStringFromName("warningsLabel") + " (" + gWarningCount + ")"));
  196.     errorBroadcaster.setAttribute("value", 
  197.                                   (bundle.GetStringFromName("errorsLabel") + " (" + gErrorCount + ")"));
  198.     allBroadcaster.setAttribute("value", 
  199.                                 (bundle.GetStringFromName("allMsgsLabel") + " (" + (gErrorCount + gWarningCount) + ")"));
  200.     */  
  201.  
  202.     num_errors++;
  203.  
  204.     //Deletes top error if error console is long
  205.     if(num_errors>250) { deleteOne(); }
  206.  
  207. }
  208.  
  209. function changeMode (aMode, aElement)
  210. {
  211.   var broadcaster = document.getElementById(aElement.getAttribute("observes"));
  212.   var bcset = document.getElementById("broadcasterset");
  213.   var tree = document.getElementById("console");
  214.   switch (aMode) {
  215.       case "clear":
  216.       clear();
  217.       return;
  218.     case "errors":
  219.       tree.setAttribute("mode", "errors");
  220.       break;
  221.     case "warnings":
  222.       tree.setAttribute("mode", "warnings");
  223.       break;
  224.     default:
  225.     case "all":
  226.       tree.removeAttribute("mode");
  227.       break;
  228.   }
  229.  
  230.   for (var i = 0; i < bcset.childNodes.length; i++) {
  231.     bcset.childNodes[i].removeAttribute("toggled");
  232.     bcset.childNodes[i].removeAttribute("checked");
  233.   }
  234.   broadcaster.setAttribute("toggled", "true");
  235.   broadcaster.setAttribute("checked", "true");
  236. }
  237.  
  238. /*
  239.  * If clear selected, __CLEAR__ message is logged to service and window cleared
  240.  * When console next run, will only list messages after the latest"__CLEAR__"
  241.  * message.
  242.  */
  243. function clear () 
  244. {
  245.  
  246.     try {
  247.         var cs_class = Components.classes['@mozilla.org/consoleservice;1'];
  248.         var cs_iface = Components.interfaces.nsIConsoleService;
  249.         var cs_isupports = cs_class.getService();
  250.         var cs = cs_isupports.QueryInterface(cs_iface);
  251.     } catch(exn) {
  252.         // Couldn't get the console service for some reason...
  253.         // pretend it never happened.
  254.         return;
  255.     }
  256.  
  257.     cs.logStringMessage("__CLEAR__");
  258.  
  259.     var tree = document.getElementById("console");
  260.     var treeChildren = document.getElementById("consoleTreeChildren");
  261.  
  262.     tree.removeChild(treeChildren);
  263.  
  264.     treeChildren = document.createElement ("treechildren");
  265.     treeChildren.setAttribute ("id", "consoleTreeChildren");
  266.     treeChildren.setAttribute ("flex", "1");
  267.     tree.appendChild(treeChildren);
  268.  
  269.   
  270.     num_errors=0;
  271.     return true;
  272.     
  273. }
  274.  
  275. /*
  276.  * Used to help prevent too much memory allocation by JS console
  277.  * Deletes the top-most node
  278.  */
  279. function deleteOne () 
  280. {
  281.  
  282.     var tree = document.getElementById("consoleTreeChildren");
  283.  
  284.     var node = tree.firstChild;
  285.     tree.removeChild(node);
  286.     num_errors--;
  287.     return true;
  288.     
  289. }
  290.