home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2005 October / DPPCPRO1005.ISO / Download / Web Developer / webdeveloper.xpi / chrome / webdeveloper.jar / content / webdeveloper / information.js < prev    next >
Encoding:
JavaScript  |  2005-03-21  |  39.9 KB  |  913 lines

  1. // Filter for display access key tree walker
  2. function webdeveloper_accessKeyFilter(node)
  3. {
  4.     // If the node has an accesskey attribute
  5.     if(node.hasAttribute("accesskey"))
  6.     {
  7.         return NodeFilter.FILTER_ACCEPT;
  8.     }
  9.     else
  10.     {
  11.         return NodeFilter.FILTER_SKIP;
  12.     }
  13. }
  14.  
  15. // Filter for display anchors tree walker
  16. function webdeveloper_anchorFilter(node)
  17. {
  18.     // If the node has an id attribute or is an a tag with a name attribute
  19.     if(node.hasAttribute("id") || (node.nodeName && node.nodeName.toLowerCase() == "a" && node.hasAttribute("name")))
  20.     {
  21.         return NodeFilter.FILTER_ACCEPT;
  22.     }
  23.     else
  24.     {
  25.         return NodeFilter.FILTER_SKIP;
  26.     }
  27. }
  28.  
  29. // Displays all access keys
  30. function webdeveloper_displayAccessKeys(element, applyStyle)
  31. {
  32.     const mainTabBox   = getBrowser().mTabBox;
  33.     const documentList = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  34.  
  35.     var accessKeyElement     = null;
  36.     var accessKeyElementList = null;
  37.     var pageDocument         = null;
  38.     var spanElement          = null;
  39.     var spanElementList      = null;
  40.  
  41.     // Loop through the documents
  42.     for(var i = 0; i < documentList.length; i++)
  43.     {
  44.         pageDocument     = documentList[i];
  45.         spanElementList  = pageDocument.getElementsByTagName("span");
  46.  
  47.         // Loop through all the span tags
  48.         for(var j = 0; j < spanElementList.length; j++)
  49.         {
  50.             spanElement = spanElementList[j];
  51.  
  52.             // If the class exists and is set to webdeveloper-access-key-span
  53.             if(spanElement.hasAttribute("class") && spanElement.getAttribute("class") == "webdeveloper-access-key-span")
  54.             {
  55.                 spanElement.parentNode.removeChild(spanElement);
  56.                 j--;
  57.             }
  58.         }
  59.  
  60.         // If the element is checked
  61.         if(element.getAttribute("checked"))
  62.         {
  63.             const treeWalker = pageDocument.createTreeWalker(pageDocument.body, NodeFilter.SHOW_ELEMENT, webdeveloper_accessKeyFilter, false);
  64.  
  65.             accessKeyElementList = new Array();
  66.  
  67.             // Loop through the access key elements
  68.             while((accessKeyElement = treeWalker.nextNode()) != null)
  69.             {
  70.                 accessKeyElementList.push(accessKeyElement);
  71.             }
  72.  
  73.             // Loop through all the access key elements
  74.             for(j = 0; j < accessKeyElementList.length; j++)
  75.             {
  76.                 accessKeyElement = accessKeyElementList[j];
  77.                 spanElement      = pageDocument.createElement("span");
  78.  
  79.                 spanElement.setAttribute("class", "webdeveloper-access-key-span");
  80.                 spanElement.appendChild(pageDocument.createTextNode("Accesskey=" + accessKeyElement.getAttribute("accesskey")));
  81.                 accessKeyElement.parentNode.insertBefore(spanElement, accessKeyElement);
  82.             }
  83.         }
  84.     }
  85.  
  86.     webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/display_access_keys.css", "webdeveloper-display-access-keys", applyStyle);
  87.     webdeveloper_toggleFeatureTooltipStyles(element, "webdeveloper-display-access-keys-tooltips", ".webdeveloper-access-key-span");
  88. }
  89.  
  90. // Displays all anchors
  91. function webdeveloper_displayAnchors(element, applyStyle)
  92. {
  93.     const mainTabBox   = getBrowser().mTabBox;
  94.     const documentList = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  95.  
  96.     var anchorElement     = null;
  97.     var anchorElementList = null;
  98.     var anchorText        = null;
  99.     var pageDocument      = null;
  100.     var spanElement       = null;
  101.     var spanElementList   = null;
  102.  
  103.     // Loop through the documents
  104.     for(var i = 0; i < documentList.length; i++)
  105.     {
  106.         pageDocument     = documentList[i];
  107.         spanElementList  = pageDocument.getElementsByTagName("span");
  108.  
  109.         // Loop through all the span tags
  110.         for(var j = 0; j < spanElementList.length; j++)
  111.         {
  112.             spanElement = spanElementList[j];
  113.  
  114.             // If the class exists and is set to webdeveloper-anchor-span
  115.             if(spanElement.hasAttribute("class") && spanElement.getAttribute("class") == "webdeveloper-anchor-span")
  116.             {
  117.                 spanElement.parentNode.removeChild(spanElement);
  118.                 j--;
  119.             }
  120.         }
  121.  
  122.         // If the element is checked
  123.         if(element.getAttribute("checked"))
  124.         {
  125.             const treeWalker = pageDocument.createTreeWalker(pageDocument.body, NodeFilter.SHOW_ELEMENT, webdeveloper_anchorFilter, false);
  126.  
  127.             anchorElementList = new Array();
  128.  
  129.             // Loop through the anchor elements
  130.             while((anchorElement = treeWalker.nextNode()) != null)
  131.             {
  132.                 anchorElementList.push(anchorElement);
  133.             }
  134.  
  135.             // Loop through all the anchor elements
  136.             for(j = 0; j < anchorElementList.length; j++)
  137.             {
  138.                 anchorElement = anchorElementList[j];
  139.                 spanElement   = pageDocument.createElement("span");
  140.  
  141.                 // If the anchor element has an id attribute
  142.                 if(anchorElement.hasAttribute("id"))
  143.                 {
  144.                     anchorText = "#" + anchorElement.getAttribute("id");
  145.                 }
  146.                 else if(anchorElement.hasAttribute("name"))
  147.                 {
  148.                     anchorText = "#" + anchorElement.getAttribute("name");
  149.                 }
  150.  
  151.                 spanElement.setAttribute("class", "webdeveloper-anchor-span");
  152.                 spanElement.appendChild(pageDocument.createTextNode(anchorText));
  153.                 anchorElement.parentNode.insertBefore(spanElement, anchorElement);
  154.             }
  155.         }
  156.     }
  157.  
  158.     webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/display_anchors.css", "webdeveloper-display-anchors", applyStyle);
  159.     webdeveloper_toggleFeatureTooltipStyles(element, "webdeveloper-display-anchors-tooltips", ".webdeveloper-anchor-span");
  160. }
  161.  
  162. // Displays all block sizes
  163. function webdeveloper_displayBlockSize(element, applyStyle)
  164. {
  165.     const display      = element.getAttribute("checked");
  166.     const mainTabBox   = getBrowser().mTabBox;
  167.     const documentList = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  168.  
  169.     var pageDocument = null;
  170.  
  171.     // Loop through the documents
  172.     for(var i = 0; i < documentList.length; i++)
  173.     {
  174.         var blockSizeElement     = null;
  175.         var blockSizeElementList = null;
  176.  
  177.         pageDocument = documentList[i];
  178.  
  179.         // If displaying
  180.         if(display)
  181.         {
  182.             const blockSizeElementTypes = new Array("div", "form", "table");
  183.  
  184.             var blockSize         = null;
  185.             var height            = null;
  186.             var left              = null;
  187.             var top               = null;
  188.             var width             = null;
  189.  
  190.             // Loop through the block size elements
  191.             for(var j = 0; j < blockSizeElementTypes.length; j++)
  192.             {
  193.                 blockSizeElementList = pageDocument.getElementsByTagName(blockSizeElementTypes[j]);
  194.  
  195.                 // Loop through the block size elements
  196.                 for(var k = 0; k < blockSizeElementList.length; k++)
  197.                 {
  198.                     blockSize        = pageDocument.createElement("span");
  199.                     blockSizeElement = blockSizeElementList[k];
  200.                     height           = blockSizeElement.offsetHeight;
  201.                     left             = blockSizeElement.offsetLeft;
  202.                     top              = blockSizeElement.offsetTop;
  203.                     width            = blockSizeElement.offsetWidth;
  204.  
  205.                     blockSize.appendChild(pageDocument.createTextNode(width + "x" + height));
  206.                     blockSize.setAttribute("class", "webdeveloper-block-size");
  207.                     blockSize.style.left = left + "px";
  208.                     blockSize.style.position = "absolute";
  209.                     blockSize.style.top = top + "px";
  210.  
  211.                     blockSizeElement.appendChild(blockSize);
  212.                 }
  213.             }
  214.         }
  215.         else
  216.         {
  217.             const treeWalker = pageDocument.createTreeWalker(pageDocument.body, NodeFilter.SHOW_ELEMENT, webdeveloper_displayBlockSizeFilter, false);
  218.  
  219.             blockSizeElementList = new Array();
  220.  
  221.             // Loop through the block size elements
  222.             while((blockSizeElement = treeWalker.nextNode()) != null)
  223.             {
  224.                 blockSizeElementList.push(blockSizeElement);
  225.             }
  226.  
  227.             // Loop through the block size elements
  228.             for(j = 0; j < blockSizeElementList.length; j++)
  229.             {
  230.                 blockSizeElement = blockSizeElementList[j];
  231.                 blockSizeElement.parentNode.removeChild(blockSizeElement);
  232.             }
  233.         }
  234.     }
  235.  
  236.     webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/display_block_size.css", "webdeveloper-display-block-size", applyStyle);
  237.     webdeveloper_toggleFeatureTooltipStyles(element, "webdeveloper-display-block-size-tooltips", ".webdeveloper-block-size");
  238. }
  239.  
  240. // Filter for display block size tree walker
  241. function webdeveloper_displayBlockSizeFilter(node)
  242. {
  243.     // If the class of the node is webdeveloper block size
  244.     if(node.getAttribute("class") == "webdeveloper-block-size")
  245.     {
  246.         return NodeFilter.FILTER_ACCEPT;
  247.     }
  248.     else
  249.     {
  250.         return NodeFilter.FILTER_SKIP;
  251.     }
  252. }
  253.  
  254. // Displays ID and class details for the page
  255. function webdeveloper_displayIDClassDetails(element, applyStyle)
  256. {
  257.     // If the menu is checked
  258.     if(element.getAttribute("checked"))
  259.     {
  260.         const mainTabBox         = getBrowser().mTabBox;
  261.         const documentList       = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  262.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  263.  
  264.         var headElementList = null;
  265.         var pageDocument    = null;
  266.         var styleElement    = null;
  267.  
  268.         // Loop through the documents
  269.         for(var i = 0; i < documentList.length; i++)
  270.         {
  271.             pageDocument    = documentList[i];
  272.             headElementList = pageDocument.getElementsByTagName("head");
  273.             styleElement    = pageDocument.createElement("style");
  274.  
  275.             styleElement.setAttribute("id", "webdeveloper-display-id-class-details");
  276.             styleElement.setAttribute("type", "text/css");
  277.  
  278.             // If the class colors are set
  279.             if(preferencesService.prefHasUserValue("webdeveloper.color.class.background") && preferencesService.prefHasUserValue("webdeveloper.color.class.text"))
  280.             {
  281.                 styleElement.appendChild(pageDocument.createTextNode("*[class]:before { background-color: " + preferencesService.getComplexValue("webdeveloper.color.class.background", Components.interfaces.nsISupportsString).data.trim() + " !important; color: " + preferencesService.getComplexValue("webdeveloper.color.class.text", Components.interfaces.nsISupportsString).data.trim() + ' !important; content: "Class=" attr(class) !important; }'));
  282.             }
  283.  
  284.             // If the ID colors are set
  285.             if(preferencesService.prefHasUserValue("webdeveloper.color.id.background") && preferencesService.prefHasUserValue("webdeveloper.color.id.text"))
  286.             {
  287.                 styleElement.appendChild(pageDocument.createTextNode("*[id]:before { background-color: " + preferencesService.getComplexValue("webdeveloper.color.id.background", Components.interfaces.nsISupportsString).data.trim() + " !important; color: " + preferencesService.getComplexValue("webdeveloper.color.id.text", Components.interfaces.nsISupportsString).data.trim() + ' !important; content: "Id=" attr(id) !important; }'));
  288.             }
  289.  
  290.             // If the ID and class colors are set
  291.             if(preferencesService.prefHasUserValue("webdeveloper.color.id.class.background") && preferencesService.prefHasUserValue("webdeveloper.color.id.class.text"))
  292.             {
  293.                 styleElement.appendChild(pageDocument.createTextNode("*[id][class]:before { background-color: " + preferencesService.getComplexValue("webdeveloper.color.id.class.background", Components.interfaces.nsISupportsString).data.trim() + " !important; color: " + preferencesService.getComplexValue("webdeveloper.color.id.class.text", Components.interfaces.nsISupportsString).data.trim() + ' !important; content: "Id=" attr(id) ", Class=" attr(class) !important; }'));
  294.             }
  295.  
  296.             // If there is a head element
  297.             if(headElementList.length > 0)
  298.             {
  299.                 headElementList[0].appendChild(styleElement);
  300.             }
  301.             else
  302.             {
  303.                 pageDocument.documentElement.appendChild(styleElement);
  304.             }
  305.         }
  306.  
  307.         // If applying styles
  308.         if(applyStyle)
  309.         {
  310.             webdeveloper_addAppliedStyle("webdeveloper-display-id-class-details");
  311.         }
  312.     }
  313.     else
  314.     {
  315.         webdeveloper_removeStyleSheet("webdeveloper-display-id-class-details", true);
  316.     }
  317.  
  318.     webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/imports/before.css", "webdeveloper-display-id-class-details-before", applyStyle);
  319.     webdeveloper_toggleFeatureTooltipStyles(element, "webdeveloper-display-id-class-details-tooltips", "*:before");
  320. }
  321.  
  322. // Displays all link paths
  323. function webdeveloper_displayLinkPaths(element, applyStyle)
  324. {
  325.     webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/display_link_paths.css", "webdeveloper-display-link-paths", applyStyle);
  326.     webdeveloper_toggleFeatureTooltipStyles(element, "webdeveloper-display-link-paths-tooltips", "*:before");
  327. }
  328.  
  329. // Displays all tab indices
  330. function webdeveloper_displayTabIndex(element, applyStyle)
  331. {
  332.     const mainTabBox   = getBrowser().mTabBox;
  333.     const documentList = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  334.  
  335.     var pageDocument        = null;
  336.     var spanElement         = null;
  337.     var spanElementList     = null;
  338.     var tabIndexElement     = null;
  339.     var tabIndexElementList = null;
  340.  
  341.     // Loop through the documents
  342.     for(var i = 0; i < documentList.length; i++)
  343.     {
  344.         pageDocument     = documentList[i];
  345.         spanElementList  = pageDocument.getElementsByTagName("span");
  346.  
  347.         // Loop through all the span tags
  348.         for(var j = 0; j < spanElementList.length; j++)
  349.         {
  350.             spanElement = spanElementList[j];
  351.  
  352.             // If the class exists and is set to webdeveloper-tab-index-span
  353.             if(spanElement.hasAttribute("class") && spanElement.getAttribute("class") == "webdeveloper-tab-index-span")
  354.             {
  355.                 spanElement.parentNode.removeChild(spanElement);
  356.                 j--;
  357.             }
  358.         }
  359.  
  360.         // If the element is checked
  361.         if(element.getAttribute("checked"))
  362.         {
  363.             const treeWalker = pageDocument.createTreeWalker(pageDocument.body, NodeFilter.SHOW_ELEMENT, webdeveloper_tabIndexFilter, false);
  364.  
  365.             tabIndexElementList = new Array();
  366.  
  367.             // Loop through the tab index elements
  368.             while((tabIndexElement = treeWalker.nextNode()) != null)
  369.             {
  370.                 tabIndexElementList.push(tabIndexElement);
  371.             }
  372.  
  373.             // Loop through all the tab index elements
  374.             for(j = 0; j < tabIndexElementList.length; j++)
  375.             {
  376.                 tabIndexElement = tabIndexElementList[j];
  377.  
  378.                 spanElement = pageDocument.createElement("span");
  379.  
  380.                 spanElement.setAttribute("class", "webdeveloper-tab-index-span");
  381.                 spanElement.appendChild(document.createTextNode("Tabindex=" + tabIndexElement.getAttribute("tabindex")));
  382.                 tabIndexElement.parentNode.insertBefore(spanElement, tabIndexElement);
  383.             }
  384.         }
  385.     }
  386.  
  387.     webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/display_tab_index.css", "webdeveloper-display-tab-index", applyStyle);
  388.     webdeveloper_toggleFeatureTooltipStyles(element, "webdeveloper-display-tab-index-tooltips", ".webdeveloper-tab-index-span");
  389. }
  390.  
  391. // Displays the topographic information for all elements
  392. function webdeveloper_displayTopographicInformation(element, applyStyle)
  393. {
  394.     webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/display_topographic_information.css", "webdeveloper-display-topographic-information", applyStyle);
  395. }
  396.  
  397. // Sorts two links
  398. function webdeveloper_sortLinks(linkOne, linkTwo)
  399. {
  400.     const linkOneHref = linkOne.href;
  401.     const linkTwoHref = linkTwo.href;
  402.  
  403.     var sortValue = 1;
  404.  
  405.     // If the links are equal
  406.     if(linkOneHref == linkTwoHref)
  407.     {
  408.         sortValue = 0;
  409.     }
  410.     else if(linkOneHref < linkTwoHref)
  411.     {
  412.         sortValue = -1;
  413.     }
  414.  
  415.     return sortValue;
  416. }
  417.  
  418. // Filter for display tab index tree walker
  419. function webdeveloper_tabIndexFilter(node)
  420. {
  421.     // If the node has an tabindex attribute
  422.     if(node.hasAttribute("tabindex"))
  423.     {
  424.         return NodeFilter.FILTER_ACCEPT;
  425.     }
  426.     else
  427.     {
  428.         return NodeFilter.FILTER_SKIP;
  429.     }
  430. }
  431.  
  432. // Tidies a list of links by removing duplicates and sorting
  433. function webdeveloper_tidyLinks(linkList)
  434. {
  435.     var link              = null;
  436.     var newLinkList       = new Array();
  437.     var newLinkListLength = new Array();
  438.     var tidiedLinkList    = new Array();
  439.  
  440.     // Loop through the links
  441.     for(var i = 0; i < linkList.length; i++)
  442.     {
  443.         link = linkList[i];
  444.  
  445.         // If this link is set
  446.         if(link.href)
  447.         {
  448.             newLinkList.push(link);
  449.         }
  450.     }
  451.  
  452.     newLinkList.sort(webdeveloper_sortLinks);
  453.     newLinkListLength = newLinkList.length;
  454.  
  455.     // Loop through the links
  456.     for(i = 0; i < newLinkListLength; i++)
  457.     {
  458.         link = newLinkList[i];
  459.  
  460.         // If this is not the last link and the link is the same as the next link
  461.         if(i + 1 < newLinkListLength && link.href == newLinkList[i + 1].href)
  462.         {
  463.             continue;
  464.         }
  465.  
  466.         tidiedLinkList.push(link);
  467.     }
  468.  
  469.     return tidiedLinkList;
  470. }
  471.  
  472. // Displays all the cookies for the page
  473. function webdeveloper_viewCookieInformation()
  474. {
  475.     const dateService        = Components.classes["@mozilla.org/intl/scriptabledateformat;1"].getService(Components.interfaces.nsIScriptableDateFormat);
  476.     const mainTabBox         = getBrowser().mTabBox;
  477.     const documentList       = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  478.     const oldTab             = getBrowser().selectedTab;
  479.     const oldURL             = getBrowser().currentURI.spec;
  480.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  481.     const request            = new XMLHttpRequest();
  482.     const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  483.     const title              = stringBundle.getFormattedString("webdeveloper_viewCookieInformationTitle", [oldURL]);
  484.  
  485.     var cellDataElement   = null;
  486.     var cellHeaderElement = null;
  487.     var cookie            = null;
  488.     var cookieExpires     = null;
  489.     var cookieHost        = null;
  490.     var cookieLength      = null;
  491.     var cookieSecure      = null;
  492.     var cookies           = null;
  493.     var date              = null;
  494.     var generatedPage     = null;
  495.     var headerElement     = null;
  496.     var linkElement       = null;
  497.     var pageDocument      = null;
  498.     var pElement          = null;
  499.     var preElement        = null;
  500.     var tableElement      = null;
  501.     var tableRowElement   = null;
  502.  
  503.     generatedPage = webdeveloper_generatePage("");
  504.  
  505.     // This must be done to make generated content render
  506.     request.open("get", "about:blank", false);
  507.     request.send("");
  508.  
  509.     generatedPage.content.document.title = title;
  510.  
  511.     linkElement = generatedPage.content.document.createElement("link");
  512.     linkElement.setAttribute("href", "chrome://webdeveloper/content/stylesheets/generated_content.css");
  513.     linkElement.setAttribute("media", "all");
  514.     linkElement.setAttribute("rel", "stylesheet");
  515.     linkElement.setAttribute("type", "text/css");
  516.     generatedPage.content.document.getElementsByTagName("head")[0].appendChild(linkElement);
  517.  
  518.     headerElement = generatedPage.content.document.createElement("h1");
  519.     headerElement.appendChild(generatedPage.content.document.createTextNode(title));
  520.     generatedPage.content.document.body.appendChild(headerElement);
  521.  
  522.     // Loop through the documents
  523.     for(var i = 0; i < documentList.length; i++)
  524.     {
  525.         pageDocument = documentList[i];
  526.         cookies      = webdeveloper_getCookies(pageDocument.location.hostname, true);
  527.         cookieLength = cookies.length;
  528.  
  529.         headerElement = generatedPage.content.document.createElement("h2");
  530.         linkElement   = generatedPage.content.document.createElement("a");
  531.         linkElement.setAttribute("href", pageDocument.documentURI);
  532.         linkElement.appendChild(generatedPage.content.document.createTextNode(pageDocument.documentURI));
  533.         headerElement.appendChild(linkElement);
  534.         generatedPage.content.document.body.appendChild(headerElement);
  535.  
  536.         // If there are no cookies
  537.         if(cookieLength == 0)
  538.         {
  539.             pElement = generatedPage.content.document.createElement("p");
  540.             pElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_noCookies")));
  541.             generatedPage.content.document.body.appendChild(pElement);
  542.         }
  543.         else
  544.         {
  545.             // Loop through the cookies
  546.             for(var j = 0; j < cookieLength; j++)
  547.             {
  548.                 cookie       = cookies[j];
  549.                 cookieHost   = cookie.host;
  550.                 cookieSecure = cookie.isSecure;
  551.                 tableElement = generatedPage.content.document.createElement("table");
  552.  
  553.                 //  Cookie name
  554.                 cellDataElement   = generatedPage.content.document.createElement("td");
  555.                 cellHeaderElement = generatedPage.content.document.createElement("th");
  556.                 tableRowElement   = generatedPage.content.document.createElement("tr");
  557.  
  558.                 cellHeaderElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_viewCookieInformationName")));
  559.                 tableRowElement.appendChild(cellHeaderElement);
  560.                 cellDataElement.appendChild(generatedPage.content.document.createTextNode(cookie.name));
  561.                 tableRowElement.appendChild(cellDataElement);
  562.                 tableElement.appendChild(tableRowElement);
  563.  
  564.                 //  Cookie value
  565.                 cellDataElement   = generatedPage.content.document.createElement("td");
  566.                 cellHeaderElement = generatedPage.content.document.createElement("th");
  567.                 tableRowElement   = generatedPage.content.document.createElement("tr");
  568.  
  569.                 tableRowElement.setAttribute("class", "odd");
  570.                 cellHeaderElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_viewCookieInformationValue")));
  571.                 tableRowElement.appendChild(cellHeaderElement);
  572.                 cellDataElement.appendChild(generatedPage.content.document.createTextNode(cookie.value));
  573.                 tableRowElement.appendChild(cellDataElement);
  574.                 tableElement.appendChild(tableRowElement);
  575.  
  576.                 // If the cookie host starts with '.'
  577.                 if(cookieHost.charAt(0) == ".")
  578.                 {
  579.                     cookieHost = cookieHost.substring(1);
  580.                 }
  581.  
  582.                 //  Cookie host
  583.                 cellDataElement   = generatedPage.content.document.createElement("td");
  584.                 cellHeaderElement = generatedPage.content.document.createElement("th");
  585.                 tableRowElement   = generatedPage.content.document.createElement("tr");
  586.  
  587.                 cellHeaderElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_viewCookieInformationHost")));
  588.                 tableRowElement.appendChild(cellHeaderElement);
  589.                 cellDataElement.appendChild(generatedPage.content.document.createTextNode(cookieHost));
  590.                 tableRowElement.appendChild(cellDataElement);
  591.                 tableElement.appendChild(tableRowElement);
  592.  
  593.                 //  Cookie path
  594.                 cellDataElement   = generatedPage.content.document.createElement("td");
  595.                 cellHeaderElement = generatedPage.content.document.createElement("th");
  596.                 tableRowElement   = generatedPage.content.document.createElement("tr");
  597.  
  598.                 tableRowElement.setAttribute("class", "odd");
  599.                 cellHeaderElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_viewCookieInformationPath")));
  600.                 tableRowElement.appendChild(cellHeaderElement);
  601.                 cellDataElement.appendChild(generatedPage.content.document.createTextNode(cookie.path));
  602.                 tableRowElement.appendChild(cellDataElement);
  603.                 tableElement.appendChild(tableRowElement);
  604.  
  605.                 //  Cookie secure
  606.                 cellDataElement   = generatedPage.content.document.createElement("td");
  607.                 cellHeaderElement = generatedPage.content.document.createElement("th");
  608.                 tableRowElement   = generatedPage.content.document.createElement("tr");
  609.  
  610.                 cellHeaderElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_viewCookieInformationSecure")));
  611.                 tableRowElement.appendChild(cellHeaderElement);
  612.  
  613.                 // If the cookie is secure
  614.                 if(cookieSecure)
  615.                 {
  616.                     cellDataElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_yes")));
  617.                 }
  618.                 else
  619.                 {
  620.                     cellDataElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_no")));
  621.                 }
  622.  
  623.                 tableRowElement.appendChild(cellDataElement);
  624.                 tableElement.appendChild(tableRowElement);
  625.  
  626.                 // If the cookie has an expiration date
  627.                 if(cookie.expires)
  628.                 {
  629.                     date          = new Date(cookie.expires * 1000);
  630.                     cookieExpires = dateService.FormatDateTime("", dateService.dateFormatLong, dateService.timeFormatSeconds, date.getFullYear(), date.getMonth()+1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds());
  631.                 }
  632.                 else
  633.                 {
  634.                     cookieExpires = stringBundle.getString("webdeveloper_viewCookieInformationSession");
  635.                 }
  636.  
  637.                 //  Cookie expires
  638.                 cellDataElement   = generatedPage.content.document.createElement("td");
  639.                 cellHeaderElement = generatedPage.content.document.createElement("th");
  640.                 tableRowElement   = generatedPage.content.document.createElement("tr");
  641.  
  642.                 tableRowElement.setAttribute("class", "odd");
  643.                 cellHeaderElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_viewCookieInformationExpires")));
  644.                 tableRowElement.appendChild(cellHeaderElement);
  645.                 cellDataElement.appendChild(generatedPage.content.document.createTextNode(cookieExpires));
  646.                 tableRowElement.appendChild(cellDataElement);
  647.                 tableElement.appendChild(tableRowElement);
  648.  
  649.                 generatedPage.content.document.body.appendChild(tableElement);
  650.  
  651.                 pElement = generatedPage.content.document.createElement("p");
  652.                 generatedPage.content.document.body.appendChild(pElement);
  653.             }
  654.         }
  655.     }
  656.  
  657.     // If the open tabs in background preference is set to true
  658.     if(preferencesService.prefHasUserValue("webdeveloper.open.tabs.background") && preferencesService.getBoolPref("webdeveloper.open.tabs.background"))
  659.     {
  660.         getBrowser().selectedTab = oldTab;
  661.     }
  662. }
  663.  
  664. // View JavaScript
  665. function webdeveloper_viewJavaScript()
  666. {
  667.     const mainTabBox         = getBrowser().mTabBox;
  668.     const documentList       = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  669.     const oldTab             = getBrowser().selectedTab;
  670.     const oldURL             = getBrowser().currentURI.spec;
  671.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  672.     const request            = new XMLHttpRequest();
  673.     const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  674.     const title              = stringBundle.getFormattedString("webdeveloper_viewJavaScriptTitle", [oldURL]);
  675.  
  676.     var documentURL   = null;
  677.     var generatedPage = null;
  678.     var headerElement = null;
  679.     var linkElement   = null;
  680.     var pageDocument  = null;
  681.     var preElement    = null;
  682.     var scriptElement = null;
  683.     var scriptList    = new Array();
  684.     var scriptSource  = null;
  685.  
  686.     generatedPage = webdeveloper_generatePage("");
  687.  
  688.     // This must be done to make generated content render
  689.     request.open("get", "about:blank", false);
  690.     request.send("");
  691.  
  692.     generatedPage.content.document.title = title;
  693.  
  694.     linkElement = generatedPage.content.document.createElement("link");
  695.     linkElement.setAttribute("href", "chrome://webdeveloper/content/stylesheets/generated_content.css");
  696.     linkElement.setAttribute("media", "all");
  697.     linkElement.setAttribute("rel", "stylesheet");
  698.     linkElement.setAttribute("type", "text/css");
  699.     generatedPage.content.document.getElementsByTagName("head")[0].appendChild(linkElement);
  700.  
  701.     headerElement = generatedPage.content.document.createElement("h1");
  702.     headerElement.appendChild(generatedPage.content.document.createTextNode(title));
  703.     generatedPage.content.document.body.appendChild(headerElement);
  704.  
  705.     // Loop through the documents
  706.     for(var i = 0; i < documentList.length; i++)
  707.     {
  708.         pageDocument = documentList[i];
  709.         documentURL  = pageDocument.documentURI;
  710.         scriptList   = pageDocument.getElementsByTagName("script");
  711.  
  712.         headerElement = generatedPage.content.document.createElement("h2");
  713.         linkElement   = generatedPage.content.document.createElement("a");
  714.         linkElement.setAttribute("href", pageDocument.documentURI);
  715.         linkElement.appendChild(generatedPage.content.document.createTextNode(documentURL));
  716.         headerElement.appendChild(linkElement);
  717.         generatedPage.content.document.body.appendChild(headerElement);
  718.  
  719.         // Loop through the scripts
  720.         for(var j = 0; j < scriptList.length; j++)
  721.         {
  722.             scriptElement = scriptList[j];
  723.             scriptSource  = scriptElement.src;
  724.  
  725.             // If the script is external
  726.             if(scriptSource)
  727.             {
  728.                 request.open("get", scriptSource, false);
  729.                 request.send("");
  730.  
  731.                 headerElement = generatedPage.content.document.createElement("h2");
  732.                 linkElement   = generatedPage.content.document.createElement("a");
  733.                 linkElement.setAttribute("href", scriptSource);
  734.                 linkElement.appendChild(generatedPage.content.document.createTextNode(scriptSource));
  735.                 headerElement.appendChild(linkElement);
  736.                 generatedPage.content.document.body.appendChild(headerElement);
  737.  
  738.                 preElement = generatedPage.content.document.createElement("pre");
  739.                 preElement.appendChild(generatedPage.content.document.createTextNode(request.responseText));
  740.                 generatedPage.content.document.body.appendChild(preElement);
  741.             }
  742.             else
  743.             {
  744.                 headerElement = generatedPage.content.document.createElement("h2");
  745.                 headerElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getFormattedString("webdeveloper_inlineScript", [documentURL])));
  746.                 generatedPage.content.document.body.appendChild(headerElement);
  747.  
  748.                 preElement = generatedPage.content.document.createElement("pre");
  749.                 preElement.appendChild(generatedPage.content.document.createTextNode(scriptElement.innerHTML));
  750.                 generatedPage.content.document.body.appendChild(preElement);
  751.             }
  752.         }
  753.     }
  754.  
  755.     // If the open tabs in background preference is set to true
  756.     if(preferencesService.prefHasUserValue("webdeveloper.open.tabs.background") && preferencesService.getBoolPref("webdeveloper.open.tabs.background"))
  757.     {
  758.         getBrowser().selectedTab = oldTab;
  759.     }
  760. }
  761.  
  762. // Displays all the links for the page
  763. function webdeveloper_viewLinkInformation()
  764. {
  765.     const mainTabBox         = getBrowser().mTabBox;
  766.     const documentList       = webdeveloper_getDocuments(getBrowser().browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  767.     const oldTab             = getBrowser().selectedTab;
  768.     const oldURL             = getBrowser().currentURI.spec;
  769.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  770.     const request            = new XMLHttpRequest();
  771.     const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  772.     const title              = stringBundle.getFormattedString("webdeveloper_viewLinkInformationTitle", [oldURL]);
  773.  
  774.     var documentURL       = null;
  775.     var generatedPage     = null;
  776.     var headerElement     = null;
  777.     var link              = null;
  778.     var linkElement       = null;
  779.     var linkHref          = null;
  780.     var linkLength        = null;
  781.     var links             = null;
  782.     var listElement       = null;
  783.     var listItemElement   = null;
  784.     var pageDocument      = null;
  785.     var pElement          = null;
  786.  
  787.     generatedPage = webdeveloper_generatePage("");
  788.  
  789.     // This must be done to make generated content render
  790.     request.open("get", "about:blank", false);
  791.     request.send("");
  792.  
  793.     generatedPage.content.document.title = title;
  794.  
  795.     linkElement = generatedPage.content.document.createElement("link");
  796.     linkElement.setAttribute("href", "chrome://webdeveloper/content/stylesheets/generated_content.css");
  797.     linkElement.setAttribute("media", "all");
  798.     linkElement.setAttribute("rel", "stylesheet");
  799.     linkElement.setAttribute("type", "text/css");
  800.     generatedPage.content.document.getElementsByTagName("head")[0].appendChild(linkElement);
  801.  
  802.     headerElement = generatedPage.content.document.createElement("h1");
  803.     headerElement.appendChild(generatedPage.content.document.createTextNode(title));
  804.     generatedPage.content.document.body.appendChild(headerElement);
  805.  
  806.     // Loop through the documents
  807.     for(var i = 0; i < documentList.length; i++)
  808.     {
  809.         pageDocument = documentList[i];
  810.         documentURL  = pageDocument.documentURI;
  811.         links        = webdeveloper_tidyLinks(pageDocument.getElementsByTagName("a"));
  812.         linkLength   = links.length;
  813.  
  814.         headerElement = generatedPage.content.document.createElement("h2");
  815.         linkElement   = generatedPage.content.document.createElement("a");
  816.         linkElement.setAttribute("href", documentURL);
  817.         linkElement.appendChild(generatedPage.content.document.createTextNode(documentURL));
  818.         headerElement.appendChild(linkElement);
  819.         generatedPage.content.document.body.appendChild(headerElement);
  820.  
  821.         // If there are no links
  822.         if(linkLength == 0)
  823.         {
  824.             pElement = generatedPage.content.document.createElement("p");
  825.             pElement.appendChild(generatedPage.content.document.createTextNode(stringBundle.getString("webdeveloper_noLinks")));
  826.             generatedPage.content.document.body.appendChild(pElement);
  827.         }
  828.         else
  829.         {
  830.             listElement = generatedPage.content.document.createElement("ol");
  831.  
  832.             // Loop through the links
  833.             for(var j = 0; j < linkLength; j++)
  834.             {
  835.                 link     = links[j];
  836.                 linkHref = link.href;
  837.  
  838.                 // If the link is set
  839.                 if(linkHref)
  840.                 {
  841.                     listItemElement = generatedPage.content.document.createElement("li");
  842.                     linkElement     = generatedPage.content.document.createElement("a");
  843.                     linkElement.setAttribute("href", linkHref);
  844.                     linkElement.appendChild(generatedPage.content.document.createTextNode(linkHref));
  845.                     listItemElement.appendChild(linkElement);
  846.                     listElement.appendChild(listItemElement);
  847.                 }
  848.             }
  849.  
  850.             generatedPage.content.document.body.appendChild(listElement);
  851.         }
  852.     }
  853.  
  854.     // If the open tabs in background preference is set to true
  855.     if(preferencesService.prefHasUserValue("webdeveloper.open.tabs.background") && preferencesService.getBoolPref("webdeveloper.open.tabs.background"))
  856.     {
  857.         getBrowser().selectedTab = oldTab;
  858.     }
  859. }
  860.  
  861. // View page information
  862. function webdeveloper_viewPageInformation(chromeLocation)
  863. {
  864.     window.openDialog(chromeLocation, "webdeveloper-page-information-dialog", "chrome,dialog=no,resizable");
  865. }
  866.  
  867. // View the response headers
  868. function webdeveloper_viewResponseHeaders()
  869. {
  870.     const oldTab             = getBrowser().selectedTab;
  871.     const oldURL             = getBrowser().currentURI.spec;
  872.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  873.     const request            = new XMLHttpRequest();
  874.     const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  875.     const title              = stringBundle.getFormattedString("webdeveloper_viewResponseHeadersTitle", [oldURL]);
  876.  
  877.     var generatedPage   = null;
  878.     var headerElement   = null;
  879.     var linkElement     = null;
  880.     var preElement      = null;
  881.     var responseHeaders = null;
  882.  
  883.     generatedPage = webdeveloper_generatePage("");
  884.  
  885.     // This must be done to make generated content render
  886.     request.open("get", oldURL, false);
  887.     request.send("");
  888.     responseHeaders = request.getAllResponseHeaders();
  889.  
  890.     generatedPage.content.document.title = title;
  891.  
  892.     linkElement = generatedPage.content.document.createElement("link");
  893.     linkElement.setAttribute("href", "chrome://webdeveloper/content/stylesheets/generated_content.css");
  894.     linkElement.setAttribute("media", "all");
  895.     linkElement.setAttribute("rel", "stylesheet");
  896.     linkElement.setAttribute("type", "text/css");
  897.     generatedPage.content.document.getElementsByTagName("head")[0].appendChild(linkElement);
  898.  
  899.     headerElement = generatedPage.content.document.createElement("h1");
  900.     headerElement.appendChild(generatedPage.content.document.createTextNode(title));
  901.     generatedPage.content.document.body.appendChild(headerElement);
  902.  
  903.     preElement = generatedPage.content.document.createElement("pre");
  904.     preElement.appendChild(generatedPage.content.document.createTextNode(responseHeaders + "\n" + request.status + " " + request.statusText));
  905.     generatedPage.content.document.body.appendChild(preElement);
  906.  
  907.     // If the open tabs in background preference is set to true
  908.     if(preferencesService.prefHasUserValue("webdeveloper.open.tabs.background") && preferencesService.getBoolPref("webdeveloper.open.tabs.background"))
  909.     {
  910.         getBrowser().selectedTab = oldTab;
  911.     }
  912. }
  913.