Latest commit

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

perfViewer.js

perfViewer.js is a script to effortlessly display performance metrics on any page. When the script is initialized, it shows a notification bar with the page load time and a link to display a waterfall chart. All of this is done in JavaScript based on the HTML5 navigation and resource timings API.

Integrating perfViewer

To use perfViewer.js on your website, simply add it to your page and initialize it from a window load event handler. For example:

<script src="scripts/perfViewer.js"></script>
<script type="text/javascript">
window.addEventListener('load', function() { perfViewer.init(); }, false);
</script>

If you want to, you can initialize it anytime after the window load event.

If perfViewer is loaded after the window load event, it assumes it is being used as a bookmarklet (see below) and will initialize itself.

Customization

There are a few customization options supported. To use these, pass an object to init() with values for any of the following properties:

  • errorThreshold - by default, perfViewer shows the load time in red if it exceeds a threshold of 2000 milliseconds. This value is customizable.
  • containerId - by default, perfViewer will create a new container div for all its contents. If you want to control where it goes, you can specify an ID.
  • useDefaultCSS - by default, perfViewer loads all its own CSS. If you are styling perfViewer yourself, set this to false.
  • includePerfViewerInWaterfall - by default, perfViewer will include itself in the waterfall diagram (unless it is loaded after the document is complete). If you want to exclude it, set this to false.

For example, to set a lower alert threshold of 1.5s, you would initialize perfViewer as follows:

window.addEventListener('load', function() { perfViewer.init({ errorThreshold: 75 }); }, false);

Custom CSS

perfViewer ships with its own CSS. If you want to customize this, go for it! All elements generated by perfViewer have classes starting with "perf-view-"...see the CSS file to get started.

If you include the CSS in an external file, you'll want to make sure to set useDefaultCSS: false in the init options.

Bookmarklet

To see perfViewer.js on any page, use the following bookmarklet. (This may not always work depending on the page's content security policy).

javascript:(function(){var el=document.createElement('script');el.type='text/javascript';el.src='https://raw.githubusercontent.com/strommen/perfViewerJS/master/perfViewer.js';document.getElementsByTagName('body')[0].appendChild(el);})();

When you activate the bookmarklet, the script will be added to the page. The script will detect that the page has already finished loading, so it will call init() on itself.

What's Next

There are a few features I'd like to add:

  • Prevent the labels for DOMContentLoaded and window.onload from obscuring other labels.
  • Indicate cross-origin resources, since their responseStart timing is always zero so we cannot measure latency.
  • Get a better workflow for modifying the CSS (rather than CSS text manually inlined into the JS file...)
  • Render everything in an iframe so it doesn't inherit styles from the original document.
  • Display resource download sizes for each row in the chart (perhaps by making HEAD requests?).
  • Ability to specify a custom metric rather than page load (i.e. window.onload)
  • Display User Timings on the chart
  • Break down "latency" into its DNS lookup, TCP connection, and SSL handshake components
  • Export of the resource timings (possibly in HAR format)

Acknowledgements

I was inspired to implement this by two separate talks at VelocityConf 2015, by Steve Souders and Allison McKnight. I also borrowed a few points from a similar script written by Andy Davies. Another influence on this is the excellent Glimpse for ASP.NET.

About

Effortlessly display performance metrics on any page

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

perfViewer.js

perfViewer.js is a script to effortlessly display performance metrics on any page. When the script is initialized, it shows a notification bar with the page load time and a link to display a waterfall chart. All of this is done in JavaScript based on the HTML5 navigation and resource timings API.

Integrating perfViewer

To use perfViewer.js on your website, simply add it to your page and initialize it from a window load event handler. For example:

<script src="scripts/perfViewer.js"></script>
<script type="text/javascript">
window.addEventListener('load', function() { perfViewer.init(); }, false);
</script>

If you want to, you can initialize it anytime after the window load event.

If perfViewer is loaded after the window load event, it assumes it is being used as a bookmarklet (see below) and will initialize itself.

Customization

There are a few customization options supported. To use these, pass an object to init() with values for any of the following properties:

  • errorThreshold - by default, perfViewer shows the load time in red if it exceeds a threshold of 2000 milliseconds. This value is customizable.
  • containerId - by default, perfViewer will create a new container div for all its contents. If you want to control where it goes, you can specify an ID.
  • useDefaultCSS - by default, perfViewer loads all its own CSS. If you are styling perfViewer yourself, set this to false.
  • includePerfViewerInWaterfall - by default, perfViewer will include itself in the waterfall diagram (unless it is loaded after the document is complete). If you want to exclude it, set this to false.

For example, to set a lower alert threshold of 1.5s, you would initialize perfViewer as follows:

window.addEventListener('load', function() { perfViewer.init({ errorThreshold: 75 }); }, false);

Custom CSS

perfViewer ships with its own CSS. If you want to customize this, go for it! All elements generated by perfViewer have classes starting with "perf-view-"...see the CSS file to get started.

If you include the CSS in an external file, you'll want to make sure to set useDefaultCSS: false in the init options.

Bookmarklet

To see perfViewer.js on any page, use the following bookmarklet. (This may not always work depending on the page's content security policy).

javascript:(function(){var el=document.createElement('script');el.type='text/javascript';el.src='https://raw.githubusercontent.com/strommen/perfViewerJS/master/perfViewer.js';document.getElementsByTagName('body')[0].appendChild(el);})();

When you activate the bookmarklet, the script will be added to the page. The script will detect that the page has already finished loading, so it will call init() on itself.

What's Next

There are a few features I'd like to add:

  • Prevent the labels for DOMContentLoaded and window.onload from obscuring other labels.
  • Indicate cross-origin resources, since their responseStart timing is always zero so we cannot measure latency.
  • Get a better workflow for modifying the CSS (rather than CSS text manually inlined into the JS file...)
  • Render everything in an iframe so it doesn't inherit styles from the original document.
  • Display resource download sizes for each row in the chart (perhaps by making HEAD requests?).
  • Ability to specify a custom metric rather than page load (i.e. window.onload)
  • Display User Timings on the chart
  • Break down "latency" into its DNS lookup, TCP connection, and SSL handshake components
  • Export of the resource timings (possibly in HAR format)

Acknowledgements

I was inspired to implement this by two separate talks at VelocityConf 2015, by Steve Souders and Allison McKnight. I also borrowed a few points from a similar script written by Andy Davies. Another influence on this is the excellent Glimpse for ASP.NET.

About

Effortlessly display performance metrics on any page

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

perfViewer.js

perfViewer.js is a script to effortlessly display performance metrics on any page. When the script is initialized, it shows a notification bar with the page load time and a link to display a waterfall chart. All of this is done in JavaScript based on the HTML5 navigation and resource timings API.

Integrating perfViewer

To use perfViewer.js on your website, simply add it to your page and initialize it from a window load event handler. For example:

<script src="scripts/perfViewer.js"></script>
<script type="text/javascript">
window.addEventListener('load', function() { perfViewer.init(); }, false);
</script>

If you want to, you can initialize it anytime after the window load event.

If perfViewer is loaded after the window load event, it assumes it is being used as a bookmarklet (see below) and will initialize itself.

Customization

There are a few customization options supported. To use these, pass an object to init() with values for any of the following properties:

  • errorThreshold - by default, perfViewer shows the load time in red if it exceeds a threshold of 2000 milliseconds. This value is customizable.
  • containerId - by default, perfViewer will create a new container div for all its contents. If you want to control where it goes, you can specify an ID.
  • useDefaultCSS - by default, perfViewer loads all its own CSS. If you are styling perfViewer yourself, set this to false.
  • includePerfViewerInWaterfall - by default, perfViewer will include itself in the waterfall diagram (unless it is loaded after the document is complete). If you want to exclude it, set this to false.

For example, to set a lower alert threshold of 1.5s, you would initialize perfViewer as follows:

window.addEventListener('load', function() { perfViewer.init({ errorThreshold: 75 }); }, false);

Custom CSS

perfViewer ships with its own CSS. If you want to customize this, go for it! All elements generated by perfViewer have classes starting with "perf-view-"...see the CSS file to get started.

If you include the CSS in an external file, you'll want to make sure to set useDefaultCSS: false in the init options.

Bookmarklet

To see perfViewer.js on any page, use the following bookmarklet. (This may not always work depending on the page's content security policy).

javascript:(function(){var el=document.createElement('script');el.type='text/javascript';el.src='https://raw.githubusercontent.com/strommen/perfViewerJS/master/perfViewer.js';document.getElementsByTagName('body')[0].appendChild(el);})();

When you activate the bookmarklet, the script will be added to the page. The script will detect that the page has already finished loading, so it will call init() on itself.

What's Next

There are a few features I'd like to add:

  • Prevent the labels for DOMContentLoaded and window.onload from obscuring other labels.
  • Indicate cross-origin resources, since their responseStart timing is always zero so we cannot measure latency.
  • Get a better workflow for modifying the CSS (rather than CSS text manually inlined into the JS file...)
  • Render everything in an iframe so it doesn't inherit styles from the original document.
  • Display resource download sizes for each row in the chart (perhaps by making HEAD requests?).
  • Ability to specify a custom metric rather than page load (i.e. window.onload)
  • Display User Timings on the chart
  • Break down "latency" into its DNS lookup, TCP connection, and SSL handshake components
  • Export of the resource timings (possibly in HAR format)

Acknowledgements

I was inspired to implement this by two separate talks at VelocityConf 2015, by Steve Souders and Allison McKnight. I also borrowed a few points from a similar script written by Andy Davies. Another influence on this is the excellent Glimpse for ASP.NET.

About

Effortlessly display performance metrics on any page

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

perfViewer.js

perfViewer.js is a script to effortlessly display performance metrics on any page. When the script is initialized, it shows a notification bar with the page load time and a link to display a waterfall chart. All of this is done in JavaScript based on the HTML5 navigation and resource timings API.

Integrating perfViewer

To use perfViewer.js on your website, simply add it to your page and initialize it from a window load event handler. For example:

<script src="scripts/perfViewer.js"></script>
<script type="text/javascript">
window.addEventListener('load', function() { perfViewer.init(); }, false);
</script>

If you want to, you can initialize it anytime after the window load event.

If perfViewer is loaded after the window load event, it assumes it is being used as a bookmarklet (see below) and will initialize itself.

Customization

There are a few customization options supported. To use these, pass an object to init() with values for any of the following properties:

  • errorThreshold - by default, perfViewer shows the load time in red if it exceeds a threshold of 2000 milliseconds. This value is customizable.
  • containerId - by default, perfViewer will create a new container div for all its contents. If you want to control where it goes, you can specify an ID.
  • useDefaultCSS - by default, perfViewer loads all its own CSS. If you are styling perfViewer yourself, set this to false.
  • includePerfViewerInWaterfall - by default, perfViewer will include itself in the waterfall diagram (unless it is loaded after the document is complete). If you want to exclude it, set this to false.

For example, to set a lower alert threshold of 1.5s, you would initialize perfViewer as follows:

window.addEventListener('load', function() { perfViewer.init({ errorThreshold: 75 }); }, false);

Custom CSS

perfViewer ships with its own CSS. If you want to customize this, go for it! All elements generated by perfViewer have classes starting with "perf-view-"...see the CSS file to get started.

If you include the CSS in an external file, you'll want to make sure to set useDefaultCSS: false in the init options.

Bookmarklet

To see perfViewer.js on any page, use the following bookmarklet. (This may not always work depending on the page's content security policy).

javascript:(function(){var el=document.createElement('script');el.type='text/javascript';el.src='https://raw.githubusercontent.com/strommen/perfViewerJS/master/perfViewer.js';document.getElementsByTagName('body')[0].appendChild(el);})();

When you activate the bookmarklet, the script will be added to the page. The script will detect that the page has already finished loading, so it will call init() on itself.

What's Next

There are a few features I'd like to add:

  • Prevent the labels for DOMContentLoaded and window.onload from obscuring other labels.
  • Indicate cross-origin resources, since their responseStart timing is always zero so we cannot measure latency.
  • Get a better workflow for modifying the CSS (rather than CSS text manually inlined into the JS file...)
  • Render everything in an iframe so it doesn't inherit styles from the original document.
  • Display resource download sizes for each row in the chart (perhaps by making HEAD requests?).
  • Ability to specify a custom metric rather than page load (i.e. window.onload)
  • Display User Timings on the chart
  • Break down "latency" into its DNS lookup, TCP connection, and SSL handshake components
  • Export of the resource timings (possibly in HAR format)

Acknowledgements

I was inspired to implement this by two separate talks at VelocityConf 2015, by Steve Souders and Allison McKnight. I also borrowed a few points from a similar script written by Andy Davies. Another influence on this is the excellent Glimpse for ASP.NET.

About

Effortlessly display performance metrics on any page

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

perfViewer.js

perfViewer.js is a script to effortlessly display performance metrics on any page. When the script is initialized, it shows a notification bar with the page load time and a link to display a waterfall chart. All of this is done in JavaScript based on the HTML5 navigation and resource timings API.

Integrating perfViewer

To use perfViewer.js on your website, simply add it to your page and initialize it from a window load event handler. For example:

<script src="scripts/perfViewer.js"></script>
<script type="text/javascript">
window.addEventListener('load', function() { perfViewer.init(); }, false);
</script>

If you want to, you can initialize it anytime after the window load event.

If perfViewer is loaded after the window load event, it assumes it is being used as a bookmarklet (see below) and will initialize itself.

Customization

There are a few customization options supported. To use these, pass an object to init() with values for any of the following properties:

  • errorThreshold - by default, perfViewer shows the load time in red if it exceeds a threshold of 2000 milliseconds. This value is customizable.
  • containerId - by default, perfViewer will create a new container div for all its contents. If you want to control where it goes, you can specify an ID.
  • useDefaultCSS - by default, perfViewer loads all its own CSS. If you are styling perfViewer yourself, set this to false.
  • includePerfViewerInWaterfall - by default, perfViewer will include itself in the waterfall diagram (unless it is loaded after the document is complete). If you want to exclude it, set this to false.

For example, to set a lower alert threshold of 1.5s, you would initialize perfViewer as follows:

window.addEventListener('load', function() { perfViewer.init({ errorThreshold: 75 }); }, false);

Custom CSS

perfViewer ships with its own CSS. If you want to customize this, go for it! All elements generated by perfViewer have classes starting with "perf-view-"...see the CSS file to get started.

If you include the CSS in an external file, you'll want to make sure to set useDefaultCSS: false in the init options.

Bookmarklet

To see perfViewer.js on any page, use the following bookmarklet. (This may not always work depending on the page's content security policy).

javascript:(function(){var el=document.createElement('script');el.type='text/javascript';el.src='https://raw.githubusercontent.com/strommen/perfViewerJS/master/perfViewer.js';document.getElementsByTagName('body')[0].appendChild(el);})();

When you activate the bookmarklet, the script will be added to the page. The script will detect that the page has already finished loading, so it will call init() on itself.

What's Next

There are a few features I'd like to add:

  • Prevent the labels for DOMContentLoaded and window.onload from obscuring other labels.
  • Indicate cross-origin resources, since their responseStart timing is always zero so we cannot measure latency.
  • Get a better workflow for modifying the CSS (rather than CSS text manually inlined into the JS file...)
  • Render everything in an iframe so it doesn't inherit styles from the original document.
  • Display resource download sizes for each row in the chart (perhaps by making HEAD requests?).
  • Ability to specify a custom metric rather than page load (i.e. window.onload)
  • Display User Timings on the chart
  • Break down "latency" into its DNS lookup, TCP connection, and SSL handshake components
  • Export of the resource timings (possibly in HAR format)

Acknowledgements

I was inspired to implement this by two separate talks at VelocityConf 2015, by Steve Souders and Allison McKnight. I also borrowed a few points from a similar script written by Andy Davies. Another influence on this is the excellent Glimpse for ASP.NET.

About

Effortlessly display performance metrics on any page

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

perfViewer.js

perfViewer.js is a script to effortlessly display performance metrics on any page. When the script is initialized, it shows a notification bar with the page load time and a link to display a waterfall chart. All of this is done in JavaScript based on the HTML5 navigation and resource timings API.

Integrating perfViewer

To use perfViewer.js on your website, simply add it to your page and initialize it from a window load event handler. For example:

<script src="scripts/perfViewer.js"></script>
<script type="text/javascript">
window.addEventListener('load', function() { perfViewer.init(); }, false);
</script>

If you want to, you can initialize it anytime after the window load event.

If perfViewer is loaded after the window load event, it assumes it is being used as a bookmarklet (see below) and will initialize itself.

Customization

There are a few customization options supported. To use these, pass an object to init() with values for any of the following properties:

  • errorThreshold - by default, perfViewer shows the load time in red if it exceeds a threshold of 2000 milliseconds. This value is customizable.
  • containerId - by default, perfViewer will create a new container div for all its contents. If you want to control where it goes, you can specify an ID.
  • useDefaultCSS - by default, perfViewer loads all its own CSS. If you are styling perfViewer yourself, set this to false.
  • includePerfViewerInWaterfall - by default, perfViewer will include itself in the waterfall diagram (unless it is loaded after the document is complete). If you want to exclude it, set this to false.

For example, to set a lower alert threshold of 1.5s, you would initialize perfViewer as follows:

window.addEventListener('load', function() { perfViewer.init({ errorThreshold: 75 }); }, false);

Custom CSS

perfViewer ships with its own CSS. If you want to customize this, go for it! All elements generated by perfViewer have classes starting with "perf-view-"...see the CSS file to get started.

If you include the CSS in an external file, you'll want to make sure to set useDefaultCSS: false in the init options.

Bookmarklet

To see perfViewer.js on any page, use the following bookmarklet. (This may not always work depending on the page's content security policy).

javascript:(function(){var el=document.createElement('script');el.type='text/javascript';el.src='https://raw.githubusercontent.com/strommen/perfViewerJS/master/perfViewer.js';document.getElementsByTagName('body')[0].appendChild(el);})();

When you activate the bookmarklet, the script will be added to the page. The script will detect that the page has already finished loading, so it will call init() on itself.

What's Next

There are a few features I'd like to add:

  • Prevent the labels for DOMContentLoaded and window.onload from obscuring other labels.
  • Indicate cross-origin resources, since their responseStart timing is always zero so we cannot measure latency.
  • Get a better workflow for modifying the CSS (rather than CSS text manually inlined into the JS file...)
  • Render everything in an iframe so it doesn't inherit styles from the original document.
  • Display resource download sizes for each row in the chart (perhaps by making HEAD requests?).
  • Ability to specify a custom metric rather than page load (i.e. window.onload)
  • Display User Timings on the chart
  • Break down "latency" into its DNS lookup, TCP connection, and SSL handshake components
  • Export of the resource timings (possibly in HAR format)

Acknowledgements

I was inspired to implement this by two separate talks at VelocityConf 2015, by Steve Souders and Allison McKnight. I also borrowed a few points from a similar script written by Andy Davies. Another influence on this is the excellent Glimpse for ASP.NET.

About

Effortlessly display performance metrics on any page

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

perfViewer.js

perfViewer.js is a script to effortlessly display performance metrics on any page. When the script is initialized, it shows a notification bar with the page load time and a link to display a waterfall chart. All of this is done in JavaScript based on the HTML5 navigation and resource timings API.

Integrating perfViewer

To use perfViewer.js on your website, simply add it to your page and initialize it from a window load event handler. For example:

<script src="scripts/perfViewer.js"></script>
<script type="text/javascript">
window.addEventListener('load', function() { perfViewer.init(); }, false);
</script>

If you want to, you can initialize it anytime after the window load event.

If perfViewer is loaded after the window load event, it assumes it is being used as a bookmarklet (see below) and will initialize itself.

Customization

There are a few customization options supported. To use these, pass an object to init() with values for any of the following properties:

  • errorThreshold - by default, perfViewer shows the load time in red if it exceeds a threshold of 2000 milliseconds. This value is customizable.
  • containerId - by default, perfViewer will create a new container div for all its contents. If you want to control where it goes, you can specify an ID.
  • useDefaultCSS - by default, perfViewer loads all its own CSS. If you are styling perfViewer yourself, set this to false.
  • includePerfViewerInWaterfall - by default, perfViewer will include itself in the waterfall diagram (unless it is loaded after the document is complete). If you want to exclude it, set this to false.

For example, to set a lower alert threshold of 1.5s, you would initialize perfViewer as follows:

window.addEventListener('load', function() { perfViewer.init({ errorThreshold: 75 }); }, false);

Custom CSS

perfViewer ships with its own CSS. If you want to customize this, go for it! All elements generated by perfViewer have classes starting with "perf-view-"...see the CSS file to get started.

If you include the CSS in an external file, you'll want to make sure to set useDefaultCSS: false in the init options.

Bookmarklet

To see perfViewer.js on any page, use the following bookmarklet. (This may not always work depending on the page's content security policy).

javascript:(function(){var el=document.createElement('script');el.type='text/javascript';el.src='https://raw.githubusercontent.com/strommen/perfViewerJS/master/perfViewer.js';document.getElementsByTagName('body')[0].appendChild(el);})();

When you activate the bookmarklet, the script will be added to the page. The script will detect that the page has already finished loading, so it will call init() on itself.

What's Next

There are a few features I'd like to add:

  • Prevent the labels for DOMContentLoaded and window.onload from obscuring other labels.
  • Indicate cross-origin resources, since their responseStart timing is always zero so we cannot measure latency.
  • Get a better workflow for modifying the CSS (rather than CSS text manually inlined into the JS file...)
  • Render everything in an iframe so it doesn't inherit styles from the original document.
  • Display resource download sizes for each row in the chart (perhaps by making HEAD requests?).
  • Ability to specify a custom metric rather than page load (i.e. window.onload)
  • Display User Timings on the chart
  • Break down "latency" into its DNS lookup, TCP connection, and SSL handshake components
  • Export of the resource timings (possibly in HAR format)

Acknowledgements

I was inspired to implement this by two separate talks at VelocityConf 2015, by Steve Souders and Allison McKnight. I also borrowed a few points from a similar script written by Andy Davies. Another influence on this is the excellent Glimpse for ASP.NET.

About

Effortlessly display performance metrics on any page

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

perfViewer.js

perfViewer.js is a script to effortlessly display performance metrics on any page. When the script is initialized, it shows a notification bar with the page load time and a link to display a waterfall chart. All of this is done in JavaScript based on the HTML5 navigation and resource timings API.

Integrating perfViewer

To use perfViewer.js on your website, simply add it to your page and initialize it from a window load event handler. For example:

<script src="scripts/perfViewer.js"></script>
<script type="text/javascript">
window.addEventListener('load', function() { perfViewer.init(); }, false);
</script>

If you want to, you can initialize it anytime after the window load event.

If perfViewer is loaded after the window load event, it assumes it is being used as a bookmarklet (see below) and will initialize itself.

Customization

There are a few customization options supported. To use these, pass an object to init() with values for any of the following properties:

  • errorThreshold - by default, perfViewer shows the load time in red if it exceeds a threshold of 2000 milliseconds. This value is customizable.
  • containerId - by default, perfViewer will create a new container div for all its contents. If you want to control where it goes, you can specify an ID.
  • useDefaultCSS - by default, perfViewer loads all its own CSS. If you are styling perfViewer yourself, set this to false.
  • includePerfViewerInWaterfall - by default, perfViewer will include itself in the waterfall diagram (unless it is loaded after the document is complete). If you want to exclude it, set this to false.

For example, to set a lower alert threshold of 1.5s, you would initialize perfViewer as follows:

window.addEventListener('load', function() { perfViewer.init({ errorThreshold: 75 }); }, false);

Custom CSS

perfViewer ships with its own CSS. If you want to customize this, go for it! All elements generated by perfViewer have classes starting with "perf-view-"...see the CSS file to get started.

If you include the CSS in an external file, you'll want to make sure to set useDefaultCSS: false in the init options.

Bookmarklet

To see perfViewer.js on any page, use the following bookmarklet. (This may not always work depending on the page's content security policy).

javascript:(function(){var el=document.createElement('script');el.type='text/javascript';el.src='https://raw.githubusercontent.com/strommen/perfViewerJS/master/perfViewer.js';document.getElementsByTagName('body')[0].appendChild(el);})();

When you activate the bookmarklet, the script will be added to the page. The script will detect that the page has already finished loading, so it will call init() on itself.

What's Next

There are a few features I'd like to add:

  • Prevent the labels for DOMContentLoaded and window.onload from obscuring other labels.
  • Indicate cross-origin resources, since their responseStart timing is always zero so we cannot measure latency.
  • Get a better workflow for modifying the CSS (rather than CSS text manually inlined into the JS file...)
  • Render everything in an iframe so it doesn't inherit styles from the original document.
  • Display resource download sizes for each row in the chart (perhaps by making HEAD requests?).
  • Ability to specify a custom metric rather than page load (i.e. window.onload)
  • Display User Timings on the chart
  • Break down "latency" into its DNS lookup, TCP connection, and SSL handshake components
  • Export of the resource timings (possibly in HAR format)

Acknowledgements

I was inspired to implement this by two separate talks at VelocityConf 2015, by Steve Souders and Allison McKnight. I also borrowed a few points from a similar script written by Andy Davies. Another influence on this is the excellent Glimpse for ASP.NET.

About

Effortlessly display performance metrics on any page

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages