Ryujinx-GtkSharp/audit/html/cormissing.js
Bertrand Lorentz 2a7d26a8b0 audit: Add gen-apidiff-html tool to generate apidiff reports
The gen-apidiff-html tool takes all apidiff files in a directory, merges
them and then applies mono-api.xsl to produce a nice HTML page that
shows the information about the API changes.

The various resources needed by the HTML page (images, CSS, javascript)
are added in the html/ directory.

This is all adapted from an older version of the tools in Mono git
master, under mcs/tools/corcompare.
2013-03-29 17:50:07 +01:00

585 lines
13 KiB
JavaScript

// FIXME:
// It still does not update icons previous to a type/member name when
// certain icon kinds are unchecked (when an item has "todo" and "missing",
// the default display is "missing" and when "missing" is unchecked it
// should turn into "todo").
function toggle (elt)
{
if (elt == null)
return;
var eltLink = firstElement (elt);
if (eltLink != null && eltLink.className == 't') // toggle
{
var ich = elt.className.indexOf ('_');
if (ich < 0)
{
eltLink.src = 'tp.gif';
elt.className += '_';
}
else
{
eltLink.src = 'tm.gif';
elt.className = elt.className.slice (0, ich);
}
}
}
function setView (elt, fView)
{
var eltLink = firstElement (elt);
if (eltLink != null && eltLink.className == 't') // toggle
{
var ich = elt.className.indexOf ('_');
if (ich < 0 && !fView)
{
eltLink.src = 'tp.gif';
elt.className += '_';
}
else if (ich >= 0 && fView)
{
eltLink.src = 'tm.gif';
elt.className = elt.className.slice (0, ich);
}
}
}
function firstElement (elt)
{
var c = elt.firstChild;
while (c != null) {
if (c.nodeType == 1) // Node.ELEMENT_NODE (IE6 does not recognize it)
return c;
c = c.nextSibling;
}
return null;
}
function trimSrc (strSrc)
{
return strSrc.slice (strSrc.lastIndexOf ('/') + 1, strSrc.lastIndexOf ('.'));
}
function getChildrenByTagName (elt, strTag)
{
strTag = strTag.toLowerCase ();
var rgChildren = new Array ();
var eltChild = firstElement (elt);
while (eltChild)
{
if (eltChild.tagName && eltChild.tagName.toLowerCase () == strTag)
rgChildren.push (eltChild);
eltChild = eltChild.nextSibling;
}
return rgChildren;
}
function viewAll (elt, dictTypes)
{
var fView = isShown (elt, dictTypes);
var aCounts = new Array (4);
for (i = 0; i < 4; i++)
aCounts [i] = 0;
var rgElts = getChildrenByTagName (elt, 'DIV');
for (iElt in rgElts) {
var aChildRet = viewAll (rgElts [iElt], dictTypes);
if (aChildRet != null) {
fView = true;
for (i = 0; i < 4; i++)
aCounts [i] += aChildRet [i];
}
}
elt.style.display = fView ? '' : 'none';
if (!fView)
return null;
rgShownDivs = getChildrenByTagName (elt, 'DIV');
for (i = 0; i < rgShownDivs.length; i++) {
var cDiv = rgShownDivs [i];
if (cDiv.style.display == 'none')
continue;
incrementCount (cDiv, aCounts, dictTypes);
}
// update the numbers
rgSpans = getChildrenByTagName (elt, 'SPAN');
for (iSpan in rgSpans) {
var cSpan = rgSpans [iSpan];
var cImage = firstElement (cSpan);
if (cImage == null)
continue;
switch (trimSrc (cImage.src)) {
case 'st': cSpan.lastChild.nodeValue = ": " + aCounts [0]; break;
case 'sm': cSpan.lastChild.nodeValue = ": " + aCounts [1]; break;
case 'sx': cSpan.lastChild.nodeValue = ": " + aCounts [2]; break;
case 'se': cSpan.lastChild.nodeValue = ": " + aCounts [3]; break;
}
}
return aCounts;
}
function isShown (elt, dictTypes)
{
if (!isShownMarkType (elt, dictTypes))
return false;
return true;
}
function isShownMarkType (elt, dictTypes)
{
var rgImages = getChildrenByTagName (elt, 'IMG');
var cImages = rgImages.length;
for (var iImage = 0; iImage < cImages; iImage++)
{
var strImage = trimSrc (rgImages [iImage].src);
if (dictTypes [strImage])
return true;
}
return false;
}
function incrementCount (cDiv, aCounts, dictTypes)
{
switch (cDiv.className) {
case 'y': case 'y_': // assembly
case 'n': case 'n_': // namespace
// types
case 'c': case 'c_': case 'i': case 'i_':
case 'en': case 'en_': case 'd': case 'd_':
// members
case 'r': case 'r_': case 'x': case 'x_': case 'm': case 'm_':
case 'f': case 'f_': case 'e': case 'e_': case 'p': case 'p_':
case 'o': case 'o_': case 'a': case 'a_':
var rgImgs = getChildrenByTagName (cDiv, 'IMG');
for (iImg = 0; iImg < rgImgs.length; iImg++) {
var cImg = rgImgs [iImg];
if (cImg.className != 't')
continue;
var stype = trimSrc (cImg.src);
if (!dictTypes [stype])
continue;
switch (stype) {
case "st": aCounts [0]++; break;
case "sm": aCounts [1]++; break;
case "sx": aCounts [2]++; break;
case "se": aCounts [3]++; break;
default:
continue;
}
break;
}
break;
}
}
/* just for debugging use now.
function firstInnerText (elt)
{
var s = elt.innerText;
if (s != null)
return s;
var n = elt.firstChild;
while (n != null) {
s = n.nodeValue;
if (s != null && s.replace (/^\s+/g, '') != '')
return s;
s = firstInnerText (n);
if (s != null)
return s;
n = n.nextSibling;
}
return s;
}
*/
function getView (elt)
{
var eltLink = firstElement (elt);
if (eltLink != null && eltLink.className == 't') // toggle
{
var ich = elt.className.indexOf ('_');
if (ich < 0)
return true;
}
return false;
}
function getParentDiv (elt)
{
if (elt)
{
do
{
elt = elt.parentNode;
}
while (elt && elt.tagName != 'DIV');
}
return elt;
}
function getName (elt)
{
var rgSpans = getChildrenByTagName (elt, 'SPAN');
for (var iSpan = 0; iSpan < rgSpans.length; iSpan ++)
{
var span = rgSpans [iSpan];
if (span.className == 'l') // label
{
if (span.innerText)
return span.innerText;
else
return span.firstChild.nodeValue;
}
}
return null;
}
function clickHandler (evt)
{
var elt;
if (document.layers)
elt = evt.taget;
else if (window.event && window.event.srcElement)
{
elt = window.event.srcElement;
evt = window.event;
}
else if (evt && evt.stopPropagation)
elt = evt.target;
if (!elt.className && elt.parentNode)
elt = elt.parentNode;
if (elt.className == 'l') // label
{
var strClass;
var strField;
var strNamespace;
var strAssembly;
var strFieldType;
elt = getParentDiv (elt);
var strEltClass = elt.className;
if (strEltClass.charAt (strEltClass.length - 1) == '_')
strEltClass = strEltClass.slice (0, strEltClass.length - 1);
if (strEltClass == 'x') // constructor
{
strField = 'ctor';
elt = getParentDiv (elt);
}
else
if (strEltClass == 'm' || // method
strEltClass == 'p' || // property
strEltClass == 'e' || // event
strEltClass == 'f') // field
{
strFieldType = strEltClass;
strField = getName (elt);
var match = strField.match ( /[\.A-Z0-9_]*/i );
if (match)
strField = match [0];
elt = getParentDiv (elt);
}
var strEltClass = elt.className;
if (strEltClass.charAt (strEltClass.length - 1) == '_')
strEltClass = strEltClass.slice (0, strEltClass.length - 1);
if (strEltClass == 'c' || // class
strEltClass == 's' || // struct
strEltClass == 'i' || // struct
strEltClass == 'd' || // delegate
strEltClass == 'en') // enum
{
strClass = getName (elt);
if (strEltClass == 'en')
strField = null;
elt = getParentDiv (elt);
}
var strEltClass = elt.className;
if (strEltClass.charAt (strEltClass.length - 1) == '_')
strEltClass = strEltClass.slice (0, strEltClass.length - 1);
if (strEltClass == 'n')
{
strNamespace = getName (elt);
elt = getParentDiv (elt);
}
var strEltClass = elt.className;
if (strEltClass.charAt (strEltClass.length - 1) == '_')
strEltClass = strEltClass.slice (0, strEltClass.length - 1);
if (strEltClass == 'y')
{
strAssembly = getName (elt);
}
if (evt.ctrlKey)
{
var strRoot = 'http://anonsvn.mono-project.com/viewcvs/trunk/mcs/class/';
var strExtra = '';
if (strAssembly)
{
if (strAssembly == 'mscorlib')
strAssembly = 'corlib';
else if (strAssembly == 'System.Xml')
strAssembly = 'System.XML';
strRoot = strRoot + strAssembly + '/';
if (strNamespace)
{
strRoot = strRoot + strNamespace + '/';
if (strClass)
{
strRoot += strClass + '.cs';
strExtra += '?view=markup';
}
}
window.open (strRoot + strExtra, 'CVS');
}
}
else if (strNamespace)
{
if (document.getElementById ('TargetMsdn1').checked)
{
var re = /\./g ;
strNamespace = strNamespace.toLowerCase ().replace (re, '');
if (strClass)
strNamespace += strClass.toLowerCase () + 'class';
if (strField)
strNamespace += strField;
if (strClass || strField)
strNamespace += 'topic';
window.open ('http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrf' + strNamespace + '.asp', 'MSDN');
}
else
{
if (strClass)
strNamespace += '.' + strClass;
if (strField)
strNamespace += '.' + strField;
if (document.getElementById ('TargetMonodoc').checked)
{
var category = null;
if (strClass == null)
category = "N:";
else if (strField == null)
category = "T:";
else {
switch (strFieldType) {
case 'f': category = "F:"; break;
case 'p': category = "P:"; break;
case 'm': category = "M:"; break;
case 'e': category = "E:"; break;
}
}
if (category != null)
window.open ('http://www.go-mono.com/docs/monodoc.ashx?link=' + category + strNamespace);
}
else
{
window.open ('http://msdn2.microsoft.com/library/' + strNamespace + '.aspx', 'MSDN');
}
}
}
}
else
{
if (elt.parentNode && elt.parentNode.className == 't') // toggle
elt = elt.parentNode;
else if (elt.className != 't') // toggle
return;
while (elt != null && elt.tagName != 'DIV')
elt = elt.parentNode;
if (evt.shiftKey)
{
var rgElts = getChildrenByTagName (elt, 'DIV');
var cElts = rgElts.length;
if (cElts != 0)
{
var fView = false;
var iElt;
for (iElt = 0; iElt < cElts; iElt ++)
{
if (getView (rgElts [iElt]))
{
fView = true;
break;
}
}
for (iElt = 0; iElt < cElts; iElt ++)
{
setView (rgElts [iElt], !fView);
}
}
}
else if (evt.ctrlKey)
{
setView (elt, true);
var eltParent = getParentDiv (elt);
while (eltParent)
{
var rgSiblings = getChildrenByTagName (eltParent, 'DIV');
var cSiblings = rgSiblings.length;
for (var iSibling = 0; iSibling < cSiblings; iSibling++)
{
var eltSibling = rgSiblings [iSibling];
if (eltSibling != elt)
{
setView (eltSibling, false);
}
}
elt = eltParent;
eltParent = getParentDiv (elt);
}
}
else
toggle (elt);
}
return false;
}
function filterTree ()
{
var eltMissing = document.getElementById ('missing');
var eltTodo = document.getElementById ('todo');
var eltExtra = document.getElementById ('extra');
var eltErrors = document.getElementById ('errors');
var eltStable = document.getElementById ('stable');
var dictTypes = new Object ();
if (eltMissing.checked)
dictTypes ['sm'] = true;
if (eltTodo.checked)
dictTypes ['st'] = true;
if (eltErrors.checked)
dictTypes ['se'] = true;
if (eltExtra.checked)
dictTypes ['sx'] = true;
if (eltStable.checked)
dictTypes ['sc'] = true;
viewAll (document.getElementById ('ROOT'), dictTypes);
}
function addAndFilter ()
{
var newInput = document.getElementById ('NewFilterTarget');
var newAttr = newInput.value;
if (newAttr.length > 0) {
var selection = document.getElementById ('FilteredAttributes');
var newElem = document.createElement ('option');
newElem.appendChild (document.createTextNode (newAttr));
selection.appendChild (newElem);
newInput.value = '';
filterTree ();
}
}
function removeAndFilter ()
{
var selection = document.getElementById ('FilteredAttributes');
if (selection.selectedIndex >= 0) {
var newInput = document.getElementById ('NewFilterTarget');
if (newInput.value.length == 0)
newInput.value = selection.options [selection.selectedIndex].firstChild.nodeValue;
selection.removeChild (selection.options [selection.selectedIndex]);
filterTree ();
}
}
function selectMissing ()
{
toggleFilter ('missing');
}
function selectTodo ()
{
toggleFilter ('todo');
}
function selectExtra ()
{
toggleFilter ('extra');
}
function selectErrors ()
{
toggleFilter ('errors');
}
function selectStable ()
{
toggleFilter ('stable');
}
function toggleAttributeFilter (attrName)
{
toggleFilter (attrName);
}
function toggleFilter (strFilter)
{
var eltTodo = document.getElementById ('todo');
var eltMissing = document.getElementById ('missing');
var eltExtra = document.getElementById ('extra');
var eltErrors = document.getElementById ('errors');
var eltToggle = document.getElementById (strFilter);
if (window && window.event && window.event.shiftKey)
{
eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = false;
eltToggle.checked = true;
}
else
if (!eltTodo.checked && !eltMissing.checked && !eltExtra.checked && !eltErrors.checked)
{
eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true;
eltToggle.checked = false;
}
filterTree ();
}
function onLoad ()
{
var eltMissing = document.getElementById ('missing');
var eltTodo = document.getElementById ('todo');
var eltExtra = document.getElementById ('extra');
var eltErrors = document.getElementById ('errors');
eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true;
filterTree ();
}
if (document.layers)
{
document.captureEvents (Event.MOUSEUP);
document.onmouseup = clickHandler;
}
else if (document.attachEvent)
{
document.attachEvent('onclick', clickHandler);
}
else if (document.addEventListener)
{
document.addEventListener('click', clickHandler, false);
}
else
document.onclick = clickHandler;