<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>browsers &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/browsers/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Fri, 08 Aug 2025 07:07:21 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>browsers &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[To download this page, click here]]></title>
		<link>https://shkspr.mobi/blog/2021/08/to-download-this-page-click-here/</link>
					<comments>https://shkspr.mobi/blog/2021/08/to-download-this-page-click-here/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 08 Aug 2021 11:16:10 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[HTML5]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=39797</guid>

					<description><![CDATA[💾 Download this page!  What&#039;s going on behind the scenes?  Here&#039;s the code. Note - it doesn&#039;t require thousands of imported NPM libraries, a complex Docker set-up, or any AI-on-the-blockchain.  &#60;a href=&#34;&#34; download=&#34;this.html&#34;&#62;Download this page&#60;/a&#62;   HTML 5 introduced a new attribute for the anchor element - download.  Rather than having to set your server up with Content Disposition headers - yo…]]></description>
										<content:encoded><![CDATA[<p><span style="font-size:2em;"><a href="" download="this.html">💾 Download this page!</a></span></p>

<p>What's going on behind the scenes?</p>

<p>Here's the code. Note - it doesn't require thousands of imported NPM libraries, a complex Docker set-up, or any AI-on-the-blockchain.</p>

<pre><code class="language-HTML">&lt;a href="" download="this.html"&gt;Download this page&lt;/a&gt;
</code></pre>

<p>HTML 5 introduced a new attribute for the anchor element - <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download"><code>download</code></a>.</p>

<p>Rather than having to set your server up with <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition">Content Disposition headers</a> - you can tell the browser that a click should result in a download, rather than displaying the contents in the browser.</p>

<p>This is usually used for things like downloading images.  For example:</p>

<pre><code class="language-HTML">&lt;a href="/pictures/kitten.jpg" download&gt;Download a kitten photo!!!&lt;/a&gt;
</code></pre>

<p>The mere presence of <code>download</code> in the anchor tells the browser to open up the "save" dialogue.</p>

<p>If you add a value to the attribute, you can tell the browser what the file should be called:</p>

<pre><code class="language-HTML">&lt;a href="/6f12ec75-c4ff-401e-a542" download="puppy.png"&gt;Download a random puppy!&lt;/a&gt;
</code></pre>

<p>If the <code>href</code> value is empty, the browser understands that to mean "the current page". When combined with <code>download</code> - the browser requests the page and delivers it as a download.</p>

<h2 id="why-is-this-useful"><a href="https://shkspr.mobi/blog/2021/08/to-download-this-page-click-here/#why-is-this-useful">Why is this useful?</a></h2>

<p>At work, we were discussing how we could a "Download this page" link to pages. Normally, it would have involved telling the user how to use File ➡ Save As on a variety of systems. Or reconfiguring the back-end so that adding a <code>GET</code> parameter to a URl would trigger a download.</p>

<p>But, with this little scrap of code, we don't need to change anything. It's an extra line of HTML somewhere on the page.</p>

<p>It's a pity there's no way to <a href="https://shkspr.mobi/blog/2021/08/you-dont-need-external-assets-in-an-html-file/">automatically in-line all the content of a page</a> to make a self-contained asset.  There's a <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1235248">feature request on Chromium</a> to make this possible. But, for now, it works really well for downloading pages which are mostly text.</p>

<p>🛈 <a href="https://www.w3.org/QA/Tips/noClickHere">Please don't use the phrase "Click Here" on your links</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=39797&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/08/to-download-this-page-click-here/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[I know how many microphones and cameras you have]]></title>
		<link>https://shkspr.mobi/blog/2020/12/i-know-how-many-microphones-and-cameras-you-have/</link>
					<comments>https://shkspr.mobi/blog/2020/12/i-know-how-many-microphones-and-cameras-you-have/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 22 Dec 2020 12:46:47 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37591</guid>

					<description><![CDATA[A curious little data leak, but one I struggle to care about. Perhaps useful for a bit of fingerprinting?  Websites can access your system&#039;s camera and microphone. That&#039;s how modern video conferencing works in the browser. In an effort to retain user privacy, the browser asks the user for permission to use the camera and mics. No audio or video will be sent until the user agrees.  But some…]]></description>
										<content:encoded><![CDATA[<p>A curious little data leak, but one I struggle to care about. Perhaps useful for a bit of fingerprinting?</p>

<p>Websites can access your system's camera and microphone. That's how modern video conferencing works in the browser. In an effort to retain user privacy, the browser asks the user for permission to use the camera and mics. No audio or video will be sent until the user agrees.</p>

<p>But some metadata gets shared <em>before</em> you agree!</p>

<p>Visit the <a href="https://www.webrtc-experiment.com/DetectRTC/">WebRTC Detection Experiment site</a>. You'll notice that <em>without</em> you agreeing, the site is able to determine how many microphones you have:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/12/Mic-detection.png" alt="Web browser asking for permission to access microphones. On the page, the number of microphones is displayed." width="410" class="aligncenter size-full wp-image-37593">

<p>And how many cameras you have:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/12/Cameras.png" alt="Web page showing the device has two cameras, but that webcam permission hasn't been set." width="410" class="aligncenter size-full wp-image-37594"></p>

<p>Having two cameras is perhaps a reasonable proxy for being a mobile phone / tablet.  One main cam, one selfie cam.</p>

<p>Multiple microphones could be an indicator that the user is on a laptop. Built in microphone and an external USB microphone. Although some phones also present multiple microphones.</p>

<p>The names of the devices aren't sent until <em>after</em> you agree to the permission prompt.</p>

<p>There are inconsistencies between browsers:</p>

<table>
<thead>
<tr>
  <th></th>
  <th align="center">FireFox</th>
  <th align="center">Chrome</th>
</tr>
</thead>
<tbody>
<tr>
  <td>Laptop</td>
  <td align="center">3 mics, 1 camera</td>
  <td align="center">1 mic,  1 camera</td>
</tr>
<tr>
  <td>Android</td>
  <td align="center">1 mic, 2 cameras</td>
  <td align="center">3 mics, 2 cameras</td>
</tr>
</tbody>
</table>

<p>It is <em>useful</em> to present to the user a selection of input devices. But does the site need to know how many devices are attached <em>before</em> permission has been granted?</p>

<p>The way the iPhone does it, is to present a fake set of data - one mic and one camera - until permission has been granted. Then it shows the real information.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/12/iPhone-WebRTC-testing-fs8.png" alt="Screenshots of the iPhone showing fake data until permission is granted." width="927" height="888" class="aligncenter size-full wp-image-37618">

<p>Personally, I think the browser should only indicate a boolean to the site that AV inputs are available. Once permission is granted, then the site can request the number of devices and their names.</p>

<p>What do you reckon?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37591&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/12/i-know-how-many-microphones-and-cameras-you-have/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[This blog strips off for CSS Naked Day]]></title>
		<link>https://shkspr.mobi/blog/2020/04/this-blog-strips-off-for-css-naked-day/</link>
					<comments>https://shkspr.mobi/blog/2020/04/this-blog-strips-off-for-css-naked-day/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 09 Apr 2020 06:15:35 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[CSS Naked Day]]></category>
		<category><![CDATA[HTML5]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=34631</guid>

					<description><![CDATA[Half-a-dozen years ago, I proposed that web developers spend one day a year browsing without JavaScript.  It&#039;s a great way to see how the web works when things break.  Similarly, April 9th is CSS Naked Day. A chance to throw off the shackles of good design, and see the raw beauty of your HTML.  Today is intended for websites to remove their own style sheets - as this blog has done.  The idea…]]></description>
										<content:encoded><![CDATA[<p>Half-a-dozen years ago, I proposed that web developers spend <a href="https://shkspr.mobi/blog/2013/11/no-javascript-day/">one day a year browsing without JavaScript</a>.  It's a great way to see how the web works when things break.</p>

<p>Similarly, April 9th is <a href="https://css-naked-day.github.io/">CSS Naked Day</a>. A chance to throw off the shackles of good design, and see the raw beauty of your HTML.  Today is intended for websites to remove their own style sheets - as this blog has done.</p>

<blockquote><p>The idea behind this event is to promote Web Standards. Plain and simple. This includes proper use of HTML, semantic markup, a good hierarchy structure, and of course, a good old play on words. It's time to show off your <code>&lt;body&gt;</code> for what it really is.</p></blockquote>

<p>But I'd like to go a step further. Turn off page styles while browsing the web. Do it now!  On Firefox, it's easy:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/04/Firefox-menu-fs8.png" alt="Firefox menu. Go to View, the Page Style, then No Style." width="518" height="239" class="aligncenter size-full wp-image-34632">

<p>You can't change user styles in Chrome. <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=347016">Because Google hates giving users a choice</a>. So open up the Developer tools and paste this into the console:</p>

<pre><code class="language-_">for (var style in styles = document.styleSheets)
    styles[style].disabled = true;
</code></pre>

<p>Take a look around the web. Who is using CSS when they could be using semantic HTML? Which sites hide loads of crap from users. What weird things are being stuffed in their markup? How well does your site work if there's a glitch and the CSS doesn't load? What would the web be like if it were unstyled?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=34631&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/04/this-blog-strips-off-for-css-naked-day/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Zoom's forced app is irresponsible]]></title>
		<link>https://shkspr.mobi/blog/2020/03/zooms-forced-app-is-irresponsible/</link>
					<comments>https://shkspr.mobi/blog/2020/03/zooms-forced-app-is-irresponsible/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 17 Mar 2020 12:46:14 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[wfh]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=34441</guid>

					<description><![CDATA[Due to COVID19, I&#039;m using a wide range of video conferencing services. Those of us who have work-supplied laptops usually have locked-down hardware. No unauthorised apps can be installed.  That&#039;s not a problem for Google Hangouts - it just works in any browser. No need to install plugins or apps. Voice and video just work.  But Zoom - one of the most used VC services - falsely claims that users…]]></description>
										<content:encoded><![CDATA[<p>Due to COVID19, I'm using a wide range of video conferencing services. Those of us who have work-supplied laptops usually have locked-down hardware. No unauthorised apps can be installed.</p>

<p>That's not a problem for Google Hangouts - it just works in any browser. No need to install plugins or apps. Voice and video <em>just work.</em></p>

<p>But Zoom - one of the most used VC services - falsely claims that users need to install an app to use it.  I've had frustrated colleagues express their displeasure that they can't install an app and, therefore, have to dial in on a phone and can't see any slides.</p>

<p>Here's the thing. Zoom supports web browsers. It just hides it really well.  Only after attempting to download the app, and then waiting for a few seconds, do you get this <em>tiny</em> message saying you can join in the browser:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/03/Screenshot_2020-03-16-Join-our-Cloud-HD-Video-Meeting-now.png" alt="Screenshot of the Zoom Website." width="511" height="252" class="aligncenter size-full wp-image-34442">

<p>That's annoying and, frankly, irresponsible. People urgently need to get on calls and Zoom is deliberately making it hard to do. WebRTC works. It works really well across browsers. I'm sure the Zoom app is marvellous. But it is useless if people can't install it.</p>

<p>If you want to share a direct link to a call, use this:</p>

<p><code>https://whatever.zoom.us/wc/join/123456?pwd=</code></p>

<p>Replace the <code>whatever</code> with your company name and <code>123456</code> with your Zoom's conference ID.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=34441&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/03/zooms-forced-app-is-irresponsible/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
	</channel>
</rss>
