1 <html> 2 <head> 3 <script> 4 5 function log(message) { 6 console.log(message) 7 } 8 9 var funcBody = "(){\n" + 10 " var thisFunc = arguments.callee;\n" + 11 " if (!thisFunc.name) thisFunc.displayName = 'f%';\n" + 12 " log(thisFunc.name || thisFunc.displayName);\n" + 13 "}"; 14 15 var funcs = []; 16 var patterns = [ 17 // proper use of @sourceURL comment 18 "//@sourceURL=f%.js\nfuncs.push(function" + funcBody + ")", 19 "//@sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", 20 " //@sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", 21 "// @sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", 22 "//@ sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", 23 "//@sourceURL =f%.js\nfuncs.push(function f%" + funcBody + ")", 24 "//@sourceURL= f%.js\nfuncs.push(function f%" + funcBody + ")", 25 "//@sourceURL=f%.js \nfuncs.push(function f%" + funcBody + ")", 26 " // @ sourceURL = f%.js \nfuncs.push(function f%" + funcBody + ")", 27 "//@sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ");\n//@sourceURL=should-not-see\n", 28 "funcs.push(function f%" + funcBody + ")\n//@sourceURL=f%.js\n", 29 "funcs.push(function f%" + funcBody + ")\n//@sourceURL=f%.js \n", 30 "funcs.push(function f%" + funcBody + ")\n//@sourceURL=f%.js", 31 32 // improper or non-existant use of @sourceURL comment 33 "funcs.push(function f%" + funcBody + ")", 34 "//@sourceurl=f%.js\nfuncs.push(function f%" + funcBody + ")", 35 "//sourceURL=f%.js\nfuncs.push(function f%" + funcBody + ")", 36 "/*@sourceURL=f%.js*/\nfuncs.push(function f%" + funcBody + ")", 37 "//\nsourceURL='f%.js';\nfuncs.push(function f%" + funcBody + ")", 38 "//@sourceURL=\nfuncs.push(function" + funcBody + ")", 39 ]; 40 41 42 for (var i=0; i<patterns.length; i++) { 43 eval(patterns[i].replace(/%/g, i)); 44 } 45 46 </script> 47 </head> 48 49 <body> 50 <p>This page's JavaScript calls functions from named eval()'s. 51 52 <p>Used to test <a href="https://bugs.webkit.org/show_bug.cgi?id=25475">https://bugs.webkit.org/show_bug.cgi?id=25475</a> 53 54 <p>Load the Web Inspector and look at 55 the script's panel, and the script list drop-down control. 56 You should see entries for scripts named 57 <tt>"(program):f0.js"</tt> through <tt>"(program):f12.js"</tt>. The entries were named 58 via proper use of the <tt>//@sourceURL</tt> comment. There will also be entries 59 named <tt>"(program)"</tt> for source that does not properly use, or use at all, 60 the <tt>//@sourceURL</tt> comment. 61 62 <p>Now, set a breakpoint in the body of the <tt>"f0"</tt> function in the 63 <tt>"(program):f0.js"</tt> script. Then click this button: 64 65 <p><input type="button" value="run" onclick="funcs[0]()"> 66 67 <p>When stopped at the breakpoint, the entry for the function in the 68 call stack control should the name of the script, <tt>"(program):f0.js"</tt>, 69 beside the function name <tt>"f0"</tt>. Note the function name for 70 <tt>f0</tt> is set with the new <tt>"displayName"</tt> property. 71 </body> 72 </html> 73