-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathinstall_page.htm
More file actions
28 lines (26 loc) · 62.6 KB
/
install_page.htm
File metadata and controls
28 lines (26 loc) · 62.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html><head><style>td {border:1px solid #AAAAAA;}</style></head><body>
<h1>Installation</h1>
<p>Drag and drop each link to your bookmarks bar.<p>
<table>
<tr><td>get_dom.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_Elements.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.getElementsByTagName%28%22%2A%22%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09try%7Bdict%5Bdom%5Bi%5D.tagName%5D.push%28dom%5Bi%5D.outerHTML%29%7D%0A%09%09%09catch%28err%29%7Bdict%5Bdom%5Bi%5D.tagName%5D%3D%5Bdom%5Bi%5D.outerHTML%5D%7D%0A%09%09%7D%0A%09%09sortedkeys%20%3D%20Object.keys%28dict%29.sort%28%29%3B%0A%09%09for%20%28i%20in%20sortedkeys%29%0A%09%09%7B%0A%09%09%09dict%5Bsortedkeys%5Bi%5D%5D%20%3D%20dict%5Bsortedkeys%5Bi%5D%5D.sort%28%29%3B%0A%09%09%7D%0A%09%09console.log%28dict%29%3B%0A%09%09for%20%28i%20in%20dict%29%0A%09%09%7B%0A%09%09%09for%20%28j%20in%20dict%5Bi%5D%29%0A%09%09%09%7B%0A%09%09%09%09console.log%28i%2C%20j%2C%20dict%5Bi%5D%5Bj%5D%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20DOM%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28dict%2C%20undefined%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM</a></td><td>Grabs the entire DOM and collates it by tag name (i.e. all the form objects will be listed together). This bookmarklet is for a general breakdown of an entire page. It's a good start.</td></tr>
<tr><td>get_dom_raw.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_raw.txt%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dict%20%3D%20document.documentElement.outerHTML%3B%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20raw%20DOM%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28dict%2CdownloadName%28%29%2C%22text/plain%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM Raw</a></td><td>Grabs the entire DOM in HTML form.</td></tr>
<tr><td>get_dom_attributes.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_Attributes.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.querySelectorAll%28%22%2A%22%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%20%0A%09%09%7B%0A%09%09%09names%20%3D%20dom%5Bi%5D.getAttributeNames%28%29%3B%0A%09%09%09for%20%28name%20in%20names%29%0A%09%09%09%7B%0A%09%09%09%09value%20%3D%20dom%5Bi%5D.getAttribute%28names%5Bname%5D%29%3B%0A%09%09%09%09if%20%28names%5Bname%5D%20in%20dict%29%0A%09%09%09%09%7B%0A%09%09%09%09%09if%20%28value%20in%20dict%5Bnames%5Bname%5D%5D%29%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09dict%5Bnames%5Bname%5D%5D%5Bvalue%5D.push%28dom%5Bi%5D.outerHTML%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09else%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09dict%5Bnames%5Bname%5D%5D%5Bvalue%5D%3D%20%5Bdom%5Bi%5D.outerHTML%5D%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%09else%0A%09%09%09%09%7B%0A%09%09%09%09%09dict%5Bnames%5Bname%5D%5D%20%3D%20%7B%5Bvalue%5D%3A%20%5Bdom%5Bi%5D.outerHTML%5D%7D%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20Attributes%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28dict%2C%20undefined%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM Attributes</a></td><td>Lists outer HTML for every HTML attribute. Groups by attribute name and value.</td></tr>
<tr><td>get_dom_attributes_table.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_Attributes_table.tsv%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.querySelectorAll%28%22%2A%22%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%20%0A%09%09%7B%0A%09%09%09names%20%3D%20dom%5Bi%5D.getAttributeNames%28%29%3B%0A%09%09%09tag%20%3D%20dom%5Bi%5D.tagName%3B%0A%09%09%09for%20%28name%20in%20names%29%0A%09%09%09%7B%0A%09%09%09%09value%20%3D%20dom%5Bi%5D.getAttribute%28names%5Bname%5D%29%3B%0A%09%09%09%09if%20%28tag%20in%20dict%29%0A%09%09%09%09%7B%0A%09%09%09%09%09if%20%28names%5Bname%5D%20in%20dict%5Btag%5D%29%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09dict%5Btag%5D%5Bnames%5Bname%5D%5D.push%28value%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09else%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09dict%5Btag%5D%5Bnames%5Bname%5D%5D%20%3D%20%5Bvalue%5D%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%09else%0A%09%09%09%09%7B%0A%09%09%09%09%09dict%5Btag%5D%20%3D%20%7B%5Bnames%5Bname%5D%5D%3A%20%5Bvalue%5D%7D%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%09outputstring%20%3D%20%22%22%3B%0A%09%09sortedkeys_tag%20%3D%20Object.keys%28dict%29.sort%28%29%3B%0A%09%09for%20%28i%3D0%3Bi%3Csortedkeys_tag.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09sortedkeys_name%20%3D%20Object.keys%28dict%5Bsortedkeys_tag%5Bi%5D%5D%29.sort%28%29%3B%0A%09%09%09for%20%28j%3D0%3Bj%3Csortedkeys_name.length%3Bj%2B%2B%29%0A%09%09%09%7B%0A%09%09%09%09sortedkeys_values%20%3D%20%5B...new%20Set%28dict%5Bsortedkeys_tag%5Bi%5D%5D%5Bsortedkeys_name%5Bj%5D%5D%29%5D.sort%28%29%3B%0A%09%09%09%09for%20%28k%20in%20sortedkeys_values%29%0A%09%09%09%09%7B%0A%09%09%09%09%09outputstring%20%2B%3D%20JSON.stringify%28sortedkeys_tag%5Bi%5D%29%20%2B%20%22%5Ct%22%3B%0A%09%09%09%09%09outputstring%20%2B%3D%20JSON.stringify%28sortedkeys_name%5Bj%5D%29%20%2B%20%22%5Ct%22%3B%0A%09%09%09%09%09outputstring%20%2B%3D%20JSON.stringify%28sortedkeys_values%5Bk%5D%29%20%2B%20%22%5Cn%22%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20Attributes%20Table%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28outputstring%2CdownloadName%28%29%2C%22application/txt%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM Attributes Table</a></td><td>Creates TSV table of tags, attribute names, and values.</td></tr>
<tr><td>get_dom_ids.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_IDs.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.querySelectorAll%28%27%2A%5Bid%5D%27%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09if%20%28%21%28dom%5Bi%5D.tagName%20in%20dict%29%29%0A%09%09%09%7B%0A%09%09%09%09dict%5Bdom%5Bi%5D.tagName%5D%20%3D%20%7B%7D%3B%0A%09%09%09%7D%0A%09%09%09try%0A%09%09%09%7B%0A%09%09%09%09dict%5Bdom%5Bi%5D.tagName%5D%5Bdom%5Bi%5D.attributes%5B%27id%27%5D.value%5D%20%3D%200%3B%0A%09%09%09%7D%0A%09%09%09catch%20%7B%7D%0A%09%09%7D%0A%09%09const%20out%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%20of%20Object.keys%28dict%29.sort%28%29%29%0A%09%09%7B%0A%09%09%09if%20%28%21%28i%20in%20out%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D%20%3D%20%5B%5D%3B%0A%09%09%09%7D%0A%09%09%09for%20%28v%20of%20Object.keys%28dict%5Bi%5D%29.sort%28%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D.push%28v%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20DOM%20showing%20IDs%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28out%2C%20Object.keys%28out%29.sort%28%29%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM IDs</a></td><td>Lists every element of the DOM that has an ID, collated by tag name. ID's make GUI-level automation way easier. This is a bookmarklet to use for reviewing testability of the page.</td></tr>
<tr><td>get_dom_data_attributes.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_DataAttributes.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.querySelectorAll%28%27%2A%27%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09for%28t%3D0%3Bt%3Cdom%5Bi%5D.attributes.length%3Bt%2B%2B%29%0A%09%09%09%7B%0A%09%09%09%09if%20%28dom%5Bi%5D.attributes%5Bt%5D.name.startsWith%28%22data-%22%29%29%0A%09%09%09%09%7B%0A%09%09%09%09%09this_name%20%3D%20dom%5Bi%5D.attributes%5Bt%5D.name%3B%0A%09%09%09%09%09if%20%28%21%28dom%5Bi%5D.tagName%20in%20dict%29%29%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09dict%5Bdom%5Bi%5D.tagName%5D%20%3D%20%7B%7D%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09if%20%28%21%28this_name%20in%20dict%5Bdom%5Bi%5D.tagName%5D%29%29%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09dict%5Bdom%5Bi%5D.tagName%5D%5Bthis_name%5D%20%3D%20%5B%5D%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09dict%5Bdom%5Bi%5D.tagName%5D%5Bthis_name%5D.push%28dom%5Bi%5D.attributes%5Bthis_name%5D.value%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%09const%20out%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%20of%20Object.keys%28dict%29.sort%28%29%29%0A%09%09%7B%0A%09%09%09if%20%28%21%28i%20in%20out%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D%20%3D%20%7B%7D%3B%0A%09%09%09%7D%0A%09%09%09for%20%28v%20of%20Object.keys%28dict%5Bi%5D%29.sort%28%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D%5Bv%5D%20%3D%20dict%5Bi%5D%5Bv%5D.slice%28%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20Data%20Attributes%20by%20Tags%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28out%2C%20null%2C%202%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM Data Attributes</a></td><td>Lists every HTML attribute that starts with "data-". Groups by tag name. Used for reviewing testability of the page.</td></tr>
<tr><td>get_dom_URIs.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_URIs.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09c%20%3D%20document.querySelectorAll%28%27%2A%27%29%3B%20%0A%09%09a%20%3D%20%7B%7D%3B%20%0A%09%09for%20%28i%3D0%3Bi%3Cc.length%3Bi%2B%2B%29%20%0A%09%09%7B%0A%09%09%09try%20%7Bc%5Bi%5D.attributes%5B%22href%22%5D%7D%20catch%20%7Bcontinue%7D%0A%09%09%09if%20%28c%5Bi%5D.attributes%5B%22href%22%5D%20%21%3D%20null%29%20%0A%09%09%09%7B%0A%09%09%09%09thelink%20%3D%20c%5Bi%5D.attributes%5B%22href%22%5D.baseURI%3B%0A%09%09%09%09if%20%28c%5Bi%5D.attributes%5B%22href%22%5D.value.includes%28%22//%22%29%29%0A%09%09%09%09%7B%0A%09%09%09%09%09thelink%20%3D%20c%5Bi%5D.attributes%5B%22href%22%5D.value%3B%0A%09%09%09%09%7D%0A%09%09%09%09else%0A%09%09%09%09%7B%0A%09%09%09%09%09if%20%28c%5Bi%5D.attributes%5B%22href%22%5D.value.substring%280%2C1%29%20%3D%3D%20%22/%22%29%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09thelink%20%2B%3D%20c%5Bi%5D.attributes%5B%22href%22%5D.value.substring%281%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09else%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09thelink%20%2B%3D%20c%5Bi%5D.attributes%5B%22href%22%5D.value%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%09if%20%28c%5Bi%5D.tagName%20in%20a%29%0A%09%09%09%09%7B%0A%09%09%09%09%09a%5Bc%5Bi%5D.tagName%5D.push%28%5Bthelink%2Cc%5Bi%5D.innerText%5D%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09else%0A%09%09%09%09%7B%0A%09%09%09%09%09a%5Bc%5Bi%5D.tagName%5D%20%3D%20%5B%5Bthelink%2Cc%5Bi%5D.innerText%5D%5D%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%09if%20%28c%5Bi%5D.attributes%5B%22src%22%5D%20%21%3D%20null%29%20%0A%09%09%09%7B%0A%09%09%09%09thelink%20%3D%20document.baseURI%3B%0A%09%09%09%09if%20%28c%5Bi%5D.attributes%5B%22src%22%5D.value.includes%28%22//%22%29%29%0A%09%09%09%09%7B%0A%09%09%09%09%09thelink%20%3D%20c%5Bi%5D.attributes%5B%22src%22%5D.value%3B%0A%09%09%09%09%7D%0A%09%09%09%09else%0A%09%09%09%09%7B%0A%09%09%09%09%09if%20%28c%5Bi%5D.attributes%5B%22src%22%5D.value.substring%280%2C1%29%20%3D%3D%20%22/%22%29%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09thelink%20%2B%3D%20c%5Bi%5D.attributes%5B%22src%22%5D.value.substring%281%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%09else%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09thelink%20%2B%3D%20c%5Bi%5D.attributes%5B%22src%22%5D.value%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%09if%20%28c%5Bi%5D.tagName%20in%20a%29%0A%09%09%09%09%7B%0A%09%09%09%09%09a%5Bc%5Bi%5D.tagName%5D.push%28%5Bthelink%5D%29%3B%0A%09%09%09%09%7D%0A%09%09%09%09else%0A%09%09%09%09%7B%0A%09%09%09%09%09a%5Bc%5Bi%5D.tagName%5D%20%3D%20%5B%5Bthelink%5D%5D%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%09for%20%28i%20in%20a%29%0A%09%09%7B%0A%09%09%09a%5Bi%5D%20%3D%20a%5Bi%5D.sort%28%29%3B%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20all%20URIs%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28a%2C%20Object.keys%28a%29.sort%28%29%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A%0A%0A">Get DOM URIs</a></td><td>Lists every URI that it can find in the document, including links, image sources, iframes, etc. This is good for getting a sense of the dependencies.</td></tr>
<tr><td>get_dom_hidden.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_hiddens.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.querySelectorAll%28%27%2A%5Bstyle%2A%3D%22hidden%22%5D%2C%20%2A%5Bstyle%2A%3D%22display%3A%20none%22%5D%27%29%3B%20%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09tag%20%3D%20dom%5Bi%5D.tagName%3B%0A%09%09%09if%20%28tag%20%21%3D%20undefined%20%26%26%20tag%20%21%3D%20%22undefined%22%29%0A%09%09%09%7B%0A%09%09%09%09try%7Bdict%5Bdom%5Bi%5D.tagName%5D.push%28dom%5Bi%5D.outerHTML%29%7D%0A%09%09%09%09catch%28err%29%7Bdict%5Bdom%5Bi%5D.tagName%5D%3D%5Bdom%5Bi%5D.outerHTML%5D%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%09for%20%28i%20in%20dict%29%0A%09%09%7B%0A%09%09%09dict%5Bi%5D%20%3D%20dict%5Bi%5D.sort%28%29%3B%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20DOM%20showing%20hidden%20things%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28dict%2C%20Object.keys%28dict%29.sort%28%29%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A%0A%0A">Get DOM Hidden</a></td><td>Lists every element of the DOM that has a style attribute that includes "hidden" or "display:none". If there are things in the DOM that are not currently showing on the screen, this bookmarklet will identify some or all of them.</td></tr>
<tr><td>get_dom_read_write.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_read_writes.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.querySelectorAll%28%27%2A%3Aread-write%27%29%3B%20%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09tag%20%3D%20dom%5Bi%5D.tagName%3B%0A%09%09%09if%20%28tag%20%21%3D%20undefined%20%26%26%20tag%20%21%3D%20%22undefined%22%29%0A%09%09%09%7B%0A%09%09%09%09try%7Bdict%5Btag%5D.push%28dom%5Bi%5D.outerHTML%29%7D%0A%09%09%09%09catch%28err%29%7Bdict%5Btag%5D%3D%5Bdom%5Bi%5D.outerHTML%5D%7D%0A%09%09%09%7D%0A%09%09%7D%0A%09%09for%20%28i%20in%20dict%29%0A%09%09%7B%0A%09%09%09dict%5Bi%5D%20%3D%20dict%5Bi%5D.sort%28%29%3B%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20DOM%20showing%20read/writable%20things%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28dict%2C%20Object.keys%28dict%29.sort%28%29%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A%0A%0A">Get DOM Read/Write</a></td><td>Lists all the editable elements on the page. If a field is editable, then you will need to test by entering data into it.</td></tr>
<tr><td>get_dom_classes.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_Classes.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.querySelectorAll%28%27%2A%5Bclass%5D%27%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09if%20%28%21%28dom%5Bi%5D.tagName%20in%20dict%29%29%0A%09%09%09%7B%0A%09%09%09%09dict%5Bdom%5Bi%5D.tagName%5D%20%3D%20%7B%7D%3B%0A%09%09%09%7D%0A%09%09%09dict%5Bdom%5Bi%5D.tagName%5D%5Bdom%5Bi%5D.className%5D%20%3D%200%3B%0A%09%09%7D%0A%09%09const%20out%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%20of%20Object.keys%28dict%29.sort%28%29%29%0A%09%09%7B%0A%09%09%09if%20%28%21%28i%20in%20out%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D%20%3D%20%5B%5D%3B%0A%09%09%09%7D%0A%09%09%09for%20%28v%20of%20Object.keys%28dict%5Bi%5D%29.sort%28%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D.push%28v%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09for%20%28i%20in%20out%29%0A%09%09%7B%0A%09%09%09out%5Bi%5D%20%3D%20out%5Bi%5D.sort%28%29%3B%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20DOM%20showing%20classes%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28out%2C%20Object.keys%28out%29.sort%28%29%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM Classes</a></td><td>Lists every class in the DOM, collated by tag name. Since classes are often named in ways that describe functionality, this can be a good way of getting a sense of what the page does that might need testing.</td></tr>
<tr><td>get_dom_by_classes.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_ByClasses.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.querySelectorAll%28%27%2A%5Bclass%5D%27%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09if%20%28%21%28dom%5Bi%5D.className%20in%20dict%29%29%0A%09%09%09%7B%0A%09%09%09%09dict%5Bdom%5Bi%5D.className%5D%20%3D%20%5B%5D%3B%0A%09%09%09%7D%0A%09%09%09dict%5Bdom%5Bi%5D.className%5D.push%28dom%5Bi%5D.outerHTML%29%3B%0A%09%09%7D%0A%09%09const%20out%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%20of%20Object.keys%28dict%29.sort%28%29%29%0A%09%09%7B%0A%09%09%09if%20%28%21%28i%20in%20out%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D%20%3D%20%5B%5D%3B%0A%09%09%09%7D%0A%09%09%09for%20%28v%20of%20dict%5Bi%5D.sort%28%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D.push%28v%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09for%20%28i%20in%20out%29%0A%09%09%7B%0A%09%09%09out%5Bi%5D%20%3D%20out%5Bi%5D.sort%28%29%3B%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20DOM%20by%20classes%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28out%2C%20Object.keys%28out%29.sort%28%29%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM By Classes</a></td><td>Grabs outer HTML of DOM elements, collated by class names. Often classes map directly to functionality such that you want to grab all the HTML associated with certain classes. This bookmarklet does the job.</td></tr>
<tr><td>get_dom_by_classes_innertext.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_ByClasses_InnerText.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.querySelectorAll%28%27%2A%5Bclass%5D%27%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09if%20%28%21%28dom%5Bi%5D.className%20in%20dict%29%29%0A%09%09%09%7B%0A%09%09%09%09dict%5Bdom%5Bi%5D.className%5D%20%3D%20%5B%5D%3B%0A%09%09%09%7D%0A%09%09%09dict%5Bdom%5Bi%5D.className%5D.push%28dom%5Bi%5D.innerText%29%3B%0A%09%09%7D%0A%09%09const%20out%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%20of%20Object.keys%28dict%29.sort%28%29%29%0A%09%09%7B%0A%09%09%09if%20%28%21%28i%20in%20out%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D%20%3D%20%5B%5D%3B%0A%09%09%09%7D%0A%09%09%09for%20%28v%20of%20dict%5Bi%5D.sort%28%29%29%0A%09%09%09%7B%0A%09%09%09%09out%5Bi%5D.push%28v%29%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09for%20%28i%20in%20out%29%0A%09%09%7B%0A%09%09%09out%5Bi%5D%20%3D%20out%5Bi%5D.sort%28%29%3B%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20DOM%20by%20classes%20with%20inner%20text%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28out%2C%20Object.keys%28out%29.sort%28%29%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM By Classes InnerText</a></td><td>Grabs inner text of DOM elements, collated by class names. When making a coverage outline, getting the inner text associated with particular classes is a great shortcut.</td></tr>
<tr><td>get_dom_innertext.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_InnerText.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09dom%20%3D%20document.getElementsByTagName%28%22%2A%22%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09try%7Bdict%5Bdom%5Bi%5D.tagName%5D.push%28dom%5Bi%5D.innerText%29%7D%0A%09%09%09catch%28err%29%7Bdict%5Bdom%5Bi%5D.tagName%5D%3D%5Bdom%5Bi%5D.innerText%5D%7D%0A%09%09%7D%0A%09%09for%20%28i%20in%20dict%29%0A%09%09%7B%0A%09%09%09dict%5Bi%5D%20%3D%20dict%5Bi%5D.sort%28%29%3B%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20DOM%20showing%20inner%20text%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28JSON.stringify%28dict%2C%20Object.keys%28dict%29.sort%28%29%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM InnerText</a></td><td>Lists all the text associated with each element of the DOM. This is probably all the text that can appear on the page, other than stuff dynamically generated.</td></tr>
<tr><td>get_dom_justinnertext.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_DOM_JustInnerText.txt%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09textblob%20%3D%20%22%22%3B%0A%09%09dom%20%3D%20document.getElementsByTagName%28%22%2A%22%29%3B%0A%09%09const%20dict%20%3D%20%7B%7D%3B%0A%09%09for%20%28i%3D0%3Bi%3Cdom.length%3Bi%2B%2B%29%0A%09%09%7B%0A%09%09%09try%7Bdict%5Bdom%5Bi%5D.tagName%5D.push%28dom%5Bi%5D.innerText%29%7D%0A%09%09%09catch%28err%29%7Bdict%5Bdom%5Bi%5D.tagName%5D%3D%5Bdom%5Bi%5D.innerText%5D%7D%0A%09%09%7D%0A%09%09for%20%28i%20in%20dict%29%0A%09%09%7B%0A%09%09%09dict%5Bi%5D%20%3D%20dict%5Bi%5D.sort%28%29%3B%0A%09%09%09for%20%28j%20in%20dict%5Bi%5D%29%0A%09%09%09%7B%0A%09%09%09%09textblob%20%2B%3D%20dict%5Bi%5D%5Bj%5D%3B%0A%09%09%09%09textblob%20%2B%3D%20%22%5Cn--------------------%20bookmarklet%20output%20separator%20-----------------------%5Cn%22%3B%0A%09%09%09%7D%0A%09%09%7D%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20DOM%20showing%20inner%20text%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%2B%20%22SELECTED%20TEXT%3A%20%22%20%2B%20the_text%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09download%28textblob%2CdownloadName%28%29%2C%22application/txt%22%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get DOM Just InnerText</a></td><td>Lists all the text associated with each element of the DOM, except presented as a text file instead of a JSON so that the text is not escaped. This is helpful when you intend to put that text to use.</td></tr>
<tr><td>get_storage.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%0A%09%7B%0A%09%09async%20function%20getAllIndexedDBData%28%29%20%7B%0A%09%09%09const%20allDatabasesData%20%3D%20%7B%7D%3B%0A%0A%09%09%09//%20Function%20to%20get%20all%20database%20names%20%28IDBFactory.databases%20is%20still%20experimental%29%0A%09%09%09async%20function%20getAllDatabaseNames%28%29%20%7B%0A%09%09%09%09if%20%28%21indexedDB.databases%29%20%7B%0A%09%09%09%09%09console.error%28%22indexedDB.databases%20is%20not%20supported%20in%20this%20browser.%22%29%3B%0A%09%09%09%09%09return%20%5B%5D%3B%0A%09%09%09%09%7D%0A%09%09%09%09const%20dbs%20%3D%20await%20indexedDB.databases%28%29%3B%0A%09%09%09%09return%20dbs.map%28db%20%3D%3E%20db.name%29%3B%0A%09%09%09%7D%0A%0A%09%09%09//%20Function%20to%20get%20all%20data%20from%20a%20specific%20object%20store%0A%09%09%09function%20getAllDataFromObjectStore%28db%2C%20storeName%29%20%7B%0A%09%09%09%09return%20new%20Promise%28%28resolve%2C%20reject%29%20%3D%3E%20%7B%0A%09%09%09%09%09const%20transaction%20%3D%20db.transaction%28storeName%2C%20%27readonly%27%29%3B%0A%09%09%09%09%09const%20objectStore%20%3D%20transaction.objectStore%28storeName%29%3B%0A%09%09%09%09%09const%20request%20%3D%20objectStore.getAll%28%29%3B%0A%0A%09%09%09%09%09request.onsuccess%20%3D%20%28event%29%20%3D%3E%20%7B%0A%09%09%09%09%09%09resolve%28event.target.result%29%3B%0A%09%09%09%09%09%7D%3B%0A%0A%09%09%09%09%09request.onerror%20%3D%20%28event%29%20%3D%3E%20%7B%0A%09%09%09%09%09%09reject%28event.target.error%29%3B%0A%09%09%09%09%09%7D%3B%0A%09%09%09%09%7D%29%3B%0A%09%09%09%7D%0A%0A%09%09%09//%20Function%20to%20get%20all%20data%20from%20a%20database%0A%09%09%09async%20function%20getAllDataFromDatabase%28dbName%29%20%7B%0A%09%09%09%09return%20new%20Promise%28%28resolve%2C%20reject%29%20%3D%3E%20%7B%0A%09%09%09%09%09const%20openRequest%20%3D%20indexedDB.open%28dbName%29%3B%0A%0A%09%09%09%09%09openRequest.onsuccess%20%3D%20async%20%28event%29%20%3D%3E%20%7B%0A%09%09%09%09%09%09const%20db%20%3D%20event.target.result%3B%0A%09%09%09%09%09%09const%20databaseData%20%3D%20%7B%7D%3B%0A%09%09%09%09%09%09if%20%28db.objectStoreNames.length%20%3E%200%29%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09const%20transaction%20%3D%20db.transaction%28db.objectStoreNames%2C%20%27readonly%27%29%3B%0A%09%09%09%09%09%09%09const%20objectStoreNames%20%3D%20Array.from%28db.objectStoreNames%29%3B%0A%0A%09%09%09%09%09%09%09try%20%7B%0A%09%09%09%09%09%09%09%09for%20%28const%20storeName%20of%20objectStoreNames%29%20%7B%0A%09%09%09%09%09%09%09%09%09databaseData%5BstoreName%5D%20%3D%20await%20getAllDataFromObjectStore%28db%2C%20storeName%29%3B%0A%09%09%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09%09%09resolve%28databaseData%29%3B%0A%09%09%09%09%09%09%09%7D%20catch%20%28error%29%20%7B%0A%09%09%09%09%09%09%09%09reject%28error%29%3B%0A%09%09%09%09%09%09%09%7D%20finally%20%7B%0A%09%09%09%09%09%09%09%09db.close%28%29%3B%0A%09%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09else%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09resolve%28databaseData%29%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%7D%3B%0A%0A%09%09%09%09%09openRequest.onerror%20%3D%20%28event%29%20%3D%3E%20%7B%0A%09%09%09%09%09%09reject%28event.target.error%29%3B%0A%09%09%09%09%09%7D%3B%0A%09%09%09%09%7D%29%3B%0A%09%09%09%7D%0A%0A%09%09%09//%20Get%20all%20database%20names%0A%09%09%09const%20dbNames%20%3D%20await%20getAllDatabaseNames%28%29%3B%0A%0A%09%09%09//%20Get%20all%20data%20from%20each%20database%0A%09%09%09for%20%28const%20dbName%20of%20dbNames%29%20%7B%0A%09%09%09%09try%20%7B%0A%09%09%09%09%09allDatabasesData%5BdbName%5D%20%3D%20await%20getAllDataFromDatabase%28dbName%29%3B%0A%09%09%09%09%7D%20catch%20%28error%29%20%7B%0A%09%09%09%09%09console.error%28%60Error%20retrieving%20data%20from%20database%20%22%24%7BdbName%7D%22%3A%60%2C%20error%29%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%0A%09%09%09return%20allDatabasesData%3B%0A%09%09%7D%0A%09%0A%09%09function%20downloadName%28%29%0A%09%09%7B%0A%20%20%09%09%09var%20hostname%20%3D%20window.location.hostname.substring%280%2C%20window.location.hostname.lastIndexOf%28%27.%27%29%29.replaceAll%28%22.%22%2C%20%22_%22%29%3B%0A%20%20%09%09%09var%20pathname%20%3D%20window.location.pathname%20%3F%20window.location.pathname.replaceAll%28%27/%27%2C%20%27_%27%29%3A%20%22_%22%3B%0A%09%20%20%20%20%09%09var%20filename%20%3D%20hostname%20%2B%20pathname%20%2B%20%22_Storage.json%22%3B%0A%09%09%09return%20filename%3B%0A%09%09%7D%0A%09%09function%20download%28text%2C%20name%2C%20type%29%20%0A%09%09%7B%20%20%0A%09%09%09var%20a%20%3D%20document.createElement%28%22a%22%29%3B%20%0A%09%09%09var%20file%20%3D%20new%20Blob%28%5Btext%5D%2C%20%7Btype%3A%20type%7D%29%3B%20%20%0A%09%09%09a.href%20%3D%20URL.createObjectURL%28file%29%3B%20%20%0A%09%09%09a.download%20%3D%20name%3B%20%20%0A%09%09%09a.click%28%29%0A%09%09%7D%0A%09%09function%20send%28l%2Cs%2Cc%2Ci%29%0A%09%09%7B%0A%09%09%09download%28JSON.stringify%28%7B%22javascriptCookies%22%3Ac%2C%22localStorage%22%3Al%2C%22sessionStorage%22%3As%2C%22indexedDB%22%3Ai%7D%2Cnull%2C2%29%2CdownloadName%28%29%2C%22application/json%22%29%3B%0A%09%09%7D%0A%09%09const%20result_l%20%3D%20%7B%7D%3B%0A%09%09const%20result_s%20%3D%20%7B%7D%3B%0A%09%09const%20result_c%20%3D%20%7B%7D%3B%0A%09%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%20localStorage.length%3B%20i%2B%2B%29%0A%09%09%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%09%09%09result_l%5BlocalStorage.key%28i%29%5D%20%3D%20JSON.parse%28localStorage.getItem%28localStorage.key%28i%29%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20catch%20%7B%0A%20%20%20%20%09%09%09result_l%5BlocalStorage.key%28i%29%5D%20%3D%20localStorage.getItem%28localStorage.key%28i%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%09%09%0A%09%09for%20%28var%20i%20%3D%200%3B%20i%20%3C%20sessionStorage.length%3B%20i%2B%2B%29%0A%09%09%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%09%09%09result_l%5BsessionStorage.key%28i%29%5D%20%3D%20JSON.parse%28JSON.parse%28sessionStorage.getItem%28sessionStorage.key%28i%29%29%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20catch%20%7B%0A%20%20%20%20%09%09%09result_l%5BsessionStorage.key%28i%29%5D%20%3D%20sessionStorage.getItem%28sessionStorage.key%28i%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%09%09%7D%0A%09%09%0A%09%09getAllIndexedDBData%28%29.then%0A%09%09%28%0A%09%09%09%28result_i%29%20%3D%3E%20%0A%09%09%09%7B%0A%09%09%09%09the_title%20%3D%20document.title%3B%0A%09%09%09%09the_place%20%3D%20window.location.href%3B%0A%09%09%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09%09%09console.log%28%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%5Cn%28Downloaded%20stored%20variables%29%5Cn%22%20%2B%20%22TIME%3A%20%22%20%2B%20the_time%20%2B%20%22%5Cn%22%20%2B%20%22TITLE%3A%20%22%20%2B%20the_title%20%2B%20%22%5Cn%22%20%2B%20%22URL%3A%20%22%20%2B%20the_place%20%2B%20%22%5Cn%22%20%29%3B%09%09%0A%0A%09%09%09%09window.cookieStore.getAll%28%29.then%28%0A%09%09%09%09%09function%20%28value%29%0A%09%09%09%09%09%7B%0A%09%09%09%09%09%09for%20%28v%20in%20value%29%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09result_c%5Bvalue%5Bv%5D.name%5D%3Dvalue%5Bv%5D.value%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%09send%28result_l%2Cresult_s%2Cresult_c%2Cresult_i%29%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%29%3B%0A%09%09%09%7D%0A%09%09%29%3B%0A%09%7D%0A%29%28%29%3B%0A">Get Storage</a></td><td>Dumps the contents of JavaScript-visible cookies, Local Storage, and Session Storage. Local storage can be a gold mine of test data, or categories of test data, that you will need to test with.</td></tr>
<tr><td>console_stamp_note.js</td><td><a href="javascript:%20%0A%28%0A%09async%20%28%29%3D%3E%0A%09%7B%0A%09%09the_type%20%3D%20%22note%22%3B%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09the_message%20%3D%20prompt%28%22What%27s%20up%3F%22%29%3B%0A%09%09if%20%28the_message%20%21%3D%20null%29%0A%09%09%7B%0A%09%09%09json_version%20%3D%20%7B%22time%22%3A%20the_time%2C%20%22test%20notes%22%3A%7B%22message%22%3A%20the_message%2C%20%22title%22%3A%20the_title%2C%20%22place%22%3A%20the_place%2C%20%22text%22%3A%20the_text%2C%20%22type%22%3A%20the_type%7D%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20dbName%20%3D%20%27SatisficeCoverageRecorder%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20await%20window.indexedDB.databases%28%29.then%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28dbs%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20out%20%3D%20dbs.map%28%28db%29%3D%3E%7Breturn%20db.name%20%3D%3D%20dbName%3B%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28out.includes%28true%29%29%20%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09if%20%28window.localStorage.getItem%28%22SatisficeCoverageReporter_active%22%29%20%3D%3D%20%22started%22%29%0A%09%09%09%09%09%09%09%7B%09%09%09%09%09%09%09%0A%09%09%09%09%09%09%09%09let%20db%3B%0A%09%09%09%09%09%09%09%09const%20request%20%3D%20window.indexedDB.open%28dbName%29%3B%0A%09%09%09%09%09%09%09%09request.onsuccess%20%3D%20%28event%29%20%3D%3E%20%7B%0A%09%09%09%09%09%09%09%09%09db%20%3D%20event.target.result%3B%0A%09%09%09%09%09%09%09%09%09const%20transaction%20%3D%20db.transaction%28%5B%22Events%22%5D%2C%20%22readwrite%22%29%3B%0A%09%09%09%09%09%09%09%09%09const%20objectStore%20%3D%20transaction.objectStore%28%22Events%22%29%3B%0A%09%09%09%09%09%09%09%09%09const%20request%20%3D%20objectStore.add%28json_version%29%3B%0A%09%09%09%09%09%09%09%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%0A%09%09%09console.log%28JSON.stringify%28json_version%29%20%2B%20%22%5Cn%22%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%22%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20%20TIME%3A%20%22%20%2B%20the_time%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20MESSAGE%3A%20%22%20%2B%20the_message%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20TITLE%3A%20%22%20%2B%20the_title%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20%20%20URL%3A%20%22%20%2B%20the_place%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5CnSELECTED%20TEXT%3A%20%22%20%2B%20the_text%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%22%20%29%3B%0A%09%09%7D%09%09%09%09%09%09%09%20%0A%09%7D%0A%29%28%29%3B%0A">Console Stamp Note</a></td><td>This one dumps the following info to the console, which is useful during testing: current page title, current URL, current time, and any selected text on the page. It also prompts you in case you want to enter a note. Great for in situ notetaking. This is especially useful if you have enabled the Chrome debug log. TYPE IS NOTE.</td></tr>
<tr><td>console_stamp_bug.js</td><td><a href="javascript:%20%0A%28%0A%09async%20%28%29%3D%3E%0A%09%7B%0A%09%09the_type%20%3D%20%22bug%22%3B%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09the_message%20%3D%20prompt%28%22What%20seems%20wrong%3F%22%29%3B%0A%09%09if%20%28the_message%20%21%3D%20null%29%0A%09%09%7B%0A%09%09%09json_version%20%3D%20%7B%22time%22%3A%20the_time%2C%20%22test%20notes%22%3A%7B%22message%22%3A%20the_message%2C%20%22title%22%3A%20the_title%2C%20%22place%22%3A%20the_place%2C%20%22text%22%3A%20the_text%2C%20%22type%22%3A%20the_type%7D%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20dbName%20%3D%20%27SatisficeCoverageRecorder%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20await%20window.indexedDB.databases%28%29.then%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28dbs%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20out%20%3D%20dbs.map%28%28db%29%3D%3E%7Breturn%20db.name%20%3D%3D%20dbName%3B%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28out.includes%28true%29%29%20%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09if%20%28window.localStorage.getItem%28%22SatisficeCoverageReporter_active%22%29%20%3D%3D%20%22started%22%29%0A%09%09%09%09%09%09%09%7B%09%09%09%09%09%09%09%0A%09%09%09%09%09%09%09%09let%20db%3B%0A%09%09%09%09%09%09%09%09const%20request%20%3D%20window.indexedDB.open%28dbName%29%3B%0A%09%09%09%09%09%09%09%09request.onsuccess%20%3D%20%28event%29%20%3D%3E%20%7B%0A%09%09%09%09%09%09%09%09%09db%20%3D%20event.target.result%3B%0A%09%09%09%09%09%09%09%09%09const%20transaction%20%3D%20db.transaction%28%5B%22Events%22%5D%2C%20%22readwrite%22%29%3B%0A%09%09%09%09%09%09%09%09%09const%20objectStore%20%3D%20transaction.objectStore%28%22Events%22%29%3B%0A%09%09%09%09%09%09%09%09%09const%20request%20%3D%20objectStore.add%28json_version%29%3B%0A%09%09%09%09%09%09%09%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%0A%09%09%09console.log%28JSON.stringify%28json_version%29%20%2B%20%22%5Cn%22%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%22%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20%20TIME%3A%20%22%20%2B%20the_time%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20MESSAGE%3A%20%22%20%2B%20the_message%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20TITLE%3A%20%22%20%2B%20the_title%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20%20%20URL%3A%20%22%20%2B%20the_place%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5CnSELECTED%20TEXT%3A%20%22%20%2B%20the_text%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%22%20%29%3B%0A%09%09%7D%09%09%09%09%09%09%09%20%0A%09%7D%0A%29%28%29%3B%0A">Console Stamp Bug</a></td><td>Same as above but the type will be set to 'bug'.</td></tr>
<tr><td>console_stamp_sessionstart.js</td><td><a href="javascript:%20%0A%28%0A%09async%20%28%29%3D%3E%0A%09%7B%0A%09%09the_type%20%3D%20%22session%20start%22%3B%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09the_message%20%3D%20prompt%28%22What%20is%20your%20test%20charter%3F%22%29%3B%0A%09%09if%20%28the_message%20%21%3D%20null%29%0A%09%09%7B%0A%09%09%09json_version%20%3D%20%7B%22time%22%3A%20the_time%2C%20%22test%20notes%22%3A%7B%22message%22%3A%20the_message%2C%20%22title%22%3A%20the_title%2C%20%22place%22%3A%20the_place%2C%20%22text%22%3A%20the_text%2C%20%22type%22%3A%20the_type%7D%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20dbName%20%3D%20%27SatisficeCoverageRecorder%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20await%20window.indexedDB.databases%28%29.then%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28dbs%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20out%20%3D%20dbs.map%28%28db%29%3D%3E%7Breturn%20db.name%20%3D%3D%20dbName%3B%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28out.includes%28true%29%29%20%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09if%20%28window.localStorage.getItem%28%22SatisficeCoverageReporter_active%22%29%20%3D%3D%20%22started%22%29%0A%09%09%09%09%09%09%09%7B%09%09%09%09%09%09%09%0A%09%09%09%09%09%09%09%09let%20db%3B%0A%09%09%09%09%09%09%09%09const%20request%20%3D%20window.indexedDB.open%28dbName%29%3B%0A%09%09%09%09%09%09%09%09request.onsuccess%20%3D%20%28event%29%20%3D%3E%20%7B%0A%09%09%09%09%09%09%09%09%09db%20%3D%20event.target.result%3B%0A%09%09%09%09%09%09%09%09%09const%20transaction%20%3D%20db.transaction%28%5B%22Events%22%5D%2C%20%22readwrite%22%29%3B%0A%09%09%09%09%09%09%09%09%09const%20objectStore%20%3D%20transaction.objectStore%28%22Events%22%29%3B%0A%09%09%09%09%09%09%09%09%09const%20request%20%3D%20objectStore.add%28json_version%29%3B%0A%09%09%09%09%09%09%09%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%0A%09%09%09console.log%28JSON.stringify%28json_version%29%20%2B%20%22%5Cn%22%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%22%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20%20TIME%3A%20%22%20%2B%20the_time%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20MESSAGE%3A%20%22%20%2B%20the_message%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20TITLE%3A%20%22%20%2B%20the_title%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20%20%20URL%3A%20%22%20%2B%20the_place%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5CnSELECTED%20TEXT%3A%20%22%20%2B%20the_text%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%22%20%29%3B%0A%09%09%7D%09%09%09%09%09%09%09%20%0A%09%7D%0A%29%28%29%3B%0A">Console Stamp Session Start</a></td><td>Same as above but the type will be set to 'session start'.</td></tr>
<tr><td>console_stamp_sessionend.js</td><td><a href="javascript:%20%0A%28%0A%09async%20%28%29%3D%3E%0A%09%7B%0A%09%09the_type%20%3D%20%22session%20end%22%3B%0A%09%09the_title%20%3D%20document.title%3B%0A%09%09the_place%20%3D%20window.location.href%3B%0A%09%09the_text%20%3D%20window.getSelection%28%29.toString%28%29%3B%0A%09%09the_time%20%3D%20Date%28%29.valueOf%28%29%3B%0A%09%09the_message%20%3D%20prompt%28%22Did%20you%20fulfill%20the%20charter%3F%22%29%3B%0A%09%09if%20%28the_message%20%21%3D%20null%29%0A%09%09%7B%0A%09%09%09json_version%20%3D%20%7B%22time%22%3A%20the_time%2C%20%22test%20notes%22%3A%7B%22message%22%3A%20the_message%2C%20%22title%22%3A%20the_title%2C%20%22place%22%3A%20the_place%2C%20%22text%22%3A%20the_text%2C%20%22type%22%3A%20the_type%7D%7D%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20dbName%20%3D%20%27SatisficeCoverageRecorder%27%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20await%20window.indexedDB.databases%28%29.then%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%28dbs%29%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20out%20%3D%20dbs.map%28%28db%29%3D%3E%7Breturn%20db.name%20%3D%3D%20dbName%3B%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28out.includes%28true%29%29%20%0A%09%09%09%09%09%09%7B%0A%09%09%09%09%09%09%09if%20%28window.localStorage.getItem%28%22SatisficeCoverageReporter_active%22%29%20%3D%3D%20%22started%22%29%0A%09%09%09%09%09%09%09%7B%09%09%09%09%09%09%09%0A%09%09%09%09%09%09%09%09let%20db%3B%0A%09%09%09%09%09%09%09%09const%20request%20%3D%20window.indexedDB.open%28dbName%29%3B%0A%09%09%09%09%09%09%09%09request.onsuccess%20%3D%20%28event%29%20%3D%3E%20%7B%0A%09%09%09%09%09%09%09%09%09db%20%3D%20event.target.result%3B%0A%09%09%09%09%09%09%09%09%09const%20transaction%20%3D%20db.transaction%28%5B%22Events%22%5D%2C%20%22readwrite%22%29%3B%0A%09%09%09%09%09%09%09%09%09const%20objectStore%20%3D%20transaction.objectStore%28%22Events%22%29%3B%0A%09%09%09%09%09%09%09%09%09const%20request%20%3D%20objectStore.add%28json_version%29%3B%0A%09%09%09%09%09%09%09%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%3B%0A%0A%09%09%09console.log%28JSON.stringify%28json_version%29%20%2B%20%22%5Cn%22%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%2A%2A%2A%20Test%20Stamp%20%2A%2A%2A%22%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20%20TIME%3A%20%22%20%2B%20the_time%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20MESSAGE%3A%20%22%20%2B%20the_message%20%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20TITLE%3A%20%22%20%2B%20the_title%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%20%20%20%20%20%20%20%20%20%20URL%3A%20%22%20%2B%20the_place%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5CnSELECTED%20TEXT%3A%20%22%20%2B%20the_text%0A%09%09%09%09%09%09%09%09%09%20%2B%20%22%5Cn%22%20%29%3B%0A%09%09%7D%09%09%09%09%09%09%09%20%0A%09%7D%0A%29%28%29%3B%0A">Console Stamp Session End</a></td><td>Same as above but the type will be set to 'session end'.</td></tr>
<tr><td>counterstring.js</td><td><a href="javascript:%20%0A%28%0A%09%28%29%3D%3E%20%7B%0A%0A%09function%20buildString%20%28string_length%2C%20delimiter%29%20%7B%0A%09%09while%20%28string_length%20%3E%201%29%20%7B%0A%09%09%09chunk%20%3D%20string_length.toString%28%29%20%2B%20delimiter.toString%28%29%3B%0A%09%09%09theString%20%3D%20chunk%20%2B%20theString%3B%0A%09%09%09string_length%20-%3D%20chunk.length%3B%0A%09%09%7D%0A%09%09if%20%28%20string_length%20%3D%3D%201%20%29%20%7B%0A%09%09%09theString%20%3D%20delimiter.toString%28%29%20%2B%20theString%3B%0A%09%09%7D%0A%09%09return%28theString%29%3B%0A%09%7D%0A%09%0A%09let%20delimiter%20%3D%20%22%2A%22%3B%0A%09let%20theString%20%3D%20%22%22%3B%0A%09%0A%09the_message%20%3D%20prompt%28%22Length%20%28%2Cdelimiter%29%22%29%3B%0A%09if%20%28the_message%20%21%3D%20null%29%20%7B%0A%09%09if%20%28result%20%3D%20the_message.match%28/%5E%28%5Cd%2B%29/%29%29%20%7B%0A%09%09%09string_length%20%3D%20parseInt%28result%5B1%5D%29%3B%0A%09%09%7D%0A%0A%09%09if%20%28result%20%3D%20the_message.match%28/%5E%5Cd%2B%2C%28.%29%24/%29%29%20%7B%0A%09%09%09delimiter%20%3D%20result%5B1%5D.toString%28%29%3B%0A%09%09%7D%09%0A%0A%09%09theString%20%3D%20buildString%28string_length%2C%20delimiter%29%3B%0A%09%09navigator.clipboard.writeText%28theString%29%3B%0A%09%7D%0A%0A%09%7D%0A%29%28%29%3B">Produce Counterstring</a></td><td>Creates a counterstring of a specified length and delimiter.</td></tr>
</table>
</body></html>