MHTML and Data URIs in the same CSS file is totally doable and gives us nice support for IE6+ and all modern browsers. But the question is - what about inline styles. In other words can you have a single-request web application which bundles together markup, inline styles, inline scripts, inline images? With data URIs - yes, clearly. But MHTML?
I remember hacker extraordinaire Hedger Wang coming up with a test page, which proved it's doable. Problems with the test are that a/ I can't find the page anymore, his domain has expired b/ there was some funky IE7/Vista stuff (probably now solvable) in there which even included an undesired redirect c/ was complex - the whole HTML becomes a multipart document, if I remember correctly there was something that required html served as text/plain....
So I tried something simple - shove an MHTML doc inside an inline style comment. It so totally worked! Including IE6 and IE8 in IE7 mode on Windows 7 (which in my experience behaves as badly as IE7 proper on Vista)
Here's the test page. Look ma', no extra HTTP requests 🙂
So it's a simple HTML doc:
<!doctype html> <html> <head> <title>Look Ma' No HTTP requests</title> <style type="text/css"> /* magic here */ </style> </head> <body> <h1>MHTML + Data:URIs inline in a <code>style</code> element</h1> <p class="image1">hello<br>hello</p> <p class="image2">bonjour<br>bonjour</p> </body> </html>
And the magic is two parts: the MHTML doc inside a CSS comment and the actual CSS which uses data URIs for normal browsers and refers to the MHTML parts in IE6,7.
/* Content-Type: multipart/related; boundary="_" --_ Content-Location:locoloco Content-Transfer-Encoding:base64 iVBORw0KGgoAAAAN ... [more crazyness]... QmCC --_ Content-Location:polloloco Content-Transfer-Encoding:base64 iVBORw0KGgoAAAANSUh ... [moarrr] ... ggg== --_-- */ .image1 { background-image: url("data:image/png;base64,iVBORw0KGgoAAAAN ... QmCC"); *background-image: url(mhtml:http://phpied.com/files/mhtml/mhtml-html.html!locoloco); } .image2 { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUh ... ggg=="); *background-image: url(mhtml:http://phpied.com/files/mhtml/mhtml-html.html!polloloco); } body { font: bold 24px Arial; }
How cool is that!
Please report any issues you might find in any browser/os combination
The obvious drawback is repeating the long base64'd image content twice, but it's solvable with either server-side sniffing or... one crazy hack, found on the Russian site habrahabr.ru. I should talk about it separately and help spread the word to the larger English-speaking audience, but for the impatient - click!
So there you go - MHTML inline in CSS inline in HTML or building single-request x-browser web apps 🙂
Comments? Find me on BlueSky, Mastodon, LinkedIn, Threads, Twitter