<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">IEBlog</title><subtitle type="html">Windows Internet Explorer Engineering Team Blog</subtitle><id>http://blogs.msdn.com/b/ie/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/ie/atom.aspx" /><generator uri="http://telligent.com" version="5.6.583.20496">Telligent Community 5.6.583.20496 (Build: 5.6.583.20496)</generator><updated>2011-10-31T15:42:13Z</updated><entry><title>CORS for XHR in IE10</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/02/09/cors-for-xhr-in-ie10.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/02/09/cors-for-xhr-in-ie10.aspx</id><published>2012-02-10T00:08:17Z</published><updated>2012-02-10T00:08:17Z</updated><content type="html">&lt;p&gt;The &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/11/29/html5-for-applications-the-fourth-ie10-platform-preview.aspx"&gt;fourth platform of IE10&lt;/a&gt; simplifies building cross-site scenarios that work consistently across browsers by supporting &lt;a href="http://dvcs.w3.org/hg/cors/raw-file/tip/Overview.html"&gt;Cross-Origin Resource Sharing (CORS)&lt;/a&gt; for &lt;a href="http://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html"&gt;XMLHttpRequest (XHR)&lt;/a&gt;. CORS for XHR makes sharing data across sites simple and flexible. In the most basic scenario CORS enables creating data sources accessible from any site, and with a few small tweaks you can choose to constrain allowed sites, support data modification, and even allow authentication. Most importantly CORS keeps existing sites secure by requiring server participation. &lt;/p&gt;
&lt;h2&gt;Simple Cross-Origin XHR&lt;/h2&gt;
&lt;p&gt;Let’s look at how a cross-origin XHR request compares to a same-origin request. From script, the only difference is the URL passed to the open method. For example, say we’re working on a script that fetches a list of photo albums. &lt;/p&gt;
&lt;h3&gt;Traditional XHR&lt;/h3&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Script running on http://photos.contoso.com&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; xhr = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.onerror = _handleError;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.onload = _handleLoad;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.open(&lt;span style="color: Maroon;"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;&amp;quot;/albums&amp;quot;&lt;/span&gt;, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.send();&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;Now we want to access the list of albums from another origin. The other origin can be a completely different domain or a different host with the same base domain. Either way, just pointing at the full URL from another site is enough to get the browser to automatically send a CORS request. &lt;/p&gt;
&lt;h3&gt;CORS-Enabled XHR&lt;/h3&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Script running on &lt;span style="background-color: yellow;"&gt;http://www.contoso.com&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; xhr = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.onerror = _handleError;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.onload = _handleLoad;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.open(&lt;span style="color: Maroon;"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;&amp;quot;&lt;span style="background-color: yellow;"&gt;http://photos.contoso.com/albums&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.send();&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;Sites can provide fallback for older browsers by wrapping this in feature detection. Checking for “&lt;code&gt;withCredentials&lt;/code&gt;” is the best approach since it directly relates to CORS support for XHR. &lt;/p&gt;
&lt;h3&gt;CORS-Enabled XHR with Feature Detection&lt;/h3&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Script running on http://www.contoso.com&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; xhr = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="background-color: yellow;"&gt;&lt;span style="color: Blue;"&gt;if&lt;/span&gt; (&lt;span style="color: Maroon;"&gt;&amp;quot;withCredentials&amp;quot;&lt;/span&gt; &lt;span style="color: Blue;"&gt;in&lt;/span&gt; xhr) {&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;xhr.onerror = _handleError;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;xhr.onload = _handleLoad;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;xhr.open(&lt;span style="color: Maroon;"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;&amp;quot;http://photos.contoso.com/albums&amp;quot;&lt;/span&gt;, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;xhr.send();&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="background-color: yellow;"&gt;} &lt;span style="color: Blue;"&gt;else&lt;/span&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Fallback behavior for browsers without CORS for XHR&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="background-color: yellow;"&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;At this point our client code makes a CORS request directly to "http://photos.contoso.com", but the request fails to return any data. The failure occurs because the server isn’t participating yet. Taking a quick look at the developer tools gives us an idea what went wrong. &lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Screenshot showing the F12 tools indicating no &amp;#39;Access-Control-Allow-Origin&amp;#39; header was found." src="http://ieblog.members.winisp.net/images/20120209-cfxii-image1.png" /&gt;&lt;/p&gt;
&lt;p&gt;Here we can see the server needs to send an “&lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt;” header in the response. In our scenario we’re not opening up our albums for any site to access, but want to enable access solely from “&lt;code&gt;http://www.contoso.com&lt;/code&gt;”. Doing this requires allowing the server to identify where the request originated. Examining our outgoing request reveals a new header containing precisely this information, “&lt;code&gt;Origin&lt;/code&gt;”. &lt;/p&gt;
&lt;h3&gt;Simple CORS Request Headers&lt;/h3&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;GET http://photos.contoso.com/albums HTTP/1.1&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="background-color: Yellow;"&gt;Origin: http://www.contoso.com&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;... &lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;Using this information the server can choose to limit access to any set of sites. If the server always adds an “&lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt;” header with a value of '*' then all sites will have access. For our scenario, we’ll have the server verify the origin and then set “&lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt;” to allow only “&lt;code&gt;http://www.contoso.com&lt;/code&gt;”. &lt;/p&gt;
&lt;h3&gt;Simple CORS Response Headers&lt;/h3&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;HTTP/1.1 200 OK&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="background-color: Yellow;"&gt;Access-Control-Allow-Origin: http://www.contoso.com&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;... &lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;With the above updates in place, our “&lt;code&gt;http://www.contoso.com&lt;/code&gt;” client can now access album lists from the server at “&lt;code&gt;http://photos.contoso.com&lt;/code&gt;”. &lt;/p&gt;
&lt;h2&gt;Cross-Origin XHR with Preflight&lt;/h2&gt;
&lt;p&gt;The “simple” CORS requests discussed so far are great for basic, read-only scenarios, like downloading a photo album. Taking the next step by modifying data across sites requires a bit more work on the server. For example, say we’re adding code in the client to create a new album. &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; xhr = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.onerror = _handleError;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.onload = _handleLoad;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.open(&lt;span style="color: Maroon;"&gt;&amp;quot;&lt;span style="background-color: Yellow;"&gt;PUT&lt;/span&gt;&amp;quot;&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;&amp;quot;http://photos.contoso.com/albums&amp;quot;&lt;/span&gt;, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;xhr.send(JSON.stringify({ name: &lt;span style="color: Maroon;"&gt;&amp;quot;New Album&amp;quot;&lt;/span&gt; }));&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;Running this as-is doesn’t work. Examining the network traffic reveals a request is sent, but not the one we expected. &lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Screenshot of the F12 tools showing an OPTIONS preflight request." src="http://ieblog.members.winisp.net/images/20120209-cfxii-image2.png" /&gt;&lt;/p&gt;
&lt;p&gt;What the browser actually sent is known as a preflight request. Preflight requests are sent before requests that may result in data modification on the server. Such requests are identified by the presence of non-simple properties as defined in the CORS specification. These properties range from certain HTTP methods like “&lt;code&gt;PUT&lt;/code&gt;” to custom HTTP headers. Browsers send preflight requests to ask the server for permission to send the actual request. In our example the browser is verifying a “&lt;code&gt;PUT&lt;/code&gt;” request is allowed. &lt;/p&gt;
&lt;h3&gt;Preflight Request&lt;/h3&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="background-color: Yellow;"&gt;OPTIONS&lt;/span&gt; http://photos.contoso.com/albums HTTP/1.1&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;Origin: http://www.contoso.com&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="background-color: Yellow;"&gt;Access-Control-Request-Method: PUT&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;... &lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;Getting the browser to send the actual request requires some changes on the server. Once again we can take a look at the developer tools for more information. &lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Screenshot showing the F12 tools indicating no &amp;#39;Access-Control-Allow-Methods&amp;#39; list was found." src="http://ieblog.members.winisp.net/images/20120209-cfxii-image3.png" /&gt;&lt;/p&gt;
&lt;p&gt;The first step is to make the server recognize the “&lt;code&gt;OPTIONS&lt;/code&gt;” preflight request as distinct from other requests for the same URL. After the server verifies the preflight request by ensuring “&lt;code&gt;Access-Control-Request-Method&lt;/code&gt;” is asking for “&lt;code&gt;PUT&lt;/code&gt;” from an allowed origin, it sends the appropriate approval via the “&lt;code&gt;Access-Control-Allow-Methods&lt;/code&gt;” header. &lt;/p&gt;
&lt;h3&gt;Preflight Response&lt;/h3&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;HTTP/1.1 200 OK&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;Access-Control-Allow-Origin: http://www.contoso.com&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="background-color: Yellow;"&gt;Access-Control-Allow-Methods: PUT&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;... &lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;Once preflight is out of the way and approved the actual request takes place. &lt;/p&gt;
&lt;h3&gt;Actual Request&lt;/h3&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="background-color: Yellow;"&gt;PUT&lt;/span&gt; http://photos.contoso.com/albums HTTP/1.1&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;Origin: http://www.contoso.com&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;... &lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;Adding the album is technically complete at this point, but our client code won’t know that unless the server responds correctly. Specifically the server must still include “&lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt;” in the response. &lt;/p&gt;
&lt;h3&gt;Actual Response&lt;/h3&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;HTTP/1.1 200 OK&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;Access-Control-Allow-Origin: http://www.contoso.com&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;... &lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;With that the client can add a new album cross-origin and recognize whether or not the action completed successfully. &lt;/p&gt;
&lt;h2&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;Pairing CORS with other new platform features enables interesting scenarios. One example is the &lt;a href="http://ie.microsoft.com/testdrive/HTML5/CORSUpload/"&gt;Cross-Site Upload Test Drive&lt;/a&gt; which tracks cross-origin file uploads using CORS, XHR, FileAPI, and progress events. &lt;/p&gt;
&lt;p&gt;—Tony Ross, Program Manager, Internet Explorer &lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10266257" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="Security" scheme="http://blogs.msdn.com/b/ie/archive/tags/Security/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>High performance HTML5 content in Metro-style Apps</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/02/07/high-performance-html5-content-in-metro-style-apps.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/02/07/high-performance-html5-content-in-metro-style-apps.aspx</id><published>2012-02-07T22:33:04Z</published><updated>2012-02-07T22:33:04Z</updated><content type="html">&lt;p&gt;Metro style apps in Windows 8 have all the performance benefits of IE10 when showing Web content. In Metro style apps, Web content is always JIT compiled and hardware-accelerated. Other platforms do not provide the same level of performance in apps. For example, Cocoa apps on iOS offer significantly worse JavaScript performance (via the UIWebView control) than the same content running in Safari. These Cocoa apps do not enjoy JIT compilation, and these apps cannot show and use Web content the same way the browser on the system can:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Chart showing that Web content in an Apple iOS app is over 3 times slower than the same content in Apple Safari on the same device." src="http://ieblog.members.winisp.net/images/20120207-hphcimsa-image1.png" /&gt;&lt;br /&gt;Testing configuration: &lt;a href="http://www.webkit.org/perf/sunspider/sunspider.html"&gt;http://www.webkit.org/perf/sunspider/sunspider.html&lt;/a&gt;.&lt;br /&gt;iPad: 1st Gen, iOS 5.0.1.&lt;br /&gt;Windows 8: Developer Preview, Dell Optiplex 745, 64-bit OS.&lt;br /&gt;Kindle Fire v1.&lt;/p&gt;
&lt;h3&gt;Why is this important?&lt;/h3&gt;
&lt;p&gt;Many applications embed HTML to provide a richer and always up to date experience for consumers. For example, the developer of a restaurant guide app might want to include a live map showing the locations of the list of restaurants the user is choosing from. If you write an app on iOS, common actions like &lt;a href="http://ie.microsoft.com/testdrive/Performance/MapZooming/Default.html"&gt;panning and zooming the map&lt;/a&gt; will run twice as slow in an app compared with Safari. &lt;/p&gt;
&lt;p&gt;Anyone writing a Metro style app for Windows 8 can easily include Web content in their app. In an HTML or XAML app, just include an &amp;lt;iframe&amp;gt; element or a WebView control to get the full benefit of IE 10 performance. To see a sample HTML app that demonstrates this, check out the “Building Your First Metro Style App Using Javascript” hands-on lab at &lt;a href="http://www.buildwindows.com/Labs"&gt;http://www.buildwindows.com/Labs&lt;/a&gt;. &lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Screen shot of HTML Content from Bing Maps in an HTML Metro style app" src="http://ieblog.members.winisp.net/images/20120207-hphcimsa-image2.jpg" /&gt;&lt;br /&gt;Figure 1: HTML Content from Bing Maps in an HTML Metro Style App&lt;/p&gt;
&lt;p&gt;With Metro style apps, it’s easy to integrate many existing Web services seamlessly into your app. It’s also possible to build new services for your app that let you deliver dynamic HTML content without having to update your application. &lt;/p&gt;
&lt;p&gt;When you include Web content in your Metro style app, your app gets all the performance benefits of IE10 automatically without any additional or special work. JavaScript code continues to run fast with &lt;a href="http://blogs.msdn.com/b/ie/archive/2010/03/18/the-new-javascript-engine-in-internet-explorer-9.aspx"&gt;JIT compilation&lt;/a&gt;, and your app will automatically use GPU to accelerate HTML graphics.&lt;/p&gt;
&lt;p&gt;—Andy Zeigler, Senior Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10265156" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="Performance" scheme="http://blogs.msdn.com/b/ie/archive/tags/Performance/" /></entry><entry><title>CSS3 3D Transforms in IE10</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/02/02/css3-3d-transforms-in-ie10.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/02/02/css3-3d-transforms-in-ie10.aspx</id><published>2012-02-02T18:07:08Z</published><updated>2012-02-02T18:07:08Z</updated><content type="html">&lt;p&gt;CSS3 features make it easier to build rich and immersive Web experiences. A &lt;a
    href="http://blogs.msdn.com/b/ie/archive/2011/11/21/adding-personality-with-css3-transitions-and-animations.aspx"&gt;
    recent post&lt;/a&gt; described how Web developers add personality to their sites with
    CSS3 Transitions and Animations. &lt;a href="http://www.w3.org/TR/css3-3d-transforms/"&gt;
        CSS3 3D Transforms&lt;/a&gt; add another dimension (literally) for developers to enhance
    their sites. For example, the Windows 8 Metro style Start page uses subtle 3D transforms
    to highlight pressed tiles, as shown below.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Internet Explorer 10 tile shown not pressed (left) and pressed (right)"
        src="http://ieblog.members.winisp.net/images/20120202-ct-image3.png" /&gt;&lt;br /&gt;
    Internet Explorer 10 tile shown not pressed (left) and pressed (right)&lt;/p&gt;
&lt;h2&gt;Adding a 3rd Dimension to CSS Transforms&lt;/h2&gt;
&lt;p&gt;Like CSS3 2D Transforms, 3D Transforms provides functions and values for the CSS
    &lt;code&gt;transform&lt;/code&gt; and &lt;code&gt;transform-origin&lt;/code&gt; properties that apply geometric
    transformations operations to HTML elements. CSS 3D Transforms extends the transforms
    functions to enable 3D transforms. The &lt;code&gt;rotate()&lt;/code&gt;,&lt;code&gt; scale()&lt;/code&gt;,
    &lt;code&gt;translate()&lt;/code&gt;, &lt;code&gt;skew()&lt;/code&gt;, and &lt;code&gt;matrix()&lt;/code&gt; transform
    functions are expanded to encompass the 3D space with a z-coordinate parameter—or
    in the case of &lt;code&gt;matrix3d()&lt;/code&gt;, an extra 10 parameters—and by spawning additional
    transform functions, for example, &lt;code&gt;rotateZ()&lt;/code&gt; and &lt;code&gt;scaleZ()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A new &lt;code&gt;perspective&lt;/code&gt; transform function gives transformed elements depth
    by making distant points appear smaller.&lt;/p&gt;
&lt;p&gt;CSS3 3D Transforms also adds a few new CSS properties. In addition to the &lt;code&gt;transform&lt;/code&gt; and &lt;code&gt;transform-origin&lt;/code&gt; properties, IE10 supports vendor-prefixed &lt;code&gt;perspective&lt;/code&gt;,
    &lt;code&gt;perspective-origin&lt;/code&gt;, &lt;code&gt;backface-visibility&lt;/code&gt;, and the &lt;code&gt;flat&lt;/code&gt; value of &lt;code&gt;transform-style&lt;/code&gt;.&lt;/p&gt;
&lt;p style="padding: 4px 8px; background-color: #f0f0f0;"&gt;&lt;b&gt;Note:&lt;/b&gt; The markup examples in this post all use unprefixed properties as defined in the W3C standard. However, at this time all browsers that implement these features do so with vendor-specific prefixes. Please remember to add your browser’s prefix to the example markup when experimenting.&lt;/p&gt;
&lt;h2&gt;Perspective&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;perspective&lt;/code&gt; transform function is important for 3D transforms. It
    sets the viewer’s position and maps the viewable content onto a viewing pyramid,
    which it subsequently projects onto a 2D viewing plane. Without specifying perspective,
    all points in z-space are flattened onto the same 2D plane and there is no perception
    of depth in the resulting transform. For some transforms, such as the translation
    along the Z-axis shown below, the perspective transform function is essential for
    visibly seeing any effect from the transform.&lt;/p&gt;
&lt;p&gt;In the examples below &lt;span style="display: inline-block; width: 1em; height: 1em;
    position: relative; top: 2px; background-color: rgb(255, 235, 204); border: 1px solid rgb(153, 141, 122);"&gt;
&lt;/span&gt;&amp;nbsp;is the original, untransformed element and &lt;span style="display: inline-block;
    width: 1em; height: 1em; position: relative; top: 2px; background-color: rgb(255, 169, 41);
    border: 1px solid rgb(100, 92, 80);"&gt;&lt;/span&gt;&amp;nbsp;is the transformed element&lt;/p&gt;
&lt;table style="margin: auto; max-width: 90%;"&gt;
&lt;tr&gt;&lt;td style="width: 48%; text-align: center;"&gt;&lt;img style="max-width: 100%;" alt="Example of transform: perspective(500px) translate(0px, 0px, -300px);" src="http://ieblog.members.winisp.net/images/20120202-ct-image4.png" /&gt;&lt;/td&gt;&lt;td style="width: 4%;"&gt;&amp;nbsp;&lt;/td&gt;&lt;td style="width: 48%; text-align: center;"&gt;&lt;img style="max-width: 100%;" alt="Example of transform: translate(0px, 0px, -300px);" src="http://ieblog.members.winisp.net/images/20120202-ct-image5.png" /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;code&gt;transform: perspective(500px) &lt;span style="white-space: nowrap"&gt;translate(0px, 0px, -300px);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td style="text-align: center;"&gt;&lt;code&gt;transform: &lt;span style="white-space: nowrap"&gt;translate(0px, 0px, -300px);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan="3"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="width: 48%; text-align: center;"&gt;&lt;img style="max-width: 95%;" alt="transform: perspective(500px) rotateY(30deg);" src="http://ieblog.members.winisp.net/images/20120202-ct-image6.png" /&gt;&lt;/td&gt;&lt;td style="width: 4%;"&gt;&amp;nbsp;&lt;/td&gt;&lt;td style="width: 48%; text-align: center;"&gt;&lt;img style="max-width: 95%;" alt="Example of transform: rotateY(30deg);" src="http://ieblog.members.winisp.net/images/20120202-ct-image7.png" /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;code&gt;transform: perspective(500px) &lt;span style="white-space: nowrap"&gt;rotateY(30deg);&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td style="text-align: center;"&gt;&lt;code&gt;transform: rotateY(30deg);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;A shortcut for adding the perspective transform to several elements is to use the &lt;code&gt;perspective&lt;/code&gt; property on their parent element(s). The &lt;code&gt;perspective&lt;/code&gt; property applies the perspective transform to each of its child elements:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Example of two divs transformed by the same parent perspective property." src="http://ieblog.members.winisp.net/images/20120202-ct-image8.png" /&gt;&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#parent&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;perspective&lt;/span&gt;: &lt;span style="color: Blue;"&gt;500px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#div1&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;position&lt;/span&gt;: &lt;span style="color: Blue;"&gt;absolute&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transform-origin&lt;/span&gt;: &lt;span style="color: Blue;"&gt;0px&lt;/span&gt; &lt;span style="color: Blue;"&gt;0px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;rotateY(30deg)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#div2&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;position&lt;/span&gt;: &lt;span style="color: Blue;"&gt;absolute&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transform-origin&lt;/span&gt;: &lt;span style="color: Blue;"&gt;0px&lt;/span&gt; &lt;span style="color: Blue;"&gt;0px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;rotateY(30deg)&lt;/span&gt; &lt;span style="color: Blue;"&gt;translate(220px)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;The &lt;code&gt;perspective-origin&lt;/code&gt; property can also be used in conjunction with &lt;code&gt;perspective&lt;/code&gt; to shift the viewpoint away from the center of the element:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Illustration of the perspective-depth property." src="http://ieblog.members.winisp.net/images/20120202-ct-image9.png" /&gt;&lt;/p&gt;
&lt;p&gt;Below, you can see that shifting the perspective origin to the left makes the content to the right of the original perspective origin appear farther away.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Example of two divs transformed by the same parent perspective-depth property." src="http://ieblog.members.winisp.net/images/20120202-ct-image10.png" /&gt;&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#parent&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;perspective&lt;/span&gt;: &lt;span style="color: Blue;"&gt;500px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;perspective-origin&lt;/span&gt;: &lt;span style="color: Blue;"&gt;-300px&lt;/span&gt; &lt;span style="color: Blue;"&gt;0px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;h2&gt;backface-visibility&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;backface-visibility&lt;/code&gt; property is useful for hiding the backface of content. By default, the backface is visible and the transformed content can be seen even when flipped. But when &lt;code&gt;backface-visibility&lt;/code&gt; is set to &lt;code&gt;hidden&lt;/code&gt;, content is hidden when the element is rotated such that the front side is no longer visible. This can be useful if you want to simulate an object with multiple sides, such as the card used in the example below. By setting &lt;code&gt;backface-visibility&lt;/code&gt; to &lt;code&gt;hidden&lt;/code&gt;, it’s easy to ensure that only the front-facing sides are visible.&lt;/p&gt;
&lt;p style="margin-bottom: 0;"&gt;CSS markup:&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;.card&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;.card&lt;/span&gt; &lt;span style="color: Maroon;"&gt;div&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;position&lt;/span&gt;: &lt;span style="color: Blue;"&gt;absolute&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;width&lt;/span&gt;: &lt;span style="color: Blue;"&gt;102px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;height&lt;/span&gt;: &lt;span style="color: Blue;"&gt;143px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;.card&lt;/span&gt; &lt;span style="color: Maroon;"&gt;div:nth-child(1)&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;background-image&lt;/span&gt;: &lt;span style="color: Blue;"&gt;url(&amp;#39;redback.png&amp;#39;)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;.card&lt;/span&gt; &lt;span style="color: Maroon;"&gt;div:nth-child(2)&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;background-image&lt;/span&gt;: &lt;span style="color: Blue;"&gt;url(&amp;#39;8clubs.png&amp;#39;)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;backface-visibility&lt;/span&gt;: &lt;span style="color: Blue;"&gt;hidden&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p style="margin-bottom: 0;"&gt;HTML markup for one card:&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;div&lt;/span&gt; &lt;span style="color: Red;"&gt;class&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;card&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;div&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;"&gt;div&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;div&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;"&gt;div&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;"&gt;div&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;Creating six cards as defined above and giving each a &lt;code&gt;style="transform: rotateY(&lt;i&gt;n&lt;/i&gt;deg)"&lt;/code&gt; property with a different rotation value &lt;code&gt;&lt;i&gt;n&lt;/i&gt;&lt;/code&gt;, results in this:&lt;/p&gt;
&lt;table style="width: 766px; margin: auto;"&gt;&lt;tr&gt;&lt;td style="padding: 0 12px;" colspan="6"&gt;&lt;img alt="Sequence of 6 cards rotating from front to back." src="http://ieblog.members.winisp.net/images/20120202-cardflip.png" /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center; width: 127.67px;"&gt;rotateY(0deg);&lt;/td&gt;
&lt;td style="text-align: center; width: 127.67px;"&gt;rotateY(36deg);&lt;/td&gt;
&lt;td style="text-align: center; width: 127.67px;"&gt;rotateY(72deg);&lt;/td&gt;
&lt;td style="text-align: center; width: 127.67px;"&gt;rotateY(108deg);&lt;/td&gt;
&lt;td style="text-align: center; width: 127.67px;"&gt;rotateY(144deg);&lt;/td&gt;
&lt;td style="text-align: center; width: 127.67px;"&gt;rotateY(180deg);&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;What’s happening in this example is that when there’s no rotation, you see the second &lt;code&gt;div&lt;/code&gt;, the 8 of clubs&amp;mdash;because it’s the one on top in drawing order. As we apply a rotation to the card and pass 90 degrees, the &lt;code&gt;backface-visibility: hidden;&lt;/code&gt; property of the second &lt;code&gt;div&lt;/code&gt; causes it to become invisible thereby exposing the first &lt;code&gt;div&lt;/code&gt;, the card back.&lt;/p&gt;
&lt;h2&gt;3D Transforms with Animations and Transitions&lt;/h2&gt;
&lt;p&gt;Best of all, you can even use 3D transforms in conjunction with CSS transitions and
    animations. If you are using IE10 or another browser that supports CSS3 Animations of CSS3 3D
    Transforms, try this &lt;a target="_blank" href="http://ieblog.members.winisp.net/images/20120202-scrollText.html"&gt;example of scrolling
        text&lt;/a&gt;, built by animating the &lt;code&gt;transform&lt;/code&gt; property.&lt;/p&gt;
&lt;p&gt;This is the CSS markup that achieves the effect shown in screen shots below.&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#parentDiv&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;perspective&lt;/span&gt;: &lt;span style="color: Blue;"&gt;500px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;perspective-origin&lt;/span&gt;: &lt;span style="color: Blue;"&gt;150px&lt;/span&gt; &lt;span style="color: Blue;"&gt;500px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#div1&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transform-origin&lt;/span&gt;: &lt;span style="color: Blue;"&gt;150px&lt;/span&gt; &lt;span style="color: Blue;"&gt;500px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scrollText&lt;/span&gt; &lt;span style="color: Blue;"&gt;200s&lt;/span&gt; &lt;span style="color: Blue;"&gt;linear&lt;/span&gt; &lt;span style="color: Blue;"&gt;infinite&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;@keyframes&lt;/span&gt; scrollText {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;0% { &lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;rotateX(45deg)&lt;/span&gt; &lt;span style="color: Blue;"&gt;translateY(500px)&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;100% { &lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;rotateX(45deg)&lt;/span&gt; &lt;span style="color: Blue;"&gt;translateY(-8300px)&lt;/span&gt;; }&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 45%; margin-right: 5%;" alt="Early frame from the demo that animates scrolling text with 3D transforms." src="http://ieblog.members.winisp.net/images/20120202-ct-image13.png" /&gt; &lt;img alt="Later frame from the demo that animates scrolling text with 3D transforms." style="max-width: 45%;" src="http://ieblog.members.winisp.net/images/20120202-ct-image14.png" /&gt;&lt;/p&gt;
&lt;h2&gt;Try It Today&lt;/h2&gt;
&lt;p&gt;Try this out in IE10 on the &lt;a href="http://msdn.microsoft.com/en-us/windows/br229518"&gt;Windows Developer Preview&lt;/a&gt;. The test drive demo &lt;a href="http://ie.microsoft.com/testdrive/Graphics/hands-on-css3/hands-on_3d-transforms.htm"&gt;Hands On: 3D Transforms&lt;/a&gt; can help visualize the possibilities that CSS 3D Transforms enables.&lt;/p&gt;
&lt;p&gt;We’d love to see your creations!&lt;/p&gt;
&lt;p&gt;—Jennifer Yu, Program Manager, Internet Explorer Graphics&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10263341" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="CSS" scheme="http://blogs.msdn.com/b/ie/archive/tags/CSS/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>Web Sites and a Plug-in Free Web</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/31/web-sites-and-a-plug-in-free-web.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/31/web-sites-and-a-plug-in-free-web.aspx</id><published>2012-01-31T17:12:23Z</published><updated>2012-01-31T17:12:23Z</updated><content type="html">&lt;p&gt;The transition to a plug-in free Web is happening today. Any site that uses plug-ins
    needs to understand what their customers experience when browsing plug-in free.
    Lots of Web browsing today happens on devices that simply don’t support plug-ins.
    Even browsers that do support plug-ins offer many ways to run plug-in free.
&lt;/p&gt;
&lt;p&gt;Metro style IE runs plug-in free to improve battery life as well as security, reliability,
    and privacy for consumers. &lt;a href="http://blogs.msdn.com/b/b8/archive/2011/09/14/metro-style-browsing-and-plug-in-free-html5.aspx"&gt;
        Previously,&lt;/a&gt; we wrote about how we use IE’s Compatibility View List to make
    sure sites that have a plug-in free experience for other browsers provide that same
    experience to IE10 users. This post describes a way for sites that continue to rely
    on plug-ins to provide consumers browsing with Metro style IE the best possible
    experience. &lt;/p&gt;
&lt;p&gt;Developers with sites that need plug-ins can use an HTTP header or &lt;code&gt;meta&lt;/code&gt; tag to signal
    Metro style Internet Explorer to prompt the user.&lt;/p&gt;
&lt;h4 style="margin-bottom: 0.5em;"&gt;HTTP Header&lt;/h4&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black;
    text-indent: -4em; padding: 0 0.25in;"&gt;
    &lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
        &lt;p style="margin: 0 0 0 4em;"&gt;X-UA-Compatible: requiresActiveX=true&lt;/p&gt;
    &lt;/div&gt;
&lt;/code&gt;
&lt;h4 style="margin-bottom: 0.5em;"&gt;META Tag&lt;/h4&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black;
    text-indent: -4em; padding: 0 0.25in;"&gt;
    &lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
        &lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;meta&lt;/span&gt;
            &lt;span style="color: Red;"&gt;http-equiv&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;X-UA-Compatible&amp;quot;&lt;/span&gt;
            &lt;span style="color: Red;"&gt;content&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;requiresActiveX=true&amp;quot;&lt;/span&gt;
            &lt;span style="color: Blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
    &lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;Metro style IE10 detects these flags, and provides the consumer a one-touch option
    to switch to IE10 on the desktop:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%; border: 1px solid black;" alt="Screen shot of a fictional video site showing a prompt that reads &amp;quot;The site uses add-ons that require Internet Explorer on the desktop.&amp;quot; Three action buttons are offered: Open, Don&amp;#39;t show again for this site, and Close." src="http://ieblog.members.winisp.net/images/20120131-mtapifw-image1.png" /&gt;&lt;/p&gt;
&lt;p&gt;In addition to respecting these &lt;code&gt;X-UA-Compatible&lt;/code&gt; flags specified by the
    developer, the Compatibility View List can also specify a site that needs to run
    in the desktop.&lt;/p&gt;
&lt;p&gt;This mechanism provides a short-term mitigation. The desktop browsing experience
    and most plug-ins were not designed for smaller screens, battery constraints, and
    no mouse. Providing an easy way to the Windows desktop is the last resort when no
    comparable plug-in free fallback content exists.&lt;/p&gt;
&lt;p&gt;A plug-in free Web benefits consumers and developers and we all take part in the
    transition. IE10 makes it easy to provide the best possible experience while you
    migrate your site.&lt;/p&gt;
&lt;p&gt;—John Hrvatin, Program Manager Lead, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10262339" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="Add-ons" scheme="http://blogs.msdn.com/b/ie/archive/tags/Add_2D00_ons/" /><category term="HTML5" scheme="http://blogs.msdn.com/b/ie/archive/tags/HTML5/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>Creating Files through BlobBuilder</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/27/creating-files-through-blobbuilder.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/27/creating-files-through-blobbuilder.aspx</id><published>2012-01-27T21:38:55Z</published><updated>2012-01-27T21:38:55Z</updated><content type="html">&lt;p&gt;As Web sites transition more and more into Web applications, working with files in meaningful ways is becoming increasingly
	important. Starting with Platform Preview 2, IE10 includes support for the &lt;a href="http://www.w3.org/TR/FileAPI/"&gt;File API&lt;/a&gt;,
	enabling developers to read and slice files on the client. Platform Preview 4 adds support for &lt;a href="http://dev.w3.org/2009/dap/file-system/file-writer.html"&gt;
		BlobBuilder&lt;/a&gt;, a way for developers to create &lt;i&gt;new&lt;/i&gt; files. IE10 also has two new methods that allow the user to save
	blobs to their computer, enabling great end-to-end experiences when working with client-resident data.&lt;/p&gt;
&lt;p&gt;Over on the &lt;a href="http://ie.microsoft.com/testdrive/"&gt;IE Test Drive&lt;/a&gt;, we have a fun &lt;a href="http://ie.microsoft.com/testdrive/HTML5/BlobBuilder/"&gt;piano 
	demo&lt;/a&gt; showing off BlobBuilder and File API capabilities. When you press notes on the piano, the site constructs two files:
	an mp3 music file and an SVG file of the musical score. You can see how the size of both files change each time you press a note.
	Press the play button to listen to your song, or download either the music file or the SVG score file by pressing the links
	just above the piano keys. In the rest of this blog post I’ll go through how the demo works, focusing on the capabilities
	of BlobBuilder and File API. &lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
	&lt;img style="max-width: 95%;" alt="Screen shot of the BlobBuilder piano-playing Test Drive demo." src="http://ieblog.members.winisp.net/images/20120127-cftb-image1.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;BlobBuilder Capabilities&lt;/h2&gt;
&lt;p&gt;BlobBuilder, like the name implies, is a way to build blobs on the client. The main method to do this is &lt;code&gt;append&lt;/code&gt;. The &lt;code&gt;append&lt;/code&gt; function accepts
	three data types: &lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Blob objects&lt;/li&gt;
	&lt;li&gt;Plain text&lt;/li&gt;
	&lt;li&gt;Array Buffers &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The piano demo creates the mp3 file by appending blobs together, using one blob for each note. The demo creates the SVG file
	of the musical score by appending text that contains the SVG source. &lt;/p&gt;
&lt;p&gt;&lt;code&gt;getBlob&lt;/code&gt; is another method available on the BlobBuilder object which returns a blob object containing all the
	items previously appended. Here is a very simple example that uses BlobBuilder to create a text file: &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
	&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// The BlobBuilder constructor is prefixed in all browsers.
		&lt;/span&gt;&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Use MSBlobBuilder in IE, MozBlobBuilder in Firefox, and
			WebKitBlobBuilder in WebKit-based browsers.&lt;/span&gt;&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; bb = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; MSBlobBuilder();&lt;/p&gt;
		&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;bb.append(&lt;span style="color: Maroon;"&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt;);&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; blob1 = bb.getBlob(&lt;span style="color: Maroon;"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;);&lt;/p&gt;
	&lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;One thing to note about the &lt;code&gt;getBlob&lt;/code&gt; method is that when you call &lt;code&gt;getBlob&lt;/code&gt; in IE10 and Firefox, it will clear out the contents
	of the BlobBuilder object, so the next time you call append it will be as if you were appending into a new BlobBuilder object.
	WebKit does not currently clear out the contents of the BlobBuilder after calling &lt;code&gt;getBlob&lt;/code&gt;. Consider this example: &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
	&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; bb = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; MSBlobBuilder();&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;bb.append(&lt;span style="color: Maroon;"&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt;);&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; blob1 = bb.getBlob(&lt;span style="color: Maroon;"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;);&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;bb.append(&lt;span style="color: Maroon;"&gt;&amp;quot;BlobBuilder is great&amp;quot;&lt;/span&gt;);&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; blob2 = bb.getBlob(&lt;span style="color: Maroon;"&gt;&amp;quot;text/plain&amp;quot;&lt;/span&gt;);&lt;/p&gt;
	&lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;In all browsers, blob1 will contain the text “&lt;code&gt;Hello World!&lt;/code&gt;”. However, blob2 will be different. In IE10 and Firefox,
	blob2 will contain the text “&lt;code&gt;BlobBuilder is great&lt;/code&gt;” while in WebKit-based browsers it will contain the text “&lt;code&gt;Hello World!BlobBuilder
		is great&lt;/code&gt;”. This discrepancy is still &lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2011AprJun/0215.html"&gt;
			under discussion&lt;/a&gt; in the Web Applications working group. &lt;/p&gt;
&lt;h2&gt;Getting Blobs via XHR&lt;/h2&gt;
&lt;p&gt;The File API makes it easy to access files selected by the user, something I demonstrated in the &lt;a href="http://ie.microsoft.com/testdrive/Graphics/MagneticPoetry/Default.html"&gt;
	Magnetic Poetry&lt;/a&gt; demo. This is great when you want to incorporate the users own data into your site. However, in the
	piano demo, I needed the note files to be built into the demo. When you want to work with blobs but you want to supply the
	data, you can use XHR. &lt;/p&gt;
&lt;p&gt;New to IE10 is the XHR &lt;code&gt;responseType&lt;/code&gt; property. The &lt;code&gt;responseType&lt;/code&gt; property supports four values: &lt;code&gt;blob&lt;/code&gt;, &lt;code&gt;array buffer&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt;, and
	&lt;code&gt;document&lt;/code&gt;. In the piano demo’s initialization method - &lt;code&gt;getBlobs()&lt;/code&gt; - you’ll see the following: &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
	&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; req = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; url = &lt;span style="color: Maroon;"&gt;&amp;#39;PianoNotes/AllNotes2.mp3&amp;#39;&lt;/span&gt;;&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;req.open(&lt;span style="color: Maroon;"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, url, &lt;span style="color: Blue;"&gt;false&lt;/span&gt;);&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;req.responseType = &lt;span style="color: Maroon;"&gt;&amp;quot;blob&amp;quot;&lt;/span&gt;;&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;req.onload = &lt;span style="color: Blue;"&gt;function&lt;/span&gt; () { &lt;span style="color: rgb(0,100,0);"&gt;
			/* ... */&lt;/span&gt; };&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;req.send(&lt;span style="color: Blue;"&gt;null&lt;/span&gt;); &lt;/p&gt;
	&lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;One thing you may notice is that the demo only makes a single XHR request. It only downloads &lt;a href="http://ie.microsoft.com/testdrive/HTML5/BlobBuilder/PianoNotes/AllNotes2.mp3"&gt;
	one file&lt;/a&gt; which contains all the notes used in the demo. However, when you press a key in the demo, only a single note
	plays and the site appends only a single note to the mp3 file. To make that work, after downloading the file containing
	all the notes, the site slices the file using the File API &lt;code&gt;slice&lt;/code&gt; method and extracts 24 individual notes. This is a great
	performance savings versus having to download 24 individual files. &lt;/p&gt;
&lt;h2&gt;Creating the Music File&lt;/h2&gt;
&lt;p&gt;Once I have a blob for each note in the demo, creating the mp3 file is easy. Each time you press a key I call: &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
	&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;musicBlobBuilder.append(noteBlob);&lt;/p&gt;
	&lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;In order to update the file size, I get the blob and then get the file size.&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
	&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; musicBlob = musicBlobBuilder.getBlob(&lt;span style="color: Maroon;"&gt;&amp;quot;audio/mp3&amp;quot;&lt;/span&gt;);&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// display musicBlob.size&lt;/span&gt;&lt;/p&gt;
	&lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;Lastly because I know that the BlobBuilder object was cleared out when I called &lt;code&gt;getBlob&lt;/code&gt; I just append the blob back in:
&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
	&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;musicBlobBuilder.append(musicBlob);&lt;/p&gt;
	&lt;/div&gt;
&lt;/code&gt;
&lt;h2&gt;Creating the SVG File&lt;/h2&gt;
&lt;p&gt;Each time you press a key in the demo, you see a note added to the musical score. The musical score is drawn by a single
	SVG element contained within a div with an id of “scoreContainer.” Each time you press a key, script runs which adds a note
	to the SVG element and then the SVG file is created by appending the source: &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
	&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;svgBlobBuilder.append(document.getElementById(&lt;span style="color: Maroon;"&gt;&amp;quot;scoreContainer&amp;quot;&lt;/span&gt;).innerHTML);&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; svgBlob = svgBlobBuilder.getBlob(&lt;span style="color: Maroon;"&gt;&amp;quot;image/svg+xml&amp;quot;&lt;/span&gt;);&lt;/p&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// display svgBlob.size&lt;/span&gt;&lt;/p&gt;
	&lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;In this case, I don’t refill the svgBlobBuilder because I want to start with a clean slate the next time the user presses
	a key. &lt;/p&gt;
&lt;h2&gt;Saving Files to Disk&lt;/h2&gt;
&lt;p&gt;The last part of the demo is saving the files to disk. When you press the “Music File” and “Musical Score File” links on
	top of the piano keys you will be able to save the file though an experience that feels just like downloading a file:
&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
	&lt;img style="max-width: 95%;" alt="Notification Bar shown in IE10 in response to a call to msOpenOrSaveBlog()." src="http://ieblog.members.winisp.net/images/20120127-cftb-image2.png" /&gt;&lt;/p&gt;
&lt;p&gt;Note that the notification bar is not available in the Platform Previews. Instead, a save dialog is presented. &lt;/p&gt;
&lt;p&gt;Each link calls either &lt;code&gt;saveSong()&lt;/code&gt; or &lt;code&gt;saveSheetMusic()&lt;/code&gt;. Looking into each of these methods will reveal that they use the &lt;code&gt;msSaveOrOpenBlob&lt;/code&gt;
	function:&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
	&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;window.navigator.msSaveOrOpenBlob(svgBlob, &lt;span style="color: Maroon;"&gt;&amp;quot;MusicScore.svg&amp;quot;&lt;/span&gt;);&lt;/p&gt;
	&lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;&lt;code&gt;msSaveOrOpenBlob&lt;/code&gt; and &lt;code&gt;msSaveBlob&lt;/code&gt; are two methods available in IE10 which let sites ask the user to
	save a blob to their computer. &lt;/p&gt;
&lt;p&gt;Calling &lt;code&gt;msSaveOrOpenBlob&lt;/code&gt; will provide an option on the notification bar to open the file in addition to saving
	or canceling. Calling &lt;code&gt;msSaveBlob&lt;/code&gt; only provides the option to save the file or cancel. Though these functions
	are not yet included in any standard, we believe they are extremely useful for writing end to end scenarios with blob data
	and hope that they &lt;a href="http://www.w3.org/2011/11/01-webapps-minutes.html"&gt;might become&lt;/a&gt; a standard at some point.
&lt;/p&gt;
&lt;p&gt;Creating the Piano demo was a fun experience and I’m excited to see how you will use BlobBuilder. Let us know what you think!&lt;/p&gt;
&lt;p&gt;—Sharon Newman, Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10261326" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="HTML5" scheme="http://blogs.msdn.com/b/ie/archive/tags/HTML5/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>Debugging IndexedDB Applications</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/25/debugging-indexeddb-applications.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/25/debugging-indexeddb-applications.aspx</id><published>2012-01-26T00:51:25Z</published><updated>2012-01-26T00:51:25Z</updated><content type="html">&lt;p&gt;&lt;a href="http://msdn.microsoft.com/library/hh673548.aspx"&gt;IndexedDB&lt;/a&gt; is a &lt;a href="http://www.w3.org/TR/IndexedDB/"&gt;
		W3C Working Draft&lt;/a&gt; that enables JavaScript developers to store, search, and retrieve data on the user's local client,
	even when &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/09/27/building-offline-experiences-with-html5-appcache-and-indexeddb.aspx"&gt;
		Internet connectivity is disabled&lt;/a&gt;. This blog post describes IDBExplorer, a tool we use internally to debug IndexedDB applications. IDBExplorer lets you view
	database schemas, object store content, and index details. &lt;/p&gt;
&lt;h3&gt;Exploring the tool with an example IndexedDB App&lt;/h3&gt;
&lt;p&gt;To illustrate, I created an application that tracks my &lt;a href="http://ie.microsoft.com/testdrive/HTML5/newyearslist"&gt;New
	Year’s resolutions&lt;/a&gt; using IndexedDB. It stores and accesses my resolutions locally (on the system browsing the Web page)
	and lets me add or edit them. The “Done That!” button removes the selected resolution from the list and removes its internal
	representation from the database.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
	&lt;img style="max-width: 95%;" alt="Partial screen shot of an application that tracks New Year’s resolutions using IndexedDB." src="http://ieblog.members.winisp.net/images/20120125-dia-image1.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;IndexedDB defines a &lt;i&gt;database&lt;/i&gt; as a container of information. Each database contains &lt;i&gt;object stores&lt;/i&gt;, which are
	repositories for JavaScript objects. Each object contains attributes which can be queried using the API. If you're familiar
	with relational databases, object stores can be equated to tables and each JavaScript object in an object store represents
	a record. However, the objects stored in an IndexedDB object store are treated as opaque entities. In addition, these objects
	do not have to contain the same properties. &lt;/p&gt;
&lt;p&gt;If a JavaScript object is analogous to a relational database record, then the properties of that object can be thought of
	as columns (or fields) in a table. As a result, IndexedDB allows you to define indexes that identify object properties that
	can be used to search the records in an object store. Thus, indexes allow you to traverse and search IndexedDB data using
	the attribute values on a JavaScript object.&lt;/p&gt;
&lt;p style="margin-bottom: 0;"&gt;IndexedDB allows each Domain to have multiple databases. This &lt;a href="http://ie.microsoft.com/testdrive/HTML5/newyearslist/"&gt;
	example&lt;/a&gt; uses one database: ��NewYear.” The app stores my resolutions in an object store named “Resolutions” inside the
	&lt;i&gt;NewYear&lt;/i&gt; database. Each resolution is a JavaScript object with the following attributes:&lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
	&lt;li&gt;&lt;code&gt;priorityId&lt;/code&gt;: Separates resolutions into different priorities&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;name&lt;/code&gt;: Name of the resolution&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;occurrenceId&lt;/code&gt;: Tracks how frequently the action of the resolution must be performed&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;dueDate&lt;/code&gt;: Completion date of the resolution&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;createdDate&lt;/code&gt;: Internal date when the resolution was added to the object store&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;categoryId&lt;/code&gt;: Defines the type of activity for a resolution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notice that not all attributes are visible from the application’s UI. In some cases, they are only internally used (e.g.
	&lt;code&gt;createdDate&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Here’s how the IDBExplorer tool displays the contents of the “Resolutions” object store:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
	&lt;img style="max-width: 95%;" alt="Partial screen shot of the IDBExplorer tool displaying the contents of the “Resolutions” object store." src="http://ieblog.members.winisp.net/images/20120125-dia-image2.png" /&gt;&lt;/p&gt;
&lt;p&gt;The “Resolutions” object store also contains an index on the &lt;code&gt;priorityId&lt;/code&gt; attribute named “priorityId,” which allows
	the app to query objects using the &lt;code&gt;priorityId&lt;/code&gt; property. The descriptions for the each &lt;code&gt;priorityId&lt;/code&gt; value can
	be found inside the “Priorities” object store and the descriptions for the &lt;code&gt;occurrenceId&lt;/code&gt; values can be found inside
	the “Occurrences” object store. Likewise, the descriptions for the &lt;code&gt;categoryId&lt;/code&gt; values can be found inside the “Categories”
	object store. &lt;/p&gt;
&lt;p&gt;The tool uses a tree hierarchy to illustrate these relationships:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
	&lt;img style="max-width: 95%;" alt="Screen shot of the IDBExplorer tool showing there are five resolutions in the database." src="http://ieblog.members.winisp.net/images/20120125-dia-image3.png" /&gt;&lt;/p&gt;
&lt;p&gt;The IDBExplorer tool shows there are five resolutions in my database (two high priority tasks, two medium priorities, and
	one low priority). &lt;/p&gt;
&lt;p&gt;Using the application, I can add a new resolution:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
	&lt;img style="max-width: 95%;" alt="Partial screen shot of the New Year’s Resolutions application showing adding a resolution." src="http://ieblog.members.winisp.net/images/20120125-dia-image4.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The app retrieves the values for &lt;code&gt;Occurrence&lt;/code&gt;, &lt;code&gt;Priority&lt;/code&gt;, and &lt;code&gt;Category&lt;/code&gt; fields from their respective object
	stores using cursors and displays them to the user. The IDBExplorer tool lets you see how these values exist in the object
	store. For example, selecting the &lt;code&gt;Categories&lt;/code&gt; object store displays the available categories and their descriptions:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
	&lt;img style="max-width: 95%;" alt="Screen shot of the IDBExplorer tool showing how values exist in the object store." src="http://ieblog.members.winisp.net/images/20120125-dia-image5.png" /&gt;&lt;/p&gt;
&lt;p&gt;You can update a resolution by selecting it in the “WorkOn” screen and choosing “Edit.” After making any changes, selecting
	the “Update” button will commit the changes and update the values in the “Resolutions” object store.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
	&lt;img style="max-width: 95%;" alt="Partial screen shot of the New Year’s Resolutions application showing updating a resolution by selecting it in using the “WorkOn” screen." src="http://ieblog.members.winisp.net/images/20120125-dia-image6.jpg" /&gt;&lt;/p&gt;
&lt;h3&gt;Using IDBExplorer in your Applications&lt;/h3&gt;
&lt;p&gt;You can include the IDBExplorer tool in your Metro style app or Web site. However, we recommend you not deploy the tool with
	your app. &lt;/p&gt;
&lt;p&gt;To add the tool to your site, copy and unzip the content of the &lt;a href="http://ie.microsoft.com/testdrive/HTML5/newyearslist/IDBExplorer.zip"&gt;
	IDBExplorer package&lt;/a&gt; into your site. Your application will need to link to the IDBExplorer.html file contained inside
	the IDBExplorer folder using either an iframe element or a new window.&lt;/p&gt;
&lt;p&gt;In our example, we decided to host IDBExplorer inside an iframe element. . However, for normal development we recommend hosting
	this URI inside a new window. This will allow you to have a side-by-side experience when debugging your database and application
	without affecting your site's user interface. &lt;/p&gt;
&lt;p&gt;When hosting IDBExplorer, you need to pass the database name using the query string. In this example, this was done using
	the src attribute of the iframe element:&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
	&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
		&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;iframe&lt;/span&gt; &lt;span style="color: Red;"&gt;
			id&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;debuggerId&amp;quot;&lt;/span&gt; &lt;span style="color: Red;"&gt;class&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;debuggerContainer&amp;quot;&lt;/span&gt;
			&lt;span style="color: Red;"&gt;src&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;IDBExplorer/IDBExplorer.html?name=NewYear&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span
				style="color: Maroon;"&gt;iframe&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
	&lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;When planning to host this functionality in a Metro style app, remember that Metro-style apps run fullscreen. As a result,
	you should navigate to this URL, rather than opening a new window (you will need to add a Back button to the IDBExplorer.html
	file in order to be able to return to your application). Alternatively, you can add an iframe element and display the tool
	in it.&lt;/p&gt;
&lt;p&gt;Enjoy the tool and let us know what you think!&lt;/p&gt;
&lt;p&gt;&amp;mdash;Israel Hilerio, Ph.D., Principal Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10260696" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="Platform" scheme="http://blogs.msdn.com/b/ie/archive/tags/Platform/" /><category term="HTML5" scheme="http://blogs.msdn.com/b/ie/archive/tags/HTML5/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>This Week in Privacy</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/23/this-week-in-privacy.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/23/this-week-in-privacy.aspx</id><published>2012-01-24T06:53:12Z</published><updated>2012-01-24T06:53:12Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.microsoft.com/Presspass/Features/2012/jan12/GatesMemo.mspx"&gt;In
    the last ten years&lt;/a&gt; Microsoft has invested heavily in user privacy. Just like
    security, privacy considerations are baked into every Microsoft product. It is almost
    a year since the &lt;a href="http://www.w3.org"&gt;World Wide Web Consortium (W3C)&lt;/a&gt;,
    an international community that develops open standards to ensure the long-term
    growth of the Web, &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/02/24/web-tracking-protection-an-emerging-internet-standard-that-helps-protect-consumers-from-tracking.aspx"&gt;
        accepted and published&lt;/a&gt; Microsoft’s &lt;a href="http://www.w3.org/Submission/2011/01/Comment/"&gt;
            member submission&lt;/a&gt; for an Internet Standard to help protect consumer
    privacy. Last September &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/09/08/online-tracking-consumer-protection-and-web-standards.aspx"&gt;
        I described&lt;/a&gt; how the W3C had &lt;a href="http://www.w3.org/News/2011.html#entry-9196"&gt;
            announced&lt;/a&gt; the creation of a &lt;a href="http://www.w3.org/2011/tracking-protection/"&gt;
                Tracking Protection Working Group&lt;/a&gt; that would bring together a broad
    set of stakeholders from across the industry to work on standards for “Do Not Track”
    technology and the group has been hard at work since then.&lt;/p&gt;
&lt;p style="margin-bottom: 0;"&gt;This week there are three important events related to online
    privacy:&lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
    &lt;li&gt;The &lt;a href="http://www.dld-conference.com/"&gt;Digital Life Design&lt;/a&gt; (DLD) conference
        in Munich where our own &lt;a href="http://www.microsoft.com/presspass/exec/hachamovitch/"&gt;
            Dean Hachamovitch&lt;/a&gt; had the privilege of speaking yesterday (see related post
        &lt;a href="http://windowsteamblog.com/ie/b/ie/archive/2012/01/23/leading-privacy-advocates-release-new-tracking-protection-lists-for-ie9.aspx"&gt;
            here&lt;/a&gt;);&lt;/li&gt;
    &lt;li&gt;The &lt;a href="http://www.w3.org/2011/tracking-protection/agenda-2012-24-01-belgium.html"&gt;
        third face-to-face meeting&lt;/a&gt; of the W3C Tracking Protection working group, which
        begins today; and&lt;/li&gt;
    &lt;li&gt;The &lt;a href="http://www.cpdpconferences.org/"&gt;Computers, Privacy and Data Protection
        Conference&lt;/a&gt; starting tomorrow in Brussels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These forums bring together opinion leaders and stakeholders from academia, industry,
    and government to discuss information technology, privacy, and data protection.
&lt;/p&gt;
&lt;h2&gt;W3C’s Third Face-to-face Meeting of the Tracking Protection Working Group&lt;/h2&gt;
&lt;p&gt;The W3C Tracking Protection working group is chartered to produce three deliverables:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;b&gt;Tracking Preference Expression Definitions and Compliance&lt;br /&gt;
    &lt;/b&gt;When a large group of experts is brought together from across industry and government
        it is essential that they agree on terminology to prevent misunderstandings where
        people think they agree or disagree when in fact they don’t. The First Public Working
        Draft (FPWD) of this document was &lt;a href="http://www.w3.org/TR/2011/WD-tracking-compliance-20111114/"&gt;
            published&lt;/a&gt; in November and this week the group will discuss the changes made
        to the &lt;a href="http://www.w3.org/2011/tracking-protection/drafts/tracking-compliance.html"&gt;
            Editor’s Draft&lt;/a&gt; since then. The document highlights the large number of open
        issues that the group is working on.&lt;br /&gt;
    &lt;/li&gt;
    &lt;li style="margin-top: 1em;"&gt;&lt;b&gt;Tracking Preference Expression (Do Not Track)&lt;br /&gt;
    &lt;/b&gt;The second document is a technical specification that defines the mechanisms to
        be used by browsers and other applications in order to signal user preferences not
        to be tracked online. Today, Internet Explorer 9 sends this “DNT” signal when you
        enable a &lt;a href="http://msdn.microsoft.com/en-us/library/hh273400(v=VS.85).aspx"&gt;Tracking
            Protection List&lt;/a&gt;. The FPWD of this document was also &lt;a href="http://www.w3.org/TR/2011/WD-tracking-dnt-20111114/"&gt;
                published&lt;/a&gt; in November and again the group will discuss the latest &lt;a href="http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html"&gt;
                    Editor’s Draft&lt;/a&gt; this week. Sending the DNT signal relies on Web sites
        to correctly recognize and obey the user’s request to not be tracked. At the present
        time, few Web sites take any action when they receive the signal.&lt;br /&gt;
    &lt;/li&gt;
    &lt;li style="margin-top: 1em;"&gt;&lt;b&gt;Tracking Selection Lists&lt;br /&gt;
    &lt;/b&gt;The third deliverable for the Tracking Protection working group is a specification
        defining an interoperable format for Tracking Selection Lists. Tracking Selection
        Lists define rules that browsers can use to allow or block tracking elements on
        Web pages. A number of browsers today support this kind of list, either directly
        or via add-ins. In Internet Explorer, these lists are called Tracking Protection
        Lists (or TPLs). Internet Explorer 9 provides &lt;a href="http://technet.microsoft.com/en-us/edge/Video/gg604899"&gt;
            built-in support for TPLs&lt;/a&gt; specifically designed to help users control how
        they are tracked on the Web.&lt;br /&gt;
        &lt;br /&gt;
        A Web standard that defines the format of these lists will encourage a rich ecosystem
        of list providers that can work with any browser that chooses to support this feature.
        The working group hasn’t yet published a FPWD for Tracking Selection Lists but will
        discuss the &lt;a href="http://dvcs.w3.org/hg/tracking-protection/raw-file/tip/ED-tracking-tsl.html"&gt;
            Editor’s Draft&lt;/a&gt; written by participants from Microsoft and Opera in the meeting
        this morning.&lt;br /&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tracking Selection Lists are designed to complement the DNT signal, which will take
    some time to be effective. Inevitably, not all sites will respect the DNT user preference
    and Tracking Selection Lists will provide consumers an additional control to avoid
    being tracked by those sites. When a Tracking Selection List is enabled, the browser
    will avoid contacting the listed sites. You can read more about IE9’s Tracking Protection
    from previous &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/01/25/update-effectively-protecting-consumers-from-online-tracking.aspx"&gt;
        blog&lt;/a&gt; &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/06/07/making-tracking-protection-lists-available-from-your-web-site.aspx"&gt;
            posts&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Computers, Privacy and Data Protection Conference&lt;/h2&gt;
&lt;p&gt;I am looking forward to participating in the &lt;a href="http://www.cpdpconferences.org/wednesday25january.html"&gt;
    Tracking Protection Workshop&lt;/a&gt; at the CPDP Conference tomorrow afternoon. Simon
    Davies, a Research Fellow at LSE and &lt;a href="https://www.privacyinternational.org/article/about-staff"&gt;
        Director of Privacy International&lt;/a&gt;, and Alexander Hanff, who heads up Privacy
    International’s Digital Privacy portfolio, host a panel exploring the dynamics
    of Tracking Protection Lists. This should be an engaging session and I’m keen to
    listen to the questions and comments from all involved.&lt;/p&gt;
&lt;h2&gt;What’s Next?&lt;/h2&gt;
&lt;p&gt;The W3C working group has an aggressive timetable to make progress in the coming
    months, to tease out the consensus from the different groups involved, and to move
    the specification documents through the &lt;a href="http://blogs.msdn.com/b/ie/archive/2010/09/13/web-standards-from-working-draft-to-recommendation.aspx"&gt;
        W3C process&lt;/a&gt;. You can follow the progress through the group’s &lt;a href="http://lists.w3.org/Archives/Public/public-tracking/"&gt;
            mailing list archive&lt;/a&gt;. I plan to provide further updates on &lt;a href="http://blogs.msdn.com/b/ie/"&gt;
                IEBlog&lt;/a&gt;. The minutes from this week’s meeting will be published on
    the group’s &lt;a href="http://lists.w3.org/Archives/Public/public-tracking/"&gt;home page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;—Adrian Bateman, Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10259892" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="W3C" scheme="http://blogs.msdn.com/b/ie/archive/tags/W3C/" /><category term="Privacy" scheme="http://blogs.msdn.com/b/ie/archive/tags/Privacy/" /></entry><entry><title>IE10 Compat Inspector</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/20/ie10-compat-inspector.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/20/ie10-compat-inspector.aspx</id><published>2012-01-20T20:34:14Z</published><updated>2012-01-20T20:34:14Z</updated><content type="html">&lt;p&gt;
    &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/04/27/ie9-compat-inspector.aspx"&gt;Compat Inspector&lt;/a&gt; is now available
    for IE10. Use Compat Inspector to quickly identify if Internet Explorer platform changes affect your site. Whether you're
    preparing for IE10 or still updating for IE9, run Compat Inspector on any page experiencing problems. Then watch for messages
    explaining potential issues and steps you can take to resolve them.
&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Screen shot of the new IE10 Metro style Compat Inspector." src="http://ieblog.members.winisp.net/images/20120120-ici-image1.png" /&gt;&lt;/p&gt;
&lt;h2&gt;
    About Compat Inspector&lt;/h2&gt;
&lt;p&gt;
    Compat Inspector is a JavaScript-based testing tool that analyzes your site while it runs. Compat Inspector reports patterns
    of interaction which cause issues in recent modes. This allows you to identify problems quickly without memorizing a bunch
    of documentation or searching through the entirety of your site's code. We developed Compat Inspector during the course
    of IE9 to speed up the process of recognizing common issues across different sites and have now updated it for IE10. Along
    the way, many members of the IE team contributed to the set of test cases that make up the rules in Compat Inspector.&lt;/p&gt;
&lt;p&gt;
    Compat Inspector is designed to help sites migrating to IE9 or IE10 mode&amp;mdash;not those running in legacy modes.
    You can test sites that run in legacy modes by selecting a more recent mode via the F12 developer tools.
    Just press F12 to open the tools, click on "Document Mode" in the menu bar, then select "Standards".
    You may need to refer to more detailed documentation such as the &lt;a href="http://msdn.microsoft.com/en-us/library/ff986083(v=VS.85).aspx"&gt;
        IE9 Compatibility Cookbook&lt;/a&gt; or the &lt;a href="http://msdn.microsoft.com/en-us/library/hh673549(v=vs.85).aspx"&gt;
            IE10 Developer Guide&lt;/a&gt; for some issues. The best pattern is to use Compat Inspector
    first, then fall back to the documentation if nothing is found.&lt;/p&gt;
&lt;h2&gt;
    Using Compat Inspector&lt;/h2&gt;
&lt;p&gt;
    Run Compat Inspector by adding the following script &lt;b&gt;&lt;i&gt;before&lt;/i&gt;&lt;/b&gt; all other scripts on each page you want to test (the need to run before other scripts means Compat Inspector can't be used as a bookmarklet):
&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;
    &lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
        &lt;p style="margin: 0 0 0 4em;"&gt;
            &lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;script&lt;/span&gt; &lt;span style="color: Red;"&gt;src&lt;/span&gt;&lt;span
                style="color: Blue;"&gt;=&amp;quot;http://ie.microsoft.com/TestDrive/HTML5/CompatInspector/inspector.js&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span
                    style="color: Maroon;"&gt;script&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;gt;&lt;/span&gt;
        &lt;/p&gt;
    &lt;/div&gt;
&lt;/code&gt;
&lt;p&gt;
    This will place a status widget in the upper right hand corner of the page. Click the widget to get more information.
&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Screen show of the Compat Inspector widget displayed when its installed on a page." src="http://ieblog.members.winisp.net/images/20120120-ici-image2.png" /&gt;&lt;/p&gt;
&lt;p&gt;
    You can streamline this process by using &lt;a href="http://www.fiddler2.com/fiddler2/"&gt;Fiddler&lt;/a&gt; to automatically inject Compat Inspector
    on pages you visit. Just add &lt;a href="http://ie.microsoft.com/testdrive/HTML5/CompatInspector/help/snippet.txt"&gt;
        this snippet&lt;/a&gt; to your &lt;a href="http://www.fiddler2.com/fiddler/Dev/ScriptSamples.asp"&gt;
            Fiddler Script&lt;/a&gt; to get up and running. This configuration also automatically inspects all sub-frames in a page.
    Once the snippet is in place you can toggle Compat Inspector on and off from Fiddler's "Rules" menu.
&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Screen shot of Fiddler&amp;#39;s Rules menu showing the &amp;quot;Use Compat Inspector&amp;quot; menu item."
        src="http://ieblog.members.winisp.net/images/20120120-ici-image3.png" /&gt;&lt;/p&gt;
&lt;p&gt;
    Go hands-on to get a feel for the improvements using the &lt;a href="http://ie.microsoft.com/testdrive/HTML5/CompatInspector/"&gt;
        Compat Inspector Test Drive&lt;/a&gt;. Then visit the &lt;a href="http://ie.microsoft.com/testdrive/HTML5/CompatInspector/help/post.htm"&gt;
            Compat Inspector User Guide&lt;/a&gt; to learn more about how to test your own sites.
&lt;/p&gt;
&lt;p&gt;
    —Tony Ross, Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10258987" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="Compatibility" scheme="http://blogs.msdn.com/b/ie/archive/tags/Compatibility/" /></entry><entry><title>Under the Covers: Let It Snow…</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/18/under-the-covers-let-it-snow.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/18/under-the-covers-let-it-snow.aspx</id><published>2012-01-18T17:27:26Z</published><updated>2012-01-18T17:27:26Z</updated><content type="html">&lt;p&gt;&lt;i&gt;With one of those rare Seattle snowstorms underway today, I feel this is a great time to publish this description of our Holiday 2011 Test Drive demo “Let It Snow.” —Editor&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;When a browser effectively uses the underlying hardware, the possibilities are limitless. Over the holidays we &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/12/20/let-it-snow-faster.aspx"&gt;released a demo&lt;/a&gt; that helps showcase the advantages of a fully hardware-accelerated, touch first browsing experience with Internet Explorer 10. This post takes a closer look at how the &lt;a href="http://ie.microsoft.com/testdrive/performance/letitsnow/"&gt;Let It Snow&lt;/a&gt; demo was created. The patterns in this demo are typical of the HTML5 experiences emerging across the Web today and early &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229512"&gt;Metro Style Apps&lt;/a&gt;. We’ll take a look from a functional point of view, rather than visual.&lt;/p&gt;
&lt;p&gt;As low power mobile devices and touch first user experiences become mainstream, customer expectations around browser performance are quickly expanding. Browser performance now includes how smoothly the Web site moves under your finger, how quickly the Web site responds to touch interactions, and how &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/03/28/browser-power-consumption-leading-the-industry-with-internet-explorer-9.aspx"&gt;efficiently the browser consumes battery&lt;/a&gt;. With Internet Explorer 10 and Windows 8 &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/02/08/focusing-on-real-world-web-performance-with-internet-explorer-9.aspx"&gt;we set out&lt;/a&gt; to build the world’s fastest browser for real world scenarios.&lt;/p&gt;
&lt;h2&gt;Building Let It Snow&lt;/h2&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 90%; margin-left: auto; margin-right: auto;"&gt;
&lt;tr&gt;&lt;td style="padding: 0 16px 16px 0;"&gt;&lt;img alt="We start with a themed postcard which contains a designated area for the holiday greeting." src="http://ieblog.members.winisp.net/images/20120118-utclis-image1.jpg" /&gt;&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;p style="margin-top: 0;"&gt;&lt;b&gt;Holiday Postcard&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;We start with a themed postcard which contains a designated area for the holiday greeting. The postcard is generated at runtime using HTML5 canvas and uses many common drawing techniques including drawing images, composing gradients, manipulating opacity and skew, and more.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style="padding: 0 16px 16px 0;"&gt;&lt;img alt="We next add lots of falling snowflakes to create a snowstorm." src="http://ieblog.members.winisp.net/images/20120118-utclis-image2.jpg" /&gt;&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;p style="margin-top: 0;"&gt;&lt;b&gt;Animated Snowstorm&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;We next add lots of falling snowflakes to create a snowstorm. We do this using a second canvas that’s layered over the postcard. Each snowflake is represented as an object in a JavaScript collection which holds the state of the snowflake, such as current location, velocity, and the image to draw. The canvas is cleared each frame and the scene recreated from the underlying model.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style="padding: 0 16px 16px 0;"&gt;&lt;img alt="Over time snowflakes will collect on the sign." src="http://ieblog.members.winisp.net/images/20120118-utclis-image3.jpg" /&gt;&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;p style="margin-top: 0;"&gt;&lt;b&gt;Snowflakes Collecting&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Over time snowflakes will collect on the sign. Using hit testing techniques we determine when the snowflake is over the sign and then randomly assign the snowflake a target on the sign. As the snowflake approaches the target we use HTML5 Canvas &lt;a href="http://msdn.microsoft.com/fr-ca/magazine/ff974909(en-us,VS.85).aspx"&gt;composite modes&lt;/a&gt; to compose the snowflake on the canvas.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style="padding: 0 16px 16px 0;"&gt;&lt;img alt="Snow can be brushed off the postcard using your finger or mouse." src="http://ieblog.members.winisp.net/images/20120118-utclis-image4.jpg" /&gt;&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;p style="margin-top: 0;"&gt;&lt;b&gt;Brushing Away the Snow&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Snow can be brushed off the postcard using your finger or mouse. We track the user input through the new &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/09/20/touch-input-for-ie10-and-metro-style-apps.aspx"&gt;MSPointer event&lt;/a&gt; which enables a single consistent API across different pointer models. This allows us to provide a great multitouch experience in Internet Explorer 10 running on Windows 8. We use these captured points to erase portions of the canvas, creating the illusion of the snow being brushed away. &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style="padding: 0 16px 16px 0;"&gt;&lt;img alt="When the layers are combined they create an interactive holiday scene." src="http://ieblog.members.winisp.net/images/20120118-utclis-image5.jpg" /&gt;&lt;/td&gt;
&lt;td style="vertical-align: top;"&gt;&lt;p style="margin-top: 0;"&gt;&lt;b&gt;Complete scene&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;When the layers are combined they create an interactive holiday scene. The patterns used in this demo represent techniques commonly found in games such as Angry Birds or &lt;a href="http://www.cuttherope.ie/"&gt;Cut The Rope&lt;/a&gt;, including script based animations, sophisticated user input, physics based game logic, and more.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;We’re excited about the fast and fluid interactive experiences that can be achieved in Internet Explorer 10 and Windows 8 with a fully hardware-accelerated and touch enabled HTML5 platform. There’s no better way to experience these benefits than first hand through the &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516"&gt;Windows 8 Developer Preview&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;—Bogdan Brinza‎, Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10258138" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Hardware Acceleration" scheme="http://blogs.msdn.com/b/ie/archive/tags/Hardware+Acceleration/" /><category term="Performance" scheme="http://blogs.msdn.com/b/ie/archive/tags/Performance/" /><category term="Canvas" scheme="http://blogs.msdn.com/b/ie/archive/tags/Canvas/" /></entry><entry><title>Staying Safe Online in the New Year</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/17/staying-safe-online-in-the-new-year.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/17/staying-safe-online-in-the-new-year.aspx</id><published>2012-01-17T18:21:46Z</published><updated>2012-01-17T18:21:46Z</updated><content type="html">&lt;p&gt;The bad guys didn’t take a holiday vacation: Internet Explorer’s SmartScreen service blocked nearly 2 million malware downloads per day on average from mid-December through New Year’s. December 25 saw a 30% spike in malware blocks— successfully preventing users from being tricked into giving their PCs an unwanted “present.”&lt;/p&gt;
&lt;p&gt;January is a great time to resolve to stay safer online. Microsoft works around the clock, year-round, to help. By following a few simple &lt;a href="http://www.microsoft.com/security/online-privacy/prevent.aspx"&gt;best practices&lt;/a&gt;, including opting into Automatic Updates and Internet Explorer’s SmartScreen Filter, you can help keep your computer secure on the Web. &lt;/p&gt;
&lt;p&gt;New PC owners will be happy to hear that Windows 7 users are &lt;a href="http://www.microsoft.com/security/sir/keyfindings/default.aspx#!section_4_2"&gt;5 times less likely to be infected&lt;/a&gt; with malware than users running Windows XP. To improve your defenses even more, Windows 7 and Windows Vista users should be sure to upgrade to IE9, our safest and most secure browser. Later this month, we’ll help keep more customers safe by beginning simpler, seamless &lt;a href="http://windowsteamblog.com/ie/b/ie/archive/2011/12/15/ie-to-start-automatic-upgrades-across-windows-xp-windows-vista-and-windows-7.aspx"&gt;automatic upgrade process&lt;/a&gt; for customers who aren’t running the latest, most secure versions of IE for their operating system. Of course, no matter what OS and browser you use, you should ensure that you install updates as they become available – including updates for browser extensions, a &lt;a href="http://www.microsoft.com/security/sir/keyfindings/default.aspx#!section_3_2"&gt;common&lt;/a&gt; &lt;a href="http://www.microsoft.com/security/sir/keyfindings/default.aspx#!section_3_6"&gt;source&lt;/a&gt; of vulnerability. If you got a new phone or tablet over the holiday, be extra careful where you get your apps—the bad guys have noted these fresh new targets and &lt;a href="http://techcrunch.com/2011/11/20/mcafee-nearly-all-new-mobile-malware-in-q3-targeted-at-android-phones-up-37-percent/"&gt;are&lt;/a&gt; &lt;a href="http://threatpost.com/en_us/blogs/fake-antivirus-scams-targeting-android-users-122911"&gt;reacting&lt;/a&gt; &lt;a href="http://www.f-secure.com/weblog/archives/00002280.html"&gt;accordingly&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This month marks the &lt;a href="http://blogs.technet.com/b/microsoft_blog/archive/2012/01/12/trustworthy-computing-at-10-marking-a-milestone-continuing-our-commitment.aspx"&gt;tenth anniversary&lt;/a&gt; of Bill Gates’ Trustworthy Computing memo, and delivering trustworthy browsing is more important than ever, as the ecosystem grows to encompass phones, tablets, and other form factors and the bad guys attempt even more clever attacks. We’re excited to be working with the rest of the Windows team on &lt;a href="http://blogs.msdn.com/b/b8/archive/tags/security/"&gt;cutting-edge security improvements&lt;/a&gt; in IE10 and Windows 8, and we’ll be describing our new defenses in a series of posts over the next two months.&lt;/p&gt;
&lt;p&gt;—Eric Lawrence, IE Security&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10257691" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Security" scheme="http://blogs.msdn.com/b/ie/archive/tags/Security/" /></entry><entry><title>Introducing Seven More IEBlogs</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/16/introducing-seven-more-ieblogs.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/16/introducing-seven-more-ieblogs.aspx</id><published>2012-01-17T00:52:42Z</published><updated>2012-01-17T00:52:42Z</updated><content type="html">&lt;p&gt;Today we introduce seven new language versions of IEBlog—&lt;a href="http://blogs.msdn.com/b/ie_fr/"&gt;French&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/ie_de/"&gt;German&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/ie_br/"&gt;Portuguese (Brazil)&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/ie_ko/"&gt;Korean&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/ie_ja/"&gt;Japanese&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/ie_cn/"&gt;Chinese (PRC)&lt;/a&gt;, and &lt;a href="http://blogs.msdn.com/b/ie_ru/"&gt;Russian&lt;/a&gt;. Links to these appear in the new “Languages” block at the top of the right column. We plan to publish translated versions five to ten days after their appearance on the English language IEBlog.&lt;/p&gt;
&lt;p&gt;We’ve worked hard to localize most of the language elements on the page and in the posts themselves. Text within images will remain in English though we translate captions and image &lt;i&gt;alt&lt;/i&gt; text. Markup and code samples will also remain in English. Occasionally, we’ll mistakenly translate an HTML, CSS, or JavaScript keyword; please forgive us. The links along the top and bottom of the page which link to English-language pages remain in English.&lt;/p&gt;
&lt;p&gt;One of the more fun programming tasks in localizing IEBlog was to correctly translate and reformat the dates and times of the posts and comments. We decided to go one step further and translate the time (which was previously always displayed in US Pacific Time) to the time zone of the viewer. We also made this change to the English language version.&lt;/p&gt;
&lt;p&gt;If you’re a speaker of one of these languages, we hope you’ll enjoy the new versions of IEBlog.&lt;/p&gt;
&lt;p&gt;—Marcia Coelho da Costa, Senior International Project Manager,&lt;br/&gt;&amp;emsp;Joe Oswald, Principal International Project Manager Lead, and&lt;br/&gt;&amp;emsp;Ted Johnson, Production Engineer for IEBlog&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10257374" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="IEBlog" scheme="http://blogs.msdn.com/b/ie/archive/tags/IEBlog/" /></entry><entry><title>Controlling Selection with CSS user-select</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/11/controlling-selection-with-css-user-select.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/11/controlling-selection-with-css-user-select.aspx</id><published>2012-01-11T17:18:07Z</published><updated>2012-01-11T17:18:07Z</updated><content type="html">&lt;p&gt;IE10 Platform Preview 4 includes support for a new CSS property, &lt;a href="http://ie.microsoft.com/testdrive/HTML5/msUserSelect/"&gt;
        &lt;code&gt;-ms-user-select&lt;/code&gt;&lt;/a&gt;, which makes it easier for Web developers to
    control exactly what text can be selected on their Web sites. If you were to watch me all day at my workstation, you would notice that as I read
    on the computer, I select text. I’m not the &lt;a href="http://honda-tech.com/showthread.php?t=2632704"&gt;
        only&lt;/a&gt; &lt;a href="http://forums.whirlpool.net.au/archive/803426"&gt;one&lt;/a&gt; who
    reads like this; selecting text on the Internet is important in many other scenarios. &lt;/p&gt;
&lt;p&gt;Consider a typical news Web site. Most pages will include a news article, the contents
    of which the user needs to be able to select because they read by selecting text
    or because they want to share the content. Also on the news Web page there are some
    menus and links to other parts of the site. Users likely don’t need to select these
    items. Using &lt;code&gt;-ms-user-select&lt;/code&gt;, the Web developer can specify that text
    selection is allowed in the news article but not allowed in the menus.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://ie.microsoft.com/testdrive/HTML5/msUserSelect/"&gt;IE Test Drive
    site&lt;/a&gt; includes an example that does this.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Screen shot of the user-select Test Drive demo showing one possible markup pattern of -ms-user-select." src="http://ieblog.members.winisp.net/images/20120111-us-image1.png" /&gt;&lt;/p&gt;
&lt;p&gt;Setting &lt;code&gt;-ms-user-select:none&lt;/code&gt; on the entire page and then setting &lt;code&gt;
    -ms-user-select:element&lt;/code&gt; on the element containing the blog post allows only
    the contents of the blog post to be selected. &lt;code&gt;-ms-user-select:element&lt;/code&gt;
    is a new property first introduced by IE which we think could be useful in many
    situations. Setting &lt;code&gt;-ms-user-select:element&lt;/code&gt; means that the user can
    select the text of that element, however, the selection will be constrained to the
    bounds of the element. People who want to select the contents of a news article
    probably don’t want to select the footer elements just past the article. Setting
    &lt;code&gt;-ms-user-select:element&lt;/code&gt; makes it easy for users to just select the
    contents of the article without having to worry about getting the mouse placement
    exactly correct. &lt;/p&gt;
&lt;p style="margin-bottom: 0;"&gt;&lt;code&gt;-ms-user-select&lt;/code&gt; accepts four values: &lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
    &lt;li&gt;&lt;code&gt;text&lt;/code&gt; – the text is selectable&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;element&lt;/code&gt; – the text is selectable, constrained to the bounds of the element&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;none&lt;/code&gt; – the text is not selectable&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;auto&lt;/code&gt; – if the element contains editable text such as an input element or contenteditable
        element, the text is selectable. Otherwise selection is determined by the parent
        node’s value. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;auto&lt;/code&gt; is the default value for &lt;code&gt;-ms-user-select&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A developer can turn off text selection by setting &lt;code&gt;-ms-user-select&lt;/code&gt; to
    &lt;code&gt;none&lt;/code&gt;. In IE, when text is set to &lt;code&gt;-ms-user-select:none&lt;/code&gt;, the user will not be able to
    start a selection within that block of text. However, if the user started selecting
    text on a different area of the page, the selection would continue into any area
    of the page including areas where &lt;code&gt;-ms-user-select&lt;/code&gt; is &lt;code&gt;none&lt;/code&gt;. In Firefox, if the developer
    sets &lt;code&gt;–moz-user-select:none&lt;/code&gt; then selections can’t start in that area and also can’t
    be included in any other selection. In Webkit, setting &lt;code&gt;–webkit-user-select:none&lt;/code&gt;
    will make it appear as if that the text is not included in the selection, however
    if you copy and paste the content, you will see that the content is included in
    the selection.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;user-select&lt;/code&gt; was originally proposed in the &lt;a href="http://www.w3.org/TR/2000/WD-css3-userint-20000216"&gt;
    User Interface for CSS3&lt;/a&gt; module; this module has since been superseded by &lt;a href="http://www.w3.org/TR/css3-ui/"&gt;
        CSS3 Basic User Interface Module&lt;/a&gt;, yet it does not define the property. Both
    &lt;a href="https://developer.mozilla.org/en/CSS/-moz-user-select"&gt;Mozilla&lt;/a&gt; and
    &lt;a href="http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/StandardCSSProperties.html#//apple_ref/css/property/-webkit-user-select"&gt;
        Webkit&lt;/a&gt; support their own prefixed versions of this property. However, as
    discussed above, there are some differences in the implementations. &lt;/p&gt;
&lt;p&gt;Play around with the examples on the &lt;a href="http://ie.microsoft.com/testdrive/HTML5/msUserSelect/"&gt;
    IE Test Drive site&lt;/a&gt; and let us know what you think.&lt;/p&gt;
&lt;p&gt;—Sharon Newman, Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10255615" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="CSS" scheme="http://blogs.msdn.com/b/ie/archive/tags/CSS/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>CSS Corner: Using the Whole Font</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2012/01/09/css-corner-using-the-whole-font.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2012/01/09/css-corner-using-the-whole-font.aspx</id><published>2012-01-09T17:39:22Z</published><updated>2012-01-09T17:39:22Z</updated><content type="html">&lt;p&gt;With cross-browser support for both the &lt;a href="http://dev.w3.org/csswg/css3-fonts/#font-face-rule"&gt;
    CSS3 &lt;code&gt;@font-face&lt;/code&gt; rule&lt;/a&gt; and the &lt;a href="http://www.w3.org/TR/WOFF/"&gt;WOFF font packaging
        format&lt;/a&gt;, modern Web typography has expanded far beyond the realm of ‘&lt;a href="http://en.wikipedia.org/wiki/Web-safe_fonts#web-safe_fonts"&gt;Web-safe
            fonts&lt;/a&gt;.’ Well-known magazines such as the &lt;a href="http://www.newyorker.com/"&gt;New
                Yorker&lt;/a&gt; use Web fonts to preserve the typographic personality of
    their headlines, while [US] President Obama’s re-election campaign uses Web font service
    &lt;a href="http://www.typekit.com/"&gt;Typekit&lt;/a&gt; to host their identity font.
&lt;/p&gt;
&lt;p&gt;One remaining limitation prevents Web designers from using the entire font: the inability
    to access the large variety of optional OpenType&lt;span style="font-size: 0.75em; position: relative; top: -0.65em;"&gt;&amp;reg;&lt;/span&gt; features built into many fonts.
    These features define glyph substitution and positioning options to support fundamental
    typographical features such as kerning, superscript and subscript, contextual letterforms
    such as ligatures, numeral styles, access to alternate East Asian glyphs as well
    as ornamental swashes.&lt;/p&gt;
&lt;p&gt;For instance, an OpenType “&lt;a href="http://answers.microsoft.com/en-us/office/forum/office_2010-word/stylistic-sets/a56185d9-ecd0-47ee-90be-46b0b17dd97e"&gt;stylistic
    set&lt;/a&gt;” built into Gabriola allows this text:&lt;/p&gt;
&lt;p style="margin-bottom: 0; text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="String of text in Gabriola font without stylistic sets applied" src="http://ieblog.members.winisp.net/images/20120106-tccutwf-image1.png" /&gt;&lt;/p&gt;
&lt;p style="margin-top: 0; margin-bottom: 0;"&gt;…to render as:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="String of text in Gabriola font with stylistic set 6 applied" src="http://ieblog.members.winisp.net/images/20120106-tccutwf-image2.png" /&gt;&lt;/p&gt;
&lt;p style="margin-bottom: 0;"&gt;Recent updates to the CSS3 Fonts module include &lt;a href="http://www.w3.org/TR/css3-fonts/#font-rend-props"&gt;
    a new set of properties to expose these OpenType features within CSS&lt;/a&gt;. These
    properties can be grouped in two broad categories:&lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
    &lt;li&gt;An explicit mapping of the common OpenType features to specific properties and values.
        For example font-kerning:normal applies the kerning pair adjustments encoded within
        the font and font-variant-numeric: tabular-nums enables tabular numerals. &lt;/li&gt;
    &lt;li&gt;The font-feature-settings property enables low-level access to all the OpenType
        features supported by a font. It is meant as an ‘escape hatch’ to access to more
        advanced features in less common use-cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSS Property: font-feature-settings&lt;/h3&gt;
&lt;p&gt;Preview 4 of IE10 includes support for the font-feature-settings property. Our earlier
    Gabriola example could thus be written:&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;p#demo&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;font-family&lt;/span&gt;: &lt;span style="color: Blue;"&gt;Gabriola,&lt;/span&gt; &lt;span style="color: Blue;"&gt;cursive&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;font-size&lt;/span&gt;: &lt;span style="color: Blue;"&gt;24pt&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;-ms-font-feature-settings&lt;/span&gt;: &lt;span style="color: Blue;"&gt;&amp;quot;ss06&amp;quot;&lt;/span&gt; &lt;span style="color: Blue;"&gt;1&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;The &lt;code&gt;-ms-font-feature-settings&lt;/code&gt; declaration above turns on a stylistic set supported
    by the font (&lt;code&gt;ss06&lt;/code&gt;). The property takes either a value of ‘&lt;code&gt;normal&lt;/code&gt;’ – no change
    in glyph selection or positioning – or a comma-separated list of one or more features.
    Each feature combines a four-letter OpenType feature tag and a value. In the example
    above, “&lt;code&gt;ss06&lt;/code&gt;” is the OpenType feature tag for stylistic set 6. We assign the value
    1 to the feature to turn it on.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://www.microsoft.com/typography/otspec/featurelist.htm"&gt;OpenType
    feature registry&lt;/a&gt; defines the list of possible tags (also documented &lt;a href="http://partners.adobe.com/public/developer/opentype/index_tag3.html"&gt;here&lt;/a&gt; and &lt;a href="http://www.iso.org/iso/catalogue_detail.htm?csnumber=52136"&gt;standardized by ISO&lt;/a&gt;). Here a few of the most popular:&lt;/p&gt;
&lt;table border="0" cellpadding="2" cellspacing="2" style="border-collapse: collapse; margin-left: auto; margin-right: auto;"&gt;
    &lt;tr&gt;
        &lt;th style="border-bottom: 1px solid #333; text-align: left;"&gt;OpenType tag&lt;/th&gt;
        &lt;th style="border-bottom: 1px solid #333; text-align: left;"&gt;Enables&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#kern"&gt;&lt;code&gt;kern&lt;/code&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;Kerning&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#liga"&gt;&lt;code&gt;liga&lt;/code&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;Standard ligatures&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#dlig"&gt;&lt;code&gt;dlig&lt;/code&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;Discretionary ligatures&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#smcp"&gt;&lt;code&gt;smcp&lt;/code&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;Small capitals&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#subs"&gt;&lt;code&gt;subs&lt;/code&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;Subscript&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#sups"&gt;&lt;code&gt;sups&lt;/code&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;Superscript&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#swsh"&gt;&lt;code&gt;swsh&lt;/code&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;Swashes&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td style="padding-right: 1em;"&gt;&lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#ss01"&gt;&lt;code&gt;ss01&lt;/code&gt;&lt;/a&gt;,
            &lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#ss02"&gt;&lt;code&gt;ss02&lt;/code&gt;&lt;/a&gt;,
            …, &lt;a href="http://www.microsoft.com/typography/otspec/features_ko.htm#ss20"&gt;&lt;code&gt;ss20&lt;/code&gt;&lt;/a&gt;
        &lt;/td&gt;
        &lt;td&gt;Stylistic sets 1 to 20&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;For a good illustrated introduction to these features and many others, we recommend
    the Layout Features section of the &lt;a href="https://www.fontfont.com/staticcontent/downloads/FF_OT_User_Guide.pdf"&gt;
        FontFont OpenType User Guide&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;The more common features are on/off switches. Feature values of off or zero turn
    the feature off; a value of on or any positive integer activates it. For some features,
    an integer value gives access to several options. This is usually the case for swashes
    (‘swsh’). If no value is specified for the feature, a value of 1 is assumed.
    All the following declarations are thus equivalent for the purpose of our Gabriola
    example:&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Red;"&gt;-ms-font-feature-settings&lt;/span&gt;: &lt;span style="color: Blue;"&gt;&amp;quot;ss06&amp;quot;&lt;/span&gt; &lt;span style="color: Blue;"&gt;1&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Red;"&gt;-ms-font-feature-settings&lt;/span&gt;: &lt;span style="color: Blue;"&gt;&amp;quot;ss06&amp;quot;&lt;/span&gt; &lt;span style="color: Blue;"&gt;on&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Red;"&gt;-ms-font-feature-settings&lt;/span&gt;: &lt;span style="color: Blue;"&gt;&amp;quot;ss06&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;h3&gt;Finding Out Supported Features for a Font&lt;/h3&gt;
&lt;p&gt;Design tools such as Adobe InDesign or Illustrator expose OpenType features through
    user-friendly menus and dialogs, word processors such as Word &lt;a href="http://office.microsoft.com/en-us/word-help/opentype-options-in-the-font-dialog-box-HA101809106.aspx"&gt;
        support them through their font selection dialog&lt;/a&gt; and font vendors often
    document which features their products support. A future post will discuss using
    the browser to detect font features. With more browser access to OpenType features
    we expect font hosting services to do more to advertise and document their use as
    well.&lt;/p&gt;
&lt;h3&gt;Browser Support&lt;/h3&gt;
&lt;p&gt;The font-feature-settings property is currently supported by Firefox 4+ and Internet
    Explorer 10, beginning with Preview 4. Note that because Firefox and IE implemented
    different versions of the draft the value syntax they accept is different. For example,
    enabling kerning in both browsers requires the following: &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Red;"&gt;-ms-font-feature-settings&lt;/span&gt;: &lt;span style="color: Blue;"&gt;&amp;quot;kern&amp;quot;&lt;/span&gt; &lt;span style="color: Blue;"&gt;1&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Red;"&gt;-moz-font-feature-setting&lt;/span&gt;: &lt;span style="color: Blue;"&gt;&amp;quot;kern=1&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;More information about –moz-font-feature-settings see &lt;a href="https://developer.mozilla.org/en/CSS/-moz-font-feature-settings"&gt;
    -moz-font-feature-settings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As CSS3 Fonts moves along the standardization track we expect more browsers to add
    support for font-feature-setttings as well as the more author-friendly font-variant
    properties and values defined in the module.&lt;/p&gt;
&lt;p&gt;Also note that the property applies to all font families, whether Web fonts downloaded
    through @font-face rules or local fonts referenced by name.&lt;/p&gt;
&lt;h3&gt;Demos&lt;/h3&gt;
&lt;p&gt;Our &lt;a href="http://ie.microsoft.com/testdrive/"&gt;IE Test Drive&lt;/a&gt; site includes
    &lt;a href="http://ie.microsoft.com/testdrive/Graphics/opentype"&gt;advanced OpenType feature demos&lt;/a&gt; from &lt;a href="http://webfonts.fonts.com/"&gt;Monotype Imaging&lt;/a&gt;, 
	&lt;a href="http://www.fontfont.com/"&gt;FontFont&lt;/a&gt;
    and &lt;a href="http://www.fontbureau.com/"&gt;The Font Bureau&lt;/a&gt;. They demonstrate the variety of typographic designs available
    in modern fonts. &lt;/p&gt;
&lt;p&gt;You don’t need any special fonts to try this. Windows 7 includes a number of OpenType-enabled
    fonts including Calibri, Cambria, Consolas, Gabriola, and Palatino Linotype. In
    the Windows 8 Developer Preview, we added OpenType features to Segoe UI and the
    Web-safe fonts Arial, Verdana, Georgia, Times New Roman, Comic Sans and Trebuchet.&lt;/p&gt;
&lt;p&gt;We are excited to give Web authors access to all the OpenType features built in Web
    fonts and look forward to an even broader range of typographic design on the Web.&lt;/p&gt;
&lt;p&gt;—Sylvain Galineau, Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10254647" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="W3C" scheme="http://blogs.msdn.com/b/ie/archive/tags/W3C/" /><category term="CSS" scheme="http://blogs.msdn.com/b/ie/archive/tags/CSS/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>Let It Snow... Faster!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/12/20/let-it-snow-faster.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/12/20/let-it-snow-faster.aspx</id><published>2011-12-20T17:34:28Z</published><updated>2011-12-20T17:34:28Z</updated><content type="html">&lt;p&gt;In the spirit of the holiday season, we offer a new HTML5 experience that makes the most of your PC hardware and the new
	touch capabilities in Windows 8. &lt;/p&gt;
&lt;p&gt;Check out &lt;a href="http://ie.microsoft.com/testdrive/performance/letitsnow/"&gt;Let It Snow&lt;/a&gt; and get ready for a GPU-powered snow storm. This experience
	brings together hardware-accelerated HTML5 canvas, SVG, CSS, and more. On &lt;a href="http://connect.microsoft.com/ie"&gt;Windows
		Developer Preview&lt;/a&gt; with support for &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/09/20/touch-input-for-ie10-and-metro-style-apps.aspx"&gt;
			multi-touch in IE10&lt;/a&gt;, you can reach out and brush the snow off the sign and reveal a holiday message -or just use your mouse. If you think your browser can keep up, kick it up to 1000 snowflakes. If it's more of a flurry than a blizzard, try it with IE9 (or IE10) using the hardware acceleration built into the browser.
&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
	&lt;a href="http://ie.microsoft.com/testdrive/performance/letitsnow/"&gt;&lt;img style="border: none; max-width: 95%;" alt="Screen shot of Let It Snow demo. Click the image to &amp;quot;Let it Snow.&amp;quot;" src="http://ieblog.members.winisp.net/images/20111220-lis-image1.png" /&gt;&lt;/a&gt;&lt;br /&gt;
	Click the image to Let It Snow&lt;/p&gt;
&lt;p&gt;Earlier this year we showed the &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/04/12/native-html5-first-ie10-platform-preview-available-for-download.aspx"&gt;
	first look at IE10&lt;/a&gt;, which offers more and more of the &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/06/29/site-ready-html5-second-ie10-platform-preview-available-for-developers.aspx"&gt;
		site ready HTML5&lt;/a&gt; developers are asking for, so they can build beautiful and interactive Web experiences.
	With the Windows Developer Preview, we introduced &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/09/13/ie10pp3.aspx"&gt;more
		hardware-accelerated HTML5&lt;/a&gt; for building &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/11/29/html5-for-applications-the-fourth-ie10-platform-preview.aspx"&gt;
			touch friendly applications&lt;/a&gt; on the Web. We’re delighted and amazed by what developers are building on HTML5
	and excited to be part of it.&lt;/p&gt;
&lt;h2&gt;Thank you!&lt;/h2&gt;
&lt;p&gt;Your participation and feedback is an important part of how we build IE. Today we want to say &lt;i&gt;thank you&lt;/i&gt; to everyone
	who browses the Web with IE9, downloads the IE10 previews, runs the test drives, and reports issues on &lt;a href="http://connect.microsoft.com/ie"&gt;
		Connect&lt;/a&gt;. We also want to thank the people and groups who make the standards process work, the broad community of
	Web developers, and enthusiastic consumers who work to move the Web forward.&lt;/p&gt;
&lt;p&gt;From the entire IE team, we wish you a &lt;b&gt;Happy Hardware-accelerated Holiday Season&lt;/b&gt;, and we look forward to another exciting
	year on the Web in 2012.&lt;/p&gt;
&lt;p&gt;—Rob Mauceri, Group Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10249657" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="IE Announcements" scheme="http://blogs.msdn.com/b/ie/archive/tags/IE+Announcements/" /><category term="HTML5" scheme="http://blogs.msdn.com/b/ie/archive/tags/HTML5/" /><category term="Performance" scheme="http://blogs.msdn.com/b/ie/archive/tags/Performance/" /><category term="Canvas" scheme="http://blogs.msdn.com/b/ie/archive/tags/Canvas/" /></entry><entry><title>Updated Look for IEBlog</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/12/18/updated-look-for-ieblog.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/12/18/updated-look-for-ieblog.aspx</id><published>2011-12-18T21:29:00Z</published><updated>2011-12-18T21:29:00Z</updated><content type="html">&lt;p style="margin-bottom: 0;"&gt;Today we introduce an updated look and layout for the IEBlog. Here&amp;rsquo;s an overview of the design and layout changes we made:&lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
&lt;li&gt;&lt;b&gt;New font family&lt;/b&gt; &amp;ndash; We&amp;rsquo;re using the Segoe UI font to align with Windows 8 Metro style.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;New color scheme&lt;/b&gt; &amp;ndash; We have a new color scheme inspired by the Windows 8 Metro style Start screen.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Improved performance&lt;/b&gt; &amp;ndash; The blog&amp;rsquo;s home page defaults to excerpt view. This substantially reduces load time since excerpts do not contain images or videos.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Fewer borders &lt;/b&gt;&amp;ndash; We&amp;rsquo;ve removed the borders around the right rail items resulting in a cleaner look.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Updated right rail content&lt;/b&gt; &amp;ndash; We&amp;rsquo;ve removed the tag cloud and limited the monthly archive list to 24 months. The links section has been updated somewhat and we&amp;rsquo;ve added the Microsoft Translator machine-translation widget for visitors who may wish to read our blog in languages other than English.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We hope you like the new style as much as we do.&lt;/p&gt;
&lt;p&gt;&amp;mdash;Ted Johnson for IEBlog&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10248987" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="IEBlog" scheme="http://blogs.msdn.com/b/ie/archive/tags/IEBlog/" /></entry><entry><title>Interoperable HTML5 Quirks Mode in IE10</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/12/14/interoperable-html5-quirks-mode-in-ie10.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/12/14/interoperable-html5-quirks-mode-in-ie10.aspx</id><published>2011-12-14T17:21:58Z</published><updated>2011-12-14T17:21:58Z</updated><content type="html">&lt;p&gt;
	The
	&lt;a href="http://blogs.msdn.com/b/ie/archive/2011/11/29/html5-for-applications-the-fourth-ie10-platform-preview.aspx"&gt;fourth IE10 platform preview&lt;/a&gt;
	includes enhanced HTML5 support by using an interoperable quirks mode based on the behavior defined in HTML5.
	This HTML5-based quirks mode is the default quirks mode in IE10.
&lt;/p&gt;
&lt;p&gt;
	Users and Web developers want sites to &lt;i&gt;just work&lt;/i&gt; across browsers. 
	A key part of this is making HTML, CSS, and JavaScript work in the same way across implementations. 
	HTML5 facilitates cross-browser consistency by defining parts of the Web platform previously left unspecified. 
	This largely involves the
	&lt;a href="http://blogs.msdn.com/b/ie/archive/2011/07/06/html5-parsing-in-ie10.aspx"&gt;HTML5 parsing rules&lt;/a&gt;, 
	but also includes parts about
	&lt;a href="http://dev.w3.org/html5/spec/links.html#case-sensitivity"&gt;how&lt;/a&gt;
	&lt;a href="http://dev.w3.org/html5/spec/rendering.html#flow-content-1"&gt;browsers&lt;/a&gt;
	&lt;a href="http://dev.w3.org/html5/spec/rendering.html#form-controls"&gt;should&lt;/a&gt;
	&lt;a href="http://dev.w3.org/html5/spec/rendering.html#images"&gt;behave&lt;/a&gt;
	in quirks mode.
&lt;/p&gt;
&lt;p&gt;
	IE10’s HTML5 quirks mode is used for pages without a DOCTYPE or with a legacy DOCTYPE
	&lt;a href="http://dev.w3.org/html5/spec/tree-construction.html#the-initial-insertion-mode"&gt;as defined in HTML5&lt;/a&gt;.
	Like HTML5 and other browsers, the behavior of IE10’s quirks mode is the same as standards mode with select quirks applied. 
	This means features like &amp;lt;canvas&amp;gt;, &amp;lt;audio&amp;gt;, and &amp;lt;video&amp;gt; remain available. 
	Most importantly this aligns IE10's quirks mode with the behavior of other browsers, 
	so pages missing a DOCTYPE run consistently across implementations. 
&lt;/p&gt;
&lt;p&gt;
	Developers can quickly identify which mode a page uses via the F12 developer tools. 
	The latest HTML5 standards and quirks modes are now listed as &lt;i&gt;Standards&lt;/i&gt; and &lt;i&gt;Quirks&lt;/i&gt;. 
	Legacy modes are still listed by the version of IE that introduced them. 
	IE's legacy quirks mode is now referred to as &lt;i&gt;Internet Explorer 5 quirks&lt;/i&gt;. 
&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Screen shot of F12 Developer Tools’ Document Mode menu" src="http://ieblog.members.winisp.net/images/20111214-hqmii-image1.png" /&gt;&lt;br /&gt;F12 Developer Tools’ Document Mode menu&lt;/p&gt;
&lt;p&gt;
	IE10 continues to use &lt;i&gt;Internet Explorer 5 quirks&lt;/i&gt; in Compatibility View for pages without a DOCTYPE, 
	and for pages that opt-in via X-UA-Compatible.
&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;meta&lt;/span&gt; &lt;span style="color: Red;"&gt;http-equiv&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;X-UA-Compatible&amp;quot;&lt;/span&gt; &lt;span style="color: Red;"&gt;content&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;IE=5&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;h3&gt;Call to Action&lt;/h3&gt;
&lt;p&gt;
	HTML5 defines quirks mode for compatibility and interoperability, 
	but you should continue to author new sites for standards mode by using &amp;lt;!DOCTYPE html&amp;gt; at the top of your pages. 
	Please help ensure IE10's HTML5 quirks mode works correctly by reporting issues via 
	&lt;a href="https://connect.microsoft.com/IE"&gt;Connect&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;—Tony Ross, Program Manager, Internet Explorer &lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10247711" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="Compatibility" scheme="http://blogs.msdn.com/b/ie/archive/tags/Compatibility/" /><category term="HTML5" scheme="http://blogs.msdn.com/b/ie/archive/tags/HTML5/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>IE 9.0.4 Available via Windows Update</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/12/13/ie-9-0-4-available-via-windows-update.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/12/13/ie-9-0-4-available-via-windows-update.aspx</id><published>2011-12-13T18:57:05Z</published><updated>2011-12-13T18:57:05Z</updated><content type="html">&lt;p&gt;The &lt;a href="http://support.microsoft.com/kb/2618444"&gt;December 2011 Cumulative Security Update for Internet Explorer&lt;/a&gt; is now available via &lt;a href="http://go.microsoft.com/fwlink/?LinkID=40747"&gt;Windows Update&lt;/a&gt;. This security update resolves three privately reported vulnerabilities in Internet Explorer. The most severe vulnerabilities could allow remote code execution if a user visits a specially crafted Web page using Internet Explorer. An attacker who successfully exploited this vulnerability could run a malicious application on the affected system. Users whose accounts are configured to have fewer user rights on the system could be less affected than users who operate with administrative user rights.&lt;/p&gt;
&lt;p&gt;This security update is rated Important for Internet Explorer on Windows clients and Internet Explorer 9 for Windows 2008 R2; and Low for Internet Explorer on Windows servers. For more information, see the &lt;a href="http://technet.microsoft.com/en-us/security/bulletin/ms11-099"&gt;full bulletin&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Most customers have enabled automatic updating and do not need to take any action. We recommend that customers, who have not enabled automatic updating, enable it (Start Menu, type “Windows Update”). We recommend that administrators, enterprise installations, and end users who want to install this security update manually, apply the update immediately using update management software or by checking for updates using the Microsoft Update service.&lt;/p&gt;
&lt;p&gt;—Ceri Gallacher, Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10247305" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="IE Announcements" scheme="http://blogs.msdn.com/b/ie/archive/tags/IE+Announcements/" /><category term="Security" scheme="http://blogs.msdn.com/b/ie/archive/tags/Security/" /></entry><entry><title>Media Capture API: Helping Web developers directly import image, video, and sound data into Web apps</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/12/09/media-capture-api-helping-web-developers-directly-import-image-video-and-sound-data-into-web-apps.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/12/09/media-capture-api-helping-web-developers-directly-import-image-video-and-sound-data-into-web-apps.aspx</id><published>2011-12-09T19:27:34Z</published><updated>2011-12-09T19:27:34Z</updated><content type="html">&lt;p&gt;Last March, we released a &lt;a href="http://html5labs.interoperabilitybridges.com/prototypes/media-capture-api/media-capture-api/info"&gt;prototype implementation&lt;/a&gt; of the audio portion of a working draft of the W3C &lt;a href="http://www.w3.org/TR/media-capture-api/"&gt;Media Capture API&lt;/a&gt; on &lt;a href="http://html5labs.interoperabilitybridges.com/"&gt;HTML5 Labs&lt;/a&gt;. This prototype publicized some proposed API enhancements described in &lt;a href="http://lists.w3.org/Archives/Public/www-archive/2011Mar/att-0001/microsoft-api-draft-final.html#capture_api_extensions"&gt;section 6.1 of Microsoft’s HTML Speech XG Speech API Proposal&lt;/a&gt;. We have now &lt;a href="http://html5labs.interoperabilitybridges.com/prototypes/media-capture-api-(updated)/media-capture-api-(updated)/info"&gt;updated the prototype&lt;/a&gt; to include the image and video capture features described in the proposal to support scenarios we’ve heard are important for Web developers, as well as incorporating your feedback on audio.&lt;/p&gt;
&lt;p&gt;As more and more consumers use mobile devices to take still pictures, videos, and sound clips, Web developers increasingly need support to capture and upload image, video, and sound from their Web sites and applications. A usable and standardized API for media capture means Web sites and apps will be able to access these features in a common way across all browsers in the future.&lt;/p&gt;
&lt;p&gt;During this past year, the effort to standardize media capture has intensified. The &lt;a href="http://www.w3.org/2011/04/webrtc/"&gt;WebRTC working group&lt;/a&gt; was formed and combined scenarios that support basic video and audio capture with the ability to share that media in real-time communication scenarios. A broad interest in both of these scenarios from industry partners and browser vendors alike shifted focus away from the &lt;a href="http://www.w3.org/TR/media-capture-api/"&gt;Media Capture API&lt;/a&gt; and brought the &lt;a href="http://dev.w3.org/2011/webrtc/editor/webrtc.html"&gt;WebRTC draft spec&lt;/a&gt; to the forefront.&lt;/p&gt;
&lt;p&gt;This past November, we took our experience with the development of this prototype and interest in media capture for the browser to the W3C's technical plenary meeting (TPAC). &lt;a href="http://lists.w3.org/Archives/Public/public-device-apis/2011Nov/att-0177/minutes-2011-11-03.html#item05"&gt;Travis Leithead shared some of our feedback&lt;/a&gt; with the &lt;a href="http://www.w3.org/2009/dap/"&gt;Device APIs (DAP) Working Group&lt;/a&gt; and we continued existing discussions within the &lt;a href="http://www.w3.org/2005/Incubator/htmlspeech/"&gt;HTML Speech Incubator Group&lt;/a&gt;. One result of our engagement was &lt;a href="http://lists.w3.org/Archives/Public/public-device-apis/2011Nov/0234.html"&gt;the formation of a media capture joint task force&lt;/a&gt; in order to bring the best of local media capture and real-time communication scenarios together. We are &lt;a href="http://dvcs.w3.org/hg/dap/raw-file/tip/media-stream-capture/scenarios.html"&gt;actively participating&lt;/a&gt; in the task force and support the &lt;a href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html"&gt;getUserMedia approach&lt;/a&gt; to capture. &lt;/p&gt;
&lt;p&gt;With the release of &lt;a href="http://html5labs.interoperabilitybridges.com/prototypes/media-capture-api-(updated)/media-capture-api-(updated)/info"&gt;this prototype&lt;/a&gt;, we give Web developers early access to photo, video and audio media capture APIs in the browser. We anticipate evolving the prototype to share implementation feedback and experience with the new media capture task force. The end goal remains to create the best possible standard for the benefit of the whole Web community.&lt;/p&gt;
&lt;p&gt;Let’s also look back at our earlier proposals, explain why we believe the scenarios are still important, and why we implemented them in this new version of the prototype:&lt;/p&gt;
&lt;h3&gt;Privacy of device capabilities&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://html5labs.interoperabilitybridges.com/prototypes/media-capture-api-(updated)/media-capture-api-(updated)/info"&gt;The prototype&lt;/a&gt; allows enumeration of the capture device's capabilities (its supported modes). In the old W3C Device Capture API spec, privacy-sensitive information about the device could be leaked to an application because the navigator.device.capture.supported* properties could be accessed without user intervention. Our prototype moves these APIs to an object that is &lt;a href="http://lists.w3.org/Archives/Public/www-archive/2011Mar/att-0001/microsoft-api-draft-final.html#security"&gt;only available after the user gives permission&lt;/a&gt;. The W3C's current getUserMedia API does not support enumeration of device capabilities, but we believe it is valuable to Web developers and should be done in a similar privacy-sensitive manner.&lt;/p&gt;
&lt;h3&gt;Multiple Devices&lt;/h3&gt;
&lt;p&gt;The W3C's current getUserMedia API is designed to support multiple devices, either via hints to the API or through user preference. This is an improvement for a scenario that was not supported in the old W3C Device Capture API spec.&lt;/p&gt;
&lt;p&gt;Our current prototype also supports a conceptually similar design: navigator.device.openCapture() which returns asynchronously with the capture device the user prefers (through preference or UI).&lt;/p&gt;
&lt;h3&gt;Direct Capture&lt;/h3&gt;
&lt;p&gt;In the old Media Capture API spec, the Capture.capture[Image|Video|Audio] operations launch an asynchronous UI that returns one or more captures. This means the user has to do something in the Web app to launch the UI and then initiate the capture, which makes it impossible to build capture UI directly into the Web application. Not only would this be unusable for a speech recognition application, but it is also places unnecessary user interface constraints on other media capture scenarios.&lt;/p&gt;
&lt;p&gt;Our prototype and the current getUserMedia capture API directly capture from the device and return a &lt;a href="http://lists.w3.org/Archives/Public/www-archive/2011Mar/att-0001/microsoft-api-draft-final.html#ref-fileapi"&gt;Blob&lt;/a&gt;. Note that for privacy reasons some user agents will choose to display a notification in their surrounding chrome or hardware to make it readily apparent to the user that capture is occurring, together with the option to cancel the capture.&lt;/p&gt;
&lt;h3&gt;Streaming&lt;/h3&gt;
&lt;p&gt;For applications like speech recognition, captured audio needs to be sent directly to the recognition service. However, the current getUserMedia API design only supports capturing to &lt;a href="http://lists.w3.org/Archives/Public/www-archive/2011Mar/att-0001/microsoft-api-draft-final.html#ref-fileapi"&gt;Blobs&lt;/a&gt;, which delay the ability to process the recorded data. &lt;/p&gt;
&lt;p&gt;Our prototype&lt;i&gt; &lt;/i&gt;allows starting a capture asynchronously and returning a &lt;a href="http://lists.w3.org/Archives/Public/www-archive/2011Mar/att-0001/microsoft-api-draft-final.html#streams"&gt;Stream&lt;/a&gt; object containing the captured data. Support for Streams would also be useful in video recording scenarios. For example, using a capture stream, an app could stream a recording to a video sharing site, as it is recorded. &lt;/p&gt;
&lt;h3&gt;Preview&lt;/h3&gt;
&lt;p&gt;In the case of video capture, live preview within the application is important and something that was missing from the old Media Capture API spec.&lt;/p&gt;
&lt;p&gt;Both our prototype and the W3C's getUserMedia API, allow a preview of the recording to be created with URL.createObjectURL(). This URL can then be used as the value for the src attribute on an &amp;lt;audio&amp;gt; or &amp;lt;video&amp;gt; element.&lt;/p&gt;
&lt;h3&gt;End-Pointing&lt;/h3&gt;
&lt;p&gt;For applications like speech recognition, it's important to know when the user starts and stops talking. For example, if the app starts recording but the user doesn't start talking, the app may wish to indicate that it can't hear the user. More importantly, when the user stops talking, the app will generally want to stop recording, and transition into working on the recognition results. This sort of capability may also be of some use during non-speech scenarios, to provide prompts to users who are recording videos.&lt;/p&gt;
&lt;p&gt;Neither the old Media Capture API, nor the current getUserMedia approach support &lt;i&gt;end-pointing&lt;/i&gt;.&lt;/p&gt;
&lt;p&gt;In order to support key speech/voice scenarios, we recommend adding end-pointing capability. The prototype provides this feature and allows Web developers to experiment and provide feedback on these capabilities which will be useful feedback for the W3C.&lt;/p&gt;
&lt;h3&gt;Looking Forward&lt;/h3&gt;
&lt;p&gt;We are supportive of the getUserMedia API, and note that it incorporates many of the points of feedback previously submitted. To avoid confusion about the future direction of media capture at the W3C, the DAP working group &lt;a href="http://www.w3.org/2009/dap/wiki/ImplementationStatus#Capture_API"&gt;has officially deprecated the old Media Capture API&lt;/a&gt;, which now redirects to the media capture joint task force's &lt;a href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html"&gt;current deliverable&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition to a prototype plugin that exposes the modified APIs, we have added to this package a functional demo app that makes use of them.&lt;/p&gt;
&lt;p&gt;Building &lt;a href="http://html5labs.interoperabilitybridges.com/prototypes/media-capture-api-(updated)/media-capture-api-(updated)/info"&gt;this prototype&lt;/a&gt; and listening to your feedback will help Microsoft and the other browser developers build a better and more interoperable Web. We look forward to continuing this discussion in W3C and helping to finalize the specifications.&lt;/p&gt;
&lt;p&gt;—Claudio Caldato, Principal Program Manager, Interoperability Strategy Team&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10246166" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="W3C" scheme="http://blogs.msdn.com/b/ie/archive/tags/W3C/" /></entry><entry><title>Moving to Standards-based Web Graphics in IE10</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/12/07/moving-to-standards-based-web-graphics-in-ie10.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/12/07/moving-to-standards-based-web-graphics-in-ie10.aspx</id><published>2011-12-07T23:05:00Z</published><updated>2011-12-07T23:05:00Z</updated><content type="html">&lt;p&gt;Users expect to visit any site on the Internet with any browser and enjoy a similar quality experience. We first discussed Internet Explorer&amp;rsquo;s commitment to achieving the goal of consistent &amp;ldquo;same markup, same results&amp;rdquo; across browsers in &lt;a href="http://blogs.msdn.com/b/ie/archive/2010/03/16/html5-hardware-accelerated-first-ie9-platform-preview-available-for-developers.aspx"&gt; a post on March 16, 2010&lt;/a&gt; announcing the release of the IE9&amp;rsquo;s first platform preview. IE9 moved us a long way toward that goal and IE10&amp;rsquo;s HTML5-based Standards and Quirks modes largely completes that work. The post &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/07/06/html5-parsing-in-ie10.aspx"&gt; HTML5 Parsing in IE10&lt;/a&gt; listed some of the legacy features removed from IE10&amp;rsquo;s HTML5-based Standards and Quirks modes.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;This post&lt;/b&gt; expands the list of removed legacy features to include two more: Vector Markup Language (VML) and DirectX-based Filters and Transitions. Both of these features were marked deprecated in MSDN documentation as of IE9 (e.g., the first sentence of &lt;a href="http://msdn.microsoft.com/en-us/library/ms532849(v=VS.85).aspx"&gt; Filters and Transitions&lt;/a&gt;: &amp;ldquo;This topic documents a feature of Visual Filters and Transitions, which is deprecated as of Windows Internet Explorer 9&amp;rdquo;) and &lt;i&gt;are now gone&lt;/i&gt; from IE10&amp;rsquo;s Standards and Quirks modes.&lt;/p&gt;
&lt;p&gt;The common uses of VML and DX Filters now have standards-based alternatives implemented in IE10 and current versions of other browsers. These legacy IE features remain available in IE10 in document modes 5, 7, 8, and 9 though their performance is inferior to their hardware-accelerated, standards-based replacements. We encourage Web developers to move their sites to standards-based technologies rather than rely on legacy document modes.&lt;/p&gt;
&lt;h2&gt;Use SVG, not VML&lt;/h2&gt;
&lt;p&gt;Microsoft and others proposed VML (Vector Markup Language) to the W3C in 1998. IE5 first implemented it. The W3C merged VML with a competing proposal with the outcome being SVG. (See &lt;a href="http://en.wikipedia.org/wiki/Vector_Markup_Language"&gt;Vector Markup Language&lt;/a&gt; for a brief history.)&lt;/p&gt;
&lt;p&gt;SVG, implemented in IE9, provides the functionality needed to replace VML in Web sites and applications that use it. The &lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=5224"&gt; VML to SVG Migration Guide&lt;/a&gt;, published on the Microsoft Download Center, provides guidance for moving from VML to SVG.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://raphaeljs.com/"&gt;Rapha&amp;euml;l JavaScript Library&lt;/a&gt; is a lightweight and easy-to-use graphics API that uses SVG when available and VML when not. Rapha&amp;euml;l is a good choice for building vector graphics solutions that work in IE8 and newer browsers.&lt;/p&gt;
&lt;h2&gt;Use CSS3, not DX Filters&lt;/h2&gt;
&lt;p&gt;Internet Explorer 4 introduced a set of &lt;a href="http://msdn.microsoft.com/en-us/library/ms532853(v=VS.85).aspx"&gt; visual filters and transitions&lt;/a&gt; to allow Web developers to apply multimedia-style effects to their Web pages. The name DX Filters comes from their underlying implementation, DirectX, and their long-form syntax, e.g., &amp;ldquo;&lt;code style="font-family: Consolas, Monospace; font-size: 13px;"&gt;filter:&amp;nbsp;progid:DXImageTransform.Microsoft.Alpha(opacity=50)&lt;/code&gt;.&amp;rdquo; DX Filters are not the same as SVG Filter Effects, though both use the CSS property name &lt;code style="font-family: Consolas, Monospace; font-size: 13px;"&gt;filter&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The most popular of these effects have since become CSS3 Working Drafts or Candidate Recommendations including opacity, gradients, and shadows. With IE10 supporting these CSS3 specifications, there&amp;rsquo;s no need for the legacy, IE-specific filters. One additional filter, AlphaImageLoader, was once popular to work around bugs with PNG transparency in IE6 but those bugs were fixed in IE7.&lt;/p&gt;
&lt;p&gt;The following table lists the most popular DX Filters and their standards-based alternatives.&lt;/p&gt;
&lt;table style="margin-right: auto; margin-left: auto; border-collapse: collapse; max-width: 90%;" border="0" cellspacing="0" cellpadding="4"&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th style="text-align: left; border-bottom: 1px solid #333 !important;"&gt;DX Filter&lt;/th&gt;&lt;th style="text-align: left; border-bottom: 1px solid #333 !important;"&gt;Standards-based Alternative&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Alpha&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;opacity&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="padding-right: 12px;"&gt;&lt;code&gt;AlphaImageLoader&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; or &lt;code&gt;background-image&lt;/code&gt; and related properties&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Gradient&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;background-image: linear-gradient()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DropShadow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;text-shadow&lt;/code&gt; or &lt;code&gt;box-shadow&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Matrix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;transform&lt;/code&gt;, &lt;code&gt;transform-origin&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/ie/archive/2011/10/14/svg-filter-effects-in-ie10.aspx"&gt; SVG Filter Effects&lt;/a&gt; in IE10 can be used to simulate some of the less common, more esoteric filters in the context of SVG.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; Because IE9 document mode supports both DX Filters and some of the standards-based alternatives, it is wise to avoid specifying both properties on the same element. Libraries such as &lt;a href="http://www.modernizr.com/"&gt;Modernizr&lt;/a&gt; make it easy to use feature detection with CSS and avoid duplicate declarations.&lt;/p&gt;
&lt;h2&gt;Make the Move to Same Markup Now&lt;/h2&gt;
&lt;p&gt;The changes described above are effective as of &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/11/29/html5-for-applications-the-fourth-ie10-platform-preview.aspx"&gt; IE10 Platform Preview 4&lt;/a&gt;, available for &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516"&gt; Windows Developer Preview&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;More than any version of IE before, IE10 works with the same markup and code as other popular browsers (once any CSS vendor-specific prefixes are updated to include &amp;ldquo;-ms-&amp;rdquo;). Going the other way, the removal of these two legacy features means that content developed for IE10 should also work in other browsers.&lt;/p&gt;
&lt;p&gt;Users benefit when all browsers can work with the same standards-based content.&lt;/p&gt;
&lt;p&gt;&amp;mdash;Ted Johnson, Lead Program Manager, Internet Explorer Graphics&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10245320" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="Compatibility" scheme="http://blogs.msdn.com/b/ie/archive/tags/Compatibility/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>Working with Binary Data using Typed Arrays</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/12/01/working-with-binary-data-using-typed-arrays.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/12/01/working-with-binary-data-using-typed-arrays.aspx</id><published>2011-12-01T23:03:05Z</published><updated>2011-12-01T23:03:05Z</updated><content type="html">&lt;p&gt;With HTML5 comes many APIs that push the envelope on user experiences involving media and real-time communications. These features often rely on binary file formats, like MP3 audio, PNG images, or MP4 video. The use of binary file formats is important to these features to reduce bandwidth requirements, deliver expected performance, and interoperate with existing file formats. But until recently, Web developers haven’t had direct access to the contents of these binary files or any other custom binary files.&lt;/p&gt;
&lt;p&gt;This post explores how Web developers can break through the binary barrier using the JavaScript &lt;a href="http://wiki.ecmascript.org/doku.php?id=strawman:typed_arrays"&gt;Typed  Arrays&lt;/a&gt; API, and explore its use in the &lt;a href="http://ie.microsoft.com/testdrive/HTML5/TypedArrays/"&gt;Binary File Inspector&lt;/a&gt; Test Drive demo.&lt;/p&gt;
&lt;p&gt;Typed Arrays, available in IE10 Platform Preview 4, enable Web applications to use a broad range of binary file formats and directly manipulate the binary contents of files already supported by the browser. Support for Typed Arrays has been added throughout IE10: in JavaScript, in &lt;a href="http://www.w3.org/TR/XMLHttpRequest2/"&gt;XMLHttpRequest&lt;/a&gt;, in the &lt;a href="http://www.w3.org/TR/FileAPI/"&gt;File API&lt;/a&gt;, and in the &lt;a href="http://html5labs.interoperabilitybridges.com/streamsapi/"&gt;Stream API&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Binary File Inspector&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;&lt;br/&gt;&lt;/b&gt;The &lt;a href="http://ie.microsoft.com/testdrive/HTML5/TypedArrays/"&gt;Binary File Inspector&lt;/a&gt; test drive demo highlights some of the new capabilities offered by this combination of new features. You can see the &lt;a href="http://en.wikipedia.org/wiki/ID3"&gt;ID3&lt;/a&gt; headers for music files, get a sense of the raw bytes in video files, and also see how additional file formats, like the PCX image file format, can be supported in the browser with the use of JavaScript and Canvas.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;img style="max-width: 95%;" alt="Screen shot of the Binary File Inspector Test Drive demo." src="http://ieblog.members.winisp.net/images/20111201-wwbduta-image2.png" /&gt;&lt;/p&gt;
&lt;p&gt;In the example above, an .mp4 video is rendered using a &amp;lt;video&amp;gt; element on the left, and the binary contents of the file are displayed on the right, both in HEX form, and as corresponding ASCII characters. In this example, you can see some characteristic elements of the MPEG file format, such as the “ftyp” of “mp4.”&lt;/p&gt;
&lt;h2&gt;Typed Arrays and ArrayBuffers&lt;/h2&gt;
&lt;p&gt;Typed Arrays provide a means to look at raw binary contents of data through a particular typed view. For example, if we want to look at our raw binary data a byte at a time, we can use a Uint8Array (Uint8 describes an 8-bit unsigned integer value, commonly known as a byte). If we want to read the raw data as an array of floating point numbers, we can use a Float32Array (Float32 describes a 32-bit IEE754 floating point value, commonly known as a floating point number). The following types are supported:&lt;/p&gt;
&lt;table border="0" cellpadding="4" cellspacing="4" style="margin-left: 0.25in; margin-right: 0.25in;"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left; border-bottom: solid 1px gray !important;"&gt;Array Type&lt;/th&gt;
&lt;th style="text-align: left; border-bottom: solid 1px gray !important;"&gt;Element size and description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Int8Array&lt;/td&gt;&lt;td&gt;8-bit signed integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Uint8Array&lt;/td&gt;&lt;td&gt;8-bit unsigned integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Int16Array&lt;/td&gt;&lt;td&gt;16-bit signed integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Uint16Array&lt;/td&gt;&lt;td&gt;16-bit unsigned integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Int23Array&lt;/td&gt;&lt;td&gt;32-bit signed integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Uint32Array&lt;/td&gt;&lt;td&gt;32-bit unsigned integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Float32Array&lt;/td&gt;&lt;td&gt;32-bit IEEE754 floating point number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Float64Array&lt;/td&gt;&lt;td&gt;64-bit IEEE754 floating point number&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each array type is a view over an ArrayBuffer. The ArrayBuffer is a reference to the raw binary data, but it does not provide any direct way to interact with the data. Creating a TypedArray view of the ArrayBuffer provides access to read from and write to the binary contents.&lt;/p&gt;
&lt;p&gt;The example below creates a new ArrayBuffer from scratch and interprets its contents in a few different ways:&lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Create an 8 byte buffer&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; buffer = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; ArrayBuffer(8);&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// View as an array of Uint8s and put 0x05 in each byte&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; uint8s = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; Uint8Array(buffer);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;for&lt;/span&gt; (&lt;span style="color: Blue;"&gt;var&lt;/span&gt; i = 0; i &amp;lt; 8; i++) {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;uint8s[i] = 5; &lt;span style="color: rgb(0,100,0);"&gt;// fill each byte with 0x05&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Inspect the resulting array&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;uint8s[0] === 5; &lt;span style="color: rgb(0,100,0);"&gt;// true - each byte has value 5&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;uint8s.byteLength === 8;  &lt;span style="color: rgb(0,100,0);"&gt;// true - there are 8 Uint8s&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// View the same buffer as an array of Uint32s  &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; uint32s = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; Uint32Array(buffer);&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// The same raw bytes are now interpreted differently&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;uint32s[0] === 84215045 &lt;span style="color: rgb(0,100,0);"&gt;// true - 0x05050505 == 84215045&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;In this way, Typed Arrays can be used for tasks such as creating floating point values from their byte-level components or for building data structures that require a very specific layout of data for efficiency or interoperation.&lt;/p&gt;
&lt;h2&gt;Typed Arrays for Reading Binary File Formats&lt;/h2&gt;
&lt;p&gt;An important new scenario enabled by Typed Arrays is to read and render the contents of custom binary file formats that are not natively supported by the browser.  As well as the various array types introduced above, Typed Arrays also provide a DataView object that can be used to read and write the contents of an ArrayBuffer in an unstructured way.  This is well suited to reading new file formats, which are typically made up of heterogeneous mixes of data. &lt;/p&gt;
&lt;p&gt;The Binary File Inspector demo uses DataView to read the &lt;a href="http://en.wikipedia.org/wiki/PCX"&gt;PCX&lt;/a&gt; file format and render it using a &amp;lt;canvas&amp;gt; element.  Here’s a slightly simplified version of what the demo does to read the file header, which includes information like the width, height, DPI, and bits-per-pixel of color depth. &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; buffer = getPCXFileContents();&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; reader = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; DataView(buffer);&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Read the header of the PCX file&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; header = {}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// The first section is single bytes &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.manufacturer = reader.getUint8(0);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.version = reader.getUint8(1);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.encoding = reader.getUint8(2);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.bitsPerPixel = reader.getUint8(3);&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// The next section is Int16 values, each in little-endian&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.xmin = reader.getInt16(4, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.ymin = reader.getInt16(6, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.xmax = reader.getInt16(8, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.ymax = reader.getInt16(10, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.hdpi = reader.getInt16(12, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;header.vdpi = reader.getInt16(14, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;Code similar to the above can be used to add support for rendering a broad range of new data formats in the browser including examples like custom image formats, additional video file formats or domain-specific map data formats. &lt;/p&gt;
&lt;h2&gt;Getting Binary Data with XHR and File API&lt;/h2&gt;
&lt;p&gt;Before we can use the Typed Arrays APIs to work with the contents of files, we need to use browser APIs to get access to the raw data. For accessing files from the server, the XMLHttpRequest API has been extended with support for various “responseType”s. The “arraybuffer” responseType provides the contents of the requested server resource to JavaScript as an ArrayBuffer object. Also supported are the “blob,” “text” and “document” response types. &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;function&lt;/span&gt; getServerFileToArrayBufffer(url, successCallback) {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Create an XHR object&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; xhr = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;xhr.onreadystatechange = &lt;span style="color: Blue;"&gt;function&lt;/span&gt; () {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Blue;"&gt;if&lt;/span&gt; (xhr.readyState == xhr.DONE) {&lt;/p&gt;
&lt;p style="margin: 0 0 0 10em;"&gt;&lt;span style="color: Blue;"&gt;if&lt;/span&gt; (xhr.status == 200 &amp;amp;&amp;amp; xhr.response) {&lt;/p&gt;
&lt;p style="margin: 0 0 0 12em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// The &amp;#39;response&amp;#39; property returns an ArrayBuffer&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 12em;"&gt;successCallback(xhr.response);&lt;/p&gt;
&lt;p style="margin: 0 0 0 10em;"&gt;} &lt;span style="color: Blue;"&gt;else&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 12em;"&gt;alert(&lt;span style="color: Maroon;"&gt;&amp;quot;Failed to download:&amp;quot;&lt;/span&gt; + xhr.status + &lt;span style="color: Maroon;"&gt;&amp;quot; &amp;quot;&lt;/span&gt; + xhr.statusText);&lt;/p&gt;
&lt;p style="margin: 0 0 0 10em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Open the request for the provided url&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;xhr.open(&lt;span style="color: Maroon;"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;, url, &lt;span style="color: Blue;"&gt;true&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Set the responseType to &amp;#39;arraybuffer&amp;#39; for ArrayBuffer response&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;xhr.responseType = &lt;span style="color: Maroon;"&gt;&amp;quot;arraybuffer&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;xhr.send();&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;p&gt;In many cases files are provided by the user, for example as an attachment to an email in a Web mail application. The File API offers Web developers tools to read the contents of files provided via an &amp;lt;input&amp;gt; element, drag-and-drop or any other source that provides Blobs or Files. The FileReader object is used to read the contents of a file into an ArrayBuffer and, like the XHR object, is asynchronous to ensure that reading from the disk does not prevent the user interface from responding.  &lt;/p&gt;
&lt;code style="display: block; font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;function&lt;/span&gt; readFileToArrayBuffer(file, successCallback) {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Create a FileReader &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; reader = &lt;span style="color: Blue;"&gt;new&lt;/span&gt; FileReader();&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Register for &amp;#39;load&amp;#39; and &amp;#39;error&amp;#39; events&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;reader.onload = &lt;span style="color: Blue;"&gt;function&lt;/span&gt; () {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// The &amp;#39;result&amp;#39; property returns an ArrayBuffer for readAsArrayBuffer &lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; buffer = reader.result;&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;successCallback(buffer);&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;reader.onerror = &lt;span style="color: Blue;"&gt;function&lt;/span&gt; (evt) {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// The error code indicates the reason for failure&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Blue;"&gt;if&lt;/span&gt; (evt.target.error.code == evt.target.error.NOT_READABLE_ERR) {&lt;/p&gt;
&lt;p style="margin: 0 0 0 10em;"&gt;alert(&lt;span style="color: Maroon;"&gt;&amp;quot;Failed to read file: &amp;quot;&lt;/span&gt; + file.name);&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Begin a read of the file contents into an ArrayBuffer&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;reader.readAsArrayBuffer(file);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/code&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Binary data is heavily used by Web browsers. With support for Typed Arrays, XHR2 and the File API in IE10, Web applications can now work directly with binary data, to manipulate byte-level data, to render additional binary data formats, and to extract data from existing media file formats.  Try out the &lt;a href="http://ie.microsoft.com/testdrive/HTML5/TypedArrays/"&gt;Binary File Inspector&lt;/a&gt; test drive demo, and take Typed Arrays for a spin in IE10.&lt;/p&gt;
&lt;p&gt;—Luke Hoban, Program Manager, JavaScript&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10243545" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="ES5" scheme="http://blogs.msdn.com/b/ie/archive/tags/ES5/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>HTML5 for Applications: The Fourth IE10 Platform Preview</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/11/29/html5-for-applications-the-fourth-ie10-platform-preview.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/11/29/html5-for-applications-the-fourth-ie10-platform-preview.aspx</id><published>2011-11-29T19:23:41Z</published><updated>2011-11-29T19:23:41Z</updated><content type="html">&lt;script src="http://ie.microsoft.com/testdrive/IEBlog/Common/mp4VideoFailUseEmbed.js"
    type="text/javascript"&gt;&lt;/script&gt;
&lt;p&gt;An updated platform preview of IE10 for the &lt;a href="http://connect.microsoft.com/ie"&gt;
    Windows Developer Preview&lt;/a&gt; is now available for &lt;a href="http://ie.microsoft.com/testdrive/Info/Downloads/Default.html"&gt;
        download&lt;/a&gt;. This IE10 preview adds even more support for HTML5 technologies,
    enabling richer Web applications with significantly improved performance. IE10’s
    hardware acceleration of technologies like SVG, CSS3 transforms and animations delivers
    faster rendering than other browsers, as highlighted in this short video.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;video style="width: 640px; height: 360px; border: 1px solid #999;" src="http://ie.microsoft.com/testdrive/ieblog/2011/nov/pp4_blog_demo.mp4"
        controls preload="metadata" onerror="mp4VideoFailUseEmbed(this)"&gt;
        &lt;embed style="width: 640px; height: 360px; border: 1px solid #999;" src="http://ie.microsoft.com/testdrive/IEBlog/Common/player.swf"
            type="application/x-shockwave-flash" wmode="opaque" allowscriptaccess="never"
            allowfullscreen="false" flashvars="file=http://ie.microsoft.com/testdrive/ieblog/2011/nov/pp4_blog_demo.mp4&amp;autostart=false&amp;controlbar=over&amp;controlbar.idlehide=true&amp;bufferlength=0" /&gt;&lt;/video&gt;&lt;br /&gt;
    See some of the new HTML5 capabilities, performance improvements in IE10.&lt;/p&gt;
&lt;p style="margin-bottom: 0;"&gt;With this fourth Platform Preview, developers can start
    working with more site-ready HTML5 technologies. You can read the full list &lt;a href="http://msdn.microsoft.com/en-us/ie/gg192966.aspx"&gt;
        here&lt;/a&gt; in the IE10 developer guide. Here are a few highlights:&lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
    &lt;li&gt;Cross-Origin Resource Sharing (CORS) for safe use of XMLHttpRequest across domains.&lt;/li&gt;
    &lt;li&gt;File API Writer support for blobBuilder allowing manipulation of large binary objects
        in script in the browser.&lt;/li&gt;
    &lt;li&gt;Support for JavaScript typed arrays for efficient storage and manipulation of typed
        data.&lt;/li&gt;
    &lt;li&gt;CSS user-select property to control how end-users select elements in a Web page
        or application. &lt;/li&gt;
    &lt;li&gt;Support for HTML5 video text captioning, including time-code, placement, and captioning
        file formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These foundational capabilities are what developers building native applications
    depend on: working with binary data and files, controlling selection and hit testing
    in application UI, and providing accessible video content with captioning. The features
    in this platform preview are available to Web pages now, and will be available to
    Metro style applications in Windows 8.&lt;/p&gt;
&lt;h2&gt;Building HTML5 Applications&lt;/h2&gt;
&lt;p&gt;This IE10 preview supports CORS (&lt;a href="http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing"&gt;cross
    origin resource sharing&lt;/a&gt;) to allow developers to use XMLHttpRequest to safely
    request, share, and move data across applications on different domains. This is
    a common pattern developers use to bring data and services together from different
    applications. In &lt;a href="http://ie.microsoft.com/testdrive/HTML5/CORSUpload/"&gt;this
        test drive demo&lt;/a&gt;, you can see how CORS is used along with XMLHttpRequest,
    the File API, and HTML5 progress control to deliver a smooth experience for uploading
    multiple files to a service on another domain.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Screen shot of IE Test Drive demo Cross-Site Update showing four image files being uploaded in response to a file drop on an HTML5 target element."
        src="http://ieblog.members.winisp.net/images/20111129-hfatfipp-image1.png" /&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;a href="http://ie.microsoft.com/testdrive/HTML5/CORSUpload/"&gt;here&lt;/a&gt; to see
    CORS used with XMLHttpRequest to upload files across domains.&lt;/p&gt;
&lt;p&gt;Having the ability to work with binary data and files enables developers to build
    new kinds of applications and experiences on the Web. This IE10 preview supports
    blobBuilder from &lt;a href="http://www.w3.org/TR/file-writer-api/"&gt;File API: Writer&lt;/a&gt;
    for working with large binary objects (blobs) and JavaScript typed arrays. In &lt;a
        href="http://ie.microsoft.com/testdrive/HTML5/TypedArrays/"&gt;this test drive demo&lt;/a&gt;,
    you can see how different file types, including file types which are not natively
    supported in the browser like PCX files can be read, rendered, and even have their
    internal contents displayed.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Screen shot of IE Test Drive demo Binary File Inspector showing a hex dump of a PCX file and a rendering of that file using HTML5 canvas and JavaScript."
        src="http://ieblog.members.winisp.net/images/20111129-hfatfipp-image2.png" /&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;a href="http://ie.microsoft.com/testdrive/HTML5/TypedArrays/"&gt;here&lt;/a&gt; to
    see how JavaScript typed arrays used with File APIs to read and view binary files.&lt;/p&gt;
&lt;p&gt;As developers build more sophisticated applications on the Web, they have more need
    for precise control over how end-users select parts of the page. With CSS user select
    support in IE10, developers can specify which elements in their page can be selected
    by the consumer when using their applications. In this &lt;a href="http://ie.microsoft.com/testdrive/HTML5/msUserSelect/"&gt;
        this test drive demo&lt;/a&gt;, you can see how selection control is applied in a
    sample blog application using the user-select property in a CSS rule.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Screen shot of IE Test Drive demo User-Select showing the markup needed to restrict text selection to a portion of the Web page."
        src="http://ieblog.members.winisp.net/images/20111129-hfatfipp-image3.png" /&gt;&lt;/p&gt;
&lt;p&gt;Click &lt;a href="http://ie.microsoft.com/testdrive/HTML5/msUserSelect/"&gt;here&lt;/a&gt; to
    try CSS user-select to control end-user Web page selection.&lt;/p&gt;
&lt;h2&gt;Improving Same Markup for HTML5 &lt;/h2&gt;
&lt;p&gt;We continue to contribute to the &lt;a href="http://w3c-test.org/html/tests/reporting/report.htm"&gt;
    test suites&lt;/a&gt; under development at the HTML5 standards bodies, submitting &lt;a href="http://samples.msdn.microsoft.com/ietestcenter/"&gt;
        118 new tests&lt;/a&gt; to them, to further the goal of interoperability and same
    markup. You can view them at the IE Test Center as well. We strongly encourage all
    developers to write for HTML5 standards first by always using the HTML5 doc type
    &amp;lt;!DOCTYPE html&amp;gt; in your pages. &lt;/p&gt;
&lt;p&gt;IE10 Preview 4 introduces an updated &lt;a href="http://en.wikipedia.org/wiki/Quirks_mode"&gt;
    quirks mode&lt;/a&gt; that is more consistent and interoperable with the way quirks modes
    works in other browsers like Firefox, Chrome, Safari, and Opera. This updated quirks
    mode supports quirks for page layout, while allowing use of more up-to-date standards
    features like HTML5 elements for audio, video, canvas, and more.&lt;/p&gt;
&lt;p&gt;You can find a full list of new functionality available to developers in the IE10
    developer guide &lt;a href="http://msdn.microsoft.com/en-us/ie/gg192966"&gt;here&lt;/a&gt;.
    Download the &lt;a href="http://connect.microsoft.com/ie/"&gt;Windows 8 developer preview&lt;/a&gt;
    to try this update to IE10. We look forward to continued engagement with the developer
    community and your feedback on &lt;a href="http://connect.microsoft.com/ie"&gt;Connect&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;—Rob Mauceri, Group Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10242527" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="HTML5" scheme="http://blogs.msdn.com/b/ie/archive/tags/HTML5/" /><category term="Platform Preview" scheme="http://blogs.msdn.com/b/ie/archive/tags/Platform+Preview/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>Evolving ECMAScript</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/11/22/evolving-ecmascript.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/11/22/evolving-ecmascript.aspx</id><published>2011-11-22T18:08:28Z</published><updated>2011-11-22T18:08:28Z</updated><content type="html">&lt;p&gt;For the Web and Web applications to keep making progress, the programming language of the Web must continue to improve. Today’s JavaScript standard lacks a few basic objects and library helpers that are vital for building rich, world-wide Web applications. Last week at the Ecma TC39 meeting at Apple’s campus in Cupertino, Microsoft shared reference implementations of proposals to address gaps in &lt;a href="http://html5labs.interoperabilitybridges.com/tc39_demos/JsExtensions/"&gt;Math, String, and Number&lt;/a&gt; functionality as well as &lt;a href="http://html5labs.interoperabilitybridges.com/tc39_demos/JsGlobalization/"&gt;Globalization&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To ensure that others in the community are also able to provide feedback, we’re releasing these reference implementations via &lt;a href="http://blogs.msdn.com/b/interoperability/archive/2011/11/21/prototypes-of-javascript-globalization-amp-math-string-and-number-extensions.aspx"&gt;HTML5 Labs&lt;/a&gt;. We encourage you to download the prototypes, and play with the sample Web pages which demonstrate their usage. Try it out, and let us know if you have any feedback or suggestions in the comments. &lt;/p&gt;
&lt;p&gt;These proposals provide a great deal of much needed functionality by adding only a few objects and library helpers:&lt;/p&gt;

&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse;
    margin: auto;"&gt;
    &lt;tr&gt;
        &lt;th style="border-bottom: solid 2px gray !important;"&gt;Math&lt;/th&gt;
        &lt;th style="border-bottom: solid 2px gray !important;"&gt;String&lt;/th&gt;
        &lt;th style="border-bottom: solid 2px gray !important;"&gt;Number&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td style="text-align: left; padding-right: 8px; vertical-align: top;"&gt;cosh, sinh, tanh&lt;br /&gt;
            acosh, asinh, atanh&lt;br /&gt;
            log2, log10, log1p, expm1&lt;br /&gt;
            sign&lt;br /&gt;
            trunc&lt;/td&gt;
        &lt;td style="text-align: left; padding: 0px 8px; vertical-align: top;"&gt;startsWith, endsWith&lt;br /&gt;
            contains&lt;br /&gt;
            repeat&lt;br /&gt;
            toArray&lt;br /&gt;
            reverse&lt;/td&gt;
        &lt;td style="text-align: left; padding-left: 8px; vertical-align: top;"&gt;isFinite&lt;br /&gt;
            isNaN&lt;br /&gt;
            isInteger&lt;br /&gt;
            toInteger&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;&lt;td colspan="3"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th style="border-bottom: solid 2px gray !important;"&gt;Number Format&lt;/th&gt;
&lt;th style="border-bottom: solid 2px gray !important;"&gt;Date Format&lt;/th&gt;
&lt;th style="border-bottom: solid 2px gray !important;"&gt;Collator&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left; padding: 0px 8px; vertical-align: top;"&gt;format ( number )&lt;/td&gt;
&lt;td style="text-align: left; padding: 0px 8px; vertical-align: top;"&gt;format ( date )&lt;/td&gt;
&lt;td style="text-align: left; padding: 0px 8px; vertical-align: top;"&gt;compare ( x , y )&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;When running on Windows 7, the prototype implementation supports 363 available Locales, 18 numbering systems, many date patterns, and includes support for the Gregorian, Islamic, Hebrew, Buddhist, Korean, and Japanese calendars.&lt;/p&gt;
&lt;p&gt;Note that as with all previous releases of HTML5 labs, this is an unsupported component with an indefinite lifetime. This should be used for evaluation purposes only and should not be used for production level applications.&lt;/p&gt;
&lt;h2&gt;Details on the proposals&lt;/h2&gt;
&lt;p&gt;Computationally intensive Web applications quickly demonstrate that the built-in JavaScript math library is missing basic functions such as cosh and log10 that have been available in other programming language platforms such as C++, .NET, Java, and Python for years. String and Number can also benefit from some basic functionality common to all modern programming language platforms like testing if a String starts with a specific substring or checking that a Number is an Integer. These are addressed in the proposed additions to the &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:more_math_functions"&gt;Math&lt;/a&gt;, &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:string_extras"&gt;String&lt;/a&gt;, and &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:number.isinteger"&gt;Number&lt;/a&gt; APIs. &lt;/p&gt;
&lt;p&gt;Web applications have been harder to globalize than native applications because JavaScript has not provided native date and currency formats that the underlying OS has. The drop includes a reference implementation of the proposed &lt;a href="http://wiki.ecmascript.org/doku.php?id=globalization:specification_drafts"&gt;Globalization&lt;/a&gt; APIs which enable applications to deal correctly with locale specific number and date formats and strings in other languages. With this library, developers can show date and numbers in the specified locale and set collation options for the purposes of sorting and searching strings. Developers can also set date and number formats to use alternate calendars like the Islamic calendar or to show a number as the Chinese Yuan currency.  This means that JavaScript applications no longer have to round trip to the server to properly display locale specific dates and numbers, which ultimately translates to faster interactive applications for end-users. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2&gt;The Role of JavaScript in Improving the Web&lt;/h2&gt;
&lt;p&gt;These proposals are just part of a larger story of the evolution of JavaScript. In 1998, a complex JavaScript application was a few dozen lines of code. By 2008, leading-edge Web applications like Hotmail, Gmail, and CNN.com included hundreds of thousands of lines of JavaScript. Today, there are Web applications with a million lines of JavaScript. These Web applications look more and more like the applications we run on our desktops, with fewer page transitions and more processing occurring on the client, relying on the server for the occasional burst of data rather than frequent expensive server round-trips. &lt;/p&gt;
&lt;p&gt;JavaScript is evolving to meet these needs, and it’s important that it does so in a way that respects everything that developers have invested in their own Web sites and their skill sets by focusing on compatibility and incremental introduction of new functionality. &lt;/p&gt;
&lt;p style="margin-bottom:0;"&gt;We strongly believe in the community process driven through TC39 as the keepers of these principles. TC39’s work on &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"&gt;ECMAScript 5&lt;/a&gt; is a solid step forward for JavaScript in the Web platform. Some of the principles used to design ES5 provide a good template for future versions of the JavaScript standard:&lt;/p&gt;
&lt;ul style="margin-top:0;"&gt;
&lt;li&gt;Preserving the fundamental syntax of tomorrow’s “text/javascript” to ensure continuity in the developer skillset and deliver seamless compatibility between today’s JavaScript and tomorrow’s JavaScript.&lt;/li&gt;
&lt;li&gt;Provide features that are additive and pay-as-you-go, to help developers get more value with minimal new effort or learning.&lt;/li&gt;
&lt;li&gt;Strive for features to be locally detectable, to help developers build applications that work on the broadest range of browsers.&lt;/li&gt;
&lt;li&gt;Where possible, allow for a possibly slower &lt;a href="https://github.com/kriskowal/es5-shim/"&gt;library alternative&lt;/a&gt; (or ‘polyfill’) for browsers that do not yet support the feature.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are working with TC39 on applying these same approaches as broadly as possible for the next revision of the ECMAScript standard.&lt;/p&gt;
&lt;h2&gt;Furthering the JavaScript Runtime&lt;/h2&gt;
&lt;p&gt;Looking ahead, there is a great opportunity for JavaScript to continue to evolve the core runtime. From talking to developers building HTML5 Web sites, we understand that these areas represent the most value: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;Better integration with the native browser platform&lt;/i&gt;&lt;/b&gt;&lt;b&gt;. &lt;/b&gt;With the introduction of recent APIs in HTML5, such as the &lt;a href="http://www.w3.org/TR/FileAPI/"&gt;File API&lt;/a&gt;, &lt;a href="http://dev.w3.org/html5/2dcontext/#canvaspixelarray"&gt;Canvas Pixel Array&lt;/a&gt;, and &lt;a href="http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#arraybuffer"&gt;XHR2&lt;/a&gt;, there is an increasing need for JavaScript to have better interoperability with binary data streams. The need is so acute that there &lt;a href="https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/doc/spec/TypedArray-spec.html"&gt;are&lt;/a&gt; &lt;a href="http://wiki.commonjs.org/wiki/Binary"&gt;many&lt;/a&gt; &lt;a href="http://wiki.ecmascript.org/doku.php?id=strawman:typed_arrays"&gt;proposals&lt;/a&gt; across many Web communities and they are starting to converge in the &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:binary_data_discussion"&gt;Binary Data&lt;/a&gt; proposal. The &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:binary_data_discussion"&gt;Binary Data&lt;/a&gt; proposal aims to improve usability and expressivity for the use cases above.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;Improved site load, especially for larger sites.&lt;/i&gt;&lt;/b&gt;&lt;b&gt; &lt;/b&gt;JavaScript today would benefit from a standardized pattern for loading units of code consistently, in a way that won’t cross-contaminate the global scope, with a predictable loading order. A solution would benefit from being integrated into the runtime to ensure efficient page load times in coordination with the other browser subsystems. The &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:modules"&gt;modules&lt;/a&gt; and &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:module_loaders"&gt;module loader&lt;/a&gt; proposals look like promising starting points which we aim to make available to scripts in “text/javascript” without needing to introduce breaking changes. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;Execution performance and responsiveness.&lt;/i&gt;&lt;/b&gt;&lt;b&gt; &lt;/b&gt;Libraries for interacting with intrinsic JavaScript types should continue to be filled out. As the String and Math extensions proposals suggest, JavaScript would benefit from an intrinsic string search like &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:string_extras"&gt;startsWith&lt;/a&gt; or contains and additions to the set of math functions to match other client platforms.  JavaScript would also benefit from a &lt;a href="http://wiki.ecmascript.org/doku.php?id=strawman:string_format_take_two"&gt;format&lt;/a&gt; capability to replace variables in strings. Like ES5, when integrated into the runtime, these features can provide clear performance improvements for many real-world Web sites with minimal developer effort.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Larger Scale JavaScript&lt;/h2&gt;
&lt;p&gt;When building applications on a larger scale, developers depend upon high quality authoring and tooling experiences. For applications of this scale, higher-level abstractions such as &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:classes"&gt;classes&lt;/a&gt; and other common programming patterns can be the basis for better tooling. &lt;/p&gt;
&lt;p&gt;The &lt;a href="http://office.microsoft.com/en-us/web-apps"&gt;Office Web Applications&lt;/a&gt;, which consist of hundreds of thousands of lines of JavaScript, are written primarily in a variant of &lt;a href="http://projects.nikhilk.net/ScriptSharp"&gt;Script#&lt;/a&gt; that is then compiled into JavaScript that can be executed on today’s browsers.  Other toolsets like the Google Web Toolkit take similar approaches.  More recently, transforming compiler libraries like &lt;a href="http://code.google.com/p/traceur-compiler/wiki/LanguageFeatures"&gt;Traceur&lt;/a&gt; and &lt;a href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript&lt;/a&gt; show how syntax additions to JavaScript and even completely alternative syntaxes can be supported in today’s browsers, without changes to the runtime. &lt;/p&gt;
&lt;p&gt;Some examples, like &lt;a href="http://www.dartlang.org/"&gt;Dart&lt;/a&gt;, portend that JavaScript has fundamental flaws and to support these scenarios requires a “clean break” from JavaScript in both syntax and runtime. We disagree with this point of view. We believe that with committee participant focus, the standards runtime can be expanded and the syntactic features necessary to support JavaScript at scale can be built upon the existing JavaScript standard. &lt;/p&gt;
&lt;h2&gt;The ECMAScript Standards Process&lt;/h2&gt;
&lt;p style="margin-bottom:0;"&gt;For the past couple of years, TC39 has been accepting proposals for new features to add to the ECMAScript standard. As we look at the current work being pursued in the committee, we see two categories of investments:&lt;/p&gt;
&lt;ul style="margin-top:0;"&gt;
&lt;li&gt;&lt;b&gt;Work on the JavaScript runtime.&lt;/b&gt; This work (&lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:binary_data"&gt;binary data&lt;/a&gt;, &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:private_name_objects"&gt;private names&lt;/a&gt;, &lt;a href="http://wiki.ecmascript.org/doku.php?id=globalization:specification_drafts"&gt;globalization&lt;/a&gt;, etc.) offers valuable new capabilities to the platform, and can be made available in a feature-detectable way under the existing JavaScript script tags, allowing for smooth and near-term adoption of these features.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Work on JavaScript syntax.&lt;/b&gt; This work (&lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:let"&gt;let&lt;/a&gt;, &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:destructuring"&gt;destructuring&lt;/a&gt;, &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:iterators"&gt;iterators&lt;/a&gt;, &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:object_literals"&gt;object literals&lt;/a&gt;, etc.) adds to the expressiveness of the JavaScript language, but also requires heavier weight versioning for developers, such as opting in to new script tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We prioritize the JavaScript runtime because it fundamentally limits the capabilities of the Web. We participate in the standards body to make sure these features can become ubiquitous tools developers can depend upon. &lt;/p&gt;
&lt;h2&gt;Looking forward to the future of the Web&lt;/h2&gt;
&lt;p&gt;As the Web transitions from Web sites to Web apps, and as Web developers build new experiences in HTML5, we know that JavaScript will also need to make this transition without compromising its simplicity, flexibility, or performance. An approach that enables broad, incremental adoption by the Web developer community has the highest chance of success. Many of the ideas coming forward in the community support these ideas, and Microsoft will continue to work in the ECMA TC39 standards body to refine proposals for the core JavaScript runtime advancements. Most importantly, progress on the standard should be based on a dialog with Web developers on what is most needed in the Web platform. &lt;/p&gt;
&lt;p&gt;We welcome your feedback and look forward to continuing to participate in this dialog.&lt;/p&gt;
&lt;p&gt;&amp;mdash;Shanku Niyogi, Amanda Silver, John Montgomery, Luke Hoban, Steve Lucco - JavaScript Team&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10239888" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="ES5" scheme="http://blogs.msdn.com/b/ie/archive/tags/ES5/" /></entry><entry><title>Adding Personality with CSS3 Transitions and Animations</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/11/21/adding-personality-with-css3-transitions-and-animations.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/11/21/adding-personality-with-css3-transitions-and-animations.aspx</id><published>2011-11-21T22:33:02Z</published><updated>2011-11-21T22:33:02Z</updated><content type="html">&lt;p&gt;Advancements like high-performance compiled JavaScript and hardware-accelerated rendering of HTML5 and CSS3 in Internet Explorer 9 and 10 allow Web developers to create richer and richer experiences. Two related features, &lt;a href="http://www.w3.org/TR/css3-transitions/"&gt;
        CSS3 Transitions&lt;/a&gt; and &lt;a href="http://dev.w3.org/csswg/css3-animations/"&gt;CSS3 Animations&lt;/a&gt;,
    give Web developers a declarative way to add personality to Web page interactions
    easily.&lt;/p&gt;
&lt;p&gt;This blog post describes these two features as implemented in IE10 in the &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516"&gt;
    Windows Developer Preview&lt;/a&gt; and Windows 8 &lt;a href="http://msdn.microsoft.com/en-us/library/windows/apps/br229576(v=VS.85).aspx"&gt;
        Metro style apps written in HTML&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Same Markup—Except for the Vendor Prefix&lt;/h2&gt;
&lt;p&gt;Like nearly all features new to IE9 and IE10, CSS3 Transitions and Animations are
    standards-based features implemented with “same markup” interoperability in mind.
    However, unlike features such as border-radius, box-shadow, and text-shadow, which
    are part of stable W3C specifications, Transitions and Animations are still at a
    specification stage where vendors prefix their implementations. Therefore, in this
    case, “same markup” must be qualified as “same markup except for the vendor prefix.”&lt;/p&gt;
&lt;p&gt;Many other writers have written about these features, including Rich Bradshaw’s excellent
    article &lt;a href="http://css3.bradshawenterprises.com/"&gt;Using CSS3 Transitions, Transforms
        and Animation&lt;/a&gt;. Many articles that discuss these features use only
    the -webkit- prefix in their examples. Users wishing to experiment in other browsers
    need to copy the example and change -webkit- to -ms-, -moz-, or -o-, as appropriate.
    Bradshaw’s examples are an exception; they already work in IE10!&lt;/p&gt;
&lt;h2&gt;Transitions&lt;/h2&gt;
&lt;p&gt;The function of CSS3 Transitions is very straightforward: smoothly change the computed value
    of a CSS property from its old value to its new value. Moreover, changes in value
    resulting from changes in an element’s CSS class or pseudo-class also trigger transitions.&lt;/p&gt;
&lt;p&gt;Consider the following markup:&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;img&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;opacity&lt;/span&gt;: &lt;span style="color: Blue;"&gt;1&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transition-property&lt;/span&gt;: &lt;span style="color: Blue;"&gt;opacity&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transition-duration&lt;/span&gt;: &lt;span style="color: Blue;"&gt;2s&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transition-delay&lt;/span&gt;: &lt;span style="color: Blue;"&gt;0s&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transition-timing-function&lt;/span&gt;: &lt;span style="color: Blue;"&gt;linear&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;img:hover&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;opacity&lt;/span&gt;: &lt;span style="color: Blue;"&gt;0&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The effect of this is that when the user moves his or her mouse over the image, the image will fade out smoothly
    over 2 seconds starting immediately, as illustrated below (I’ve added a dropped
    shadow on a wrapping element to illustrate the endpoint). &lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Fading one image to nothing over 2 seconds" src="http://ieblog.members.winisp.net/images/20111121-apwctaa-image1.jpg" /&gt;&lt;br /&gt;
    Fading one image to nothing over 2 seconds&lt;/p&gt;
&lt;p style="margin-bottom: 0;"&gt;The transition properties that cause this to occur are:&lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
    &lt;li&gt;&lt;a href="http://www.w3.org/TR/css3-transitions/#transition-property"&gt;transition-property&lt;/a&gt;
        &amp;ndash; specifies which CSS properties are to be transitioned. The keyword “all” causes
        all &lt;a href="http://www.w3.org/TR/css3-transitions/#animatable-properties-"&gt;animatable
            properties&lt;/a&gt; to transition when changed. The default value is “all.”&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.w3.org/TR/css3-transitions/#transition-duration"&gt;transition-duration&lt;/a&gt;
        &amp;ndash; the time, in seconds or milliseconds, of the transition, starting after the transition-delay.
        The default value is zero, meaning that the transition is immediate.&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.w3.org/TR/css3-transitions/#transition-delay"&gt;transition-delay&lt;/a&gt;
        &amp;ndash; the time, in seconds or milliseconds, after the value is changed before the transition
        starts. The time may be negative, in which case the transition starts part way through
        its duration. The default value is zero.&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.w3.org/TR/css3-transitions/#transition-timing-function"&gt;transition-timing-function&lt;/a&gt;
        &amp;ndash; describes how the intermediate values of a transition are calculated. This allows
        a transition to change speed over its duration. The underlying function is a &lt;a href="http://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B.C3.A9zier_curves"&gt;
            cubic Bézier curve&lt;/a&gt;; keywords match common functions. The default value is
        the keyword “ease,” a function that starts fast and slows down toward the end.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fading one image to nothing is a simple example. Let’s say we wanted to fade one
    image to another, as illustrated below.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Fading from one image to another over 2 seconds"
        src="http://ieblog.members.winisp.net/images/20111121-apwctaa-image2.jpg" /&gt;&lt;br /&gt;
    Fading from one image to another over 2 seconds&lt;/p&gt;
&lt;p&gt;The following markup accomplishes this (except that vendor prefixes must precede
    all the transition properties).&lt;/p&gt;
&lt;p&gt;HTML Fragment&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;div&lt;/span&gt; &lt;span style="color: Red;"&gt;id&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;imageWrapper&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;img&lt;/span&gt; &lt;span style="color: Red;"&gt;id&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;backImage&amp;quot;&lt;/span&gt; &lt;span style="color: Red;"&gt;src&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;imageB.jpg&amp;quot;&lt;/span&gt; &lt;span style="color: Blue;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;"&gt;img&lt;/span&gt; &lt;span style="color: Red;"&gt;id&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;frontImage&amp;quot;&lt;/span&gt; &lt;span style="color: Red;"&gt;src&lt;/span&gt;&lt;span style="color: Blue;"&gt;=&amp;quot;imageA.jpg&amp;quot;&lt;/span&gt; &lt;span style="color: Blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;"&gt;div&lt;/span&gt;&lt;span style="color: Blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;CSS Fragment&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#imageWrapper&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;display&lt;/span&gt;: &lt;span style="color: Blue;"&gt;inline-block&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;width&lt;/span&gt;: &lt;span style="color: Blue;"&gt;400px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;height&lt;/span&gt;: &lt;span style="color: Blue;"&gt;267px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;box-shadow&lt;/span&gt;: &lt;span style="color: Blue;"&gt;2px&lt;/span&gt; &lt;span style="color: Blue;"&gt;2px&lt;/span&gt; &lt;span style="color: Blue;"&gt;5px&lt;/span&gt; &lt;span style="color: Blue;"&gt;0px&lt;/span&gt; &lt;span style="color: Blue;"&gt;gray&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;position&lt;/span&gt;: &lt;span style="color: Blue;"&gt;relative&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#imageWrapper&lt;/span&gt; &lt;span style="color: Maroon;"&gt;img&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;width&lt;/span&gt;: &lt;span style="color: Blue;"&gt;400px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;height&lt;/span&gt;: &lt;span style="color: Blue;"&gt;267px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;position&lt;/span&gt;: &lt;span style="color: Blue;"&gt;absolute&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transition-property&lt;/span&gt;: &lt;span style="color: Blue;"&gt;opacity&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transition-duration&lt;/span&gt;: &lt;span style="color: Blue;"&gt;2s&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;transition-timing-function&lt;/span&gt;: &lt;span style="color: Blue;"&gt;linear&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#imageWrapper&lt;/span&gt; &lt;span style="color: Maroon;"&gt;#frontImage&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;#imageWrapper:hover&lt;/span&gt; &lt;span style="color: Maroon;"&gt;#backImage&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;opacity&lt;/span&gt;: &lt;span style="color: Blue;"&gt;1&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#imageWrapper:hover&lt;/span&gt; &lt;span style="color: Maroon;"&gt;#frontImage&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;#imageWrapper&lt;/span&gt; &lt;span style="color: Maroon;"&gt;#backImage&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;opacity&lt;/span&gt;: &lt;span style="color: Blue;"&gt;0&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Here’s a working version of the markup above:&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;&lt;span id="imageWrapper"&gt;
    &lt;img alt="Ending image of fade one image to another example" id="backImage" src="http://ieblog.members.winisp.net/images/20111121-imageB.jpg" /&gt;&lt;img alt="Starting image of fade one image to another example" id="frontImage" src="http://ieblog.members.winisp.net/images/20111121-imageA.jpg" /&gt;
&lt;/span&gt;
    &lt;br /&gt;
    Move your mouse over the image to fade it to another.&lt;br /&gt;
    &lt;script src="http://ie.microsoft.com/testdrive/ieblog/2011/nov/TransitionsExample.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;Simple transitions, such as the one above, are moderately easy to simulate in JavaScript.
    The benefits of CSS Transitions are their declarative definitions, making them easier
    than script, and they run—at least in IE10—asynchronously to the main processing
    thread resulting in smoother transitions and sites that are more responsive.&lt;/p&gt;
&lt;p&gt;An interactive demo of &lt;a href="http://ie.microsoft.com/testdrive/Graphics/hands-on-css3/hands-on_transitions.htm"&gt;
    CSS3 Transitions&lt;/a&gt; is available on the &lt;a href="http://ie.microsoft.com/testdrive/"&gt;
        IE Test Drive&lt;/a&gt; site. The demo works in all browsers that support CSS3 Transitions,
    including IE10 in the &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516"&gt;
        Windows Developer Preview&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Animations&lt;/h2&gt;
&lt;p&gt;CSS3 Animations are similar to CSS3 Transitions in that they smoothly animate a CSS
    value over time. The differences are (a) how one specifies the properties to animation,
    (b) how one triggers the animation and (c) the complexity of the animation possible.&lt;/p&gt;
&lt;p&gt;You define animations using a CSS “keyframes” at-rule. A simple keyframes rule that
    matches the fade out behavior of the transition above would be:&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;@keyframes&lt;/span&gt; fadeOut {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;from {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;opacity:&lt;/span&gt; &lt;span style="color: Blue;"&gt;1&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;to {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;opacity&lt;/span&gt;: &lt;span style="color: Blue;"&gt;0&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;We apply this to our image with this CSS:&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;img&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation-duration&lt;/span&gt;: &lt;span style="color: Blue;"&gt;2s&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation-delay&lt;/span&gt;: &lt;span style="color: Blue;"&gt;0s&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation-timing-function&lt;/span&gt;: &lt;span style="color: Blue;"&gt;linear&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation-fill-mode&lt;/span&gt;: &lt;span style="color: Blue;"&gt;forwards&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;img:hover&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation-name&lt;/span&gt;: &lt;span style="color: Blue;"&gt;fadeOut&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style="margin-bottom: 0;"&gt;Many of these properties are familiar from our discussion
    of transitions. The new ones are:&lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
    &lt;li&gt;&lt;a href="http://dev.w3.org/csswg/css3-animations/#the-animation-fill-mode-property-"&gt;
        animation-fill-mode&lt;/a&gt; – the “forwards” value of this property means to maintain
        the “to” property values from the end of the animation going forward in time. The
        default value of this property is “none,” which causes the properties to return
        to their non-animated values at the end of the animation. (It’s possible to construct
        the CSS above without using animation-fill-mode. Simply add “opacity: 0;” to the
        img:hover rule to maintain the ending opacity at 0.)&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://dev.w3.org/csswg/css3-animations/#the-animation-name-property-"&gt;
        animation-name&lt;/a&gt; – setting the animation-name property triggers the animation.
        When the animation-name property is set, the &lt;a href="http://dev.w3.org/csswg/css3-animations/#the-animation-delay-property-"&gt;
            animation-delay&lt;/a&gt; time starts counting down. When animation-delay reaches
        zero, the animation begins and continues for the &lt;a href="http://dev.w3.org/csswg/css3-animations/#the-animation-duration-property-"&gt;
            animation-duration&lt;/a&gt;. The &lt;a href="http://dev.w3.org/csswg/css3-animations/#animation-timing-function_tag"&gt;
                animation-timing-function&lt;/a&gt; behaves the same as the transition-timing-function
        described above.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The power of CSS3 Animations lies in the ability to specify multiple keyframes with
    properties and intermediate values that don’t have to stay within the bounds of
    the start and end values. In CSS3 Transitions, intermediate values always progress
    from the start to the end; they will never go outside that range. Animations do
    not have that restriction.&lt;/p&gt;
&lt;p&gt;This makes it possible to program a “bounce” such as shown in the markup and example
    below.&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#bouncingImage&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;width&lt;/span&gt;: &lt;span style="color: Blue;"&gt;400px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;height&lt;/span&gt;: &lt;span style="color: Blue;"&gt;267px&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;box-shadow&lt;/span&gt;: &lt;span style="color: Blue;"&gt;2px&lt;/span&gt; &lt;span style="color: Blue;"&gt;2px&lt;/span&gt; &lt;span style="color: Blue;"&gt;5px&lt;/span&gt; &lt;span style="color: Blue;"&gt;0px&lt;/span&gt; &lt;span style="color: Blue;"&gt;gray&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation-duration&lt;/span&gt;: &lt;span style="color: Blue;"&gt;2s&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation-timing-function&lt;/span&gt;: &lt;span style="color: Blue;"&gt;ease-in-out&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation-fill-mode&lt;/span&gt;: &lt;span style="color: Blue;"&gt;forwards&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Maroon;"&gt;#bouncingImage:hover&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Red;"&gt;animation-name&lt;/span&gt;: &lt;span style="color: Blue;"&gt;zoomInBounce&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;@keyframes&lt;/span&gt; zoomInBounce {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Maroon;"&gt;from&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scale(1)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Maroon;"&gt;30%&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scale(1.4)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Maroon;"&gt;40%&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scale(1.15)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Maroon;"&gt;50%&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scale(1.35)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Maroon;"&gt;60%&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scale(1.2)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Maroon;"&gt;70%&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scale(1.3)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Maroon;"&gt;80%&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scale(1.225)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Maroon;"&gt;90%&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scale(1.275)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Maroon;"&gt;to&lt;/span&gt; {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: Red;"&gt;transform&lt;/span&gt;: &lt;span style="color: Blue;"&gt;scale(1.25)&lt;/span&gt;;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img alt="Image used in the zoom in with bounce example" id="bouncingImage" src="http://ieblog.members.winisp.net/images/20111121-imageA.jpg" /&gt;&lt;br /&gt;
    Move your mouse over the image to zoom it with a bounce effect.&lt;br /&gt;
    &lt;script src="http://ie.microsoft.com/testdrive/ieblog/2011/nov/AnimationsExample.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt;An interactive demo of &lt;a href="http://ie.microsoft.com/testdrive/Graphics/hands-on-css3/hands-on_animations.htm"&gt;
    CSS3 Animations&lt;/a&gt; is available on the &lt;a href="http://ie.microsoft.com/testdrive/"&gt;
        IE Test Drive&lt;/a&gt; site. The demo works in all browsers that support CSS3 Animations,
    including IE10 in the &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516"&gt;
        Windows Developer Preview&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Building Your Site’s Personality&lt;/h2&gt;
&lt;p&gt;The two examples shared in this post are unlikely to be things you adopt on your
    site. Yet, well-designed transitions and animations are becoming an expected part
    of a modern Web experience. Windows 8 Metro style uses fluid and subtle animations
    extensively to help users better understand their interactions with the system.
    These literally make Windows 8 Metro style apps feel more responsive to touch.&lt;/p&gt;
&lt;p&gt;We hope the examples here, the IE Test Drive demos, and the growing number of articles
    and examples elsewhere on the Web help you explore this new technology and add personality
    to your Web site.&lt;/p&gt;
&lt;p&gt;—Ted Johnson, Lead Program Manager for Graphics, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10239285" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="CSS" scheme="http://blogs.msdn.com/b/ie/archive/tags/CSS/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>Typing with Speed and Accuracy in IE10</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/11/08/typing-with-speed-and-accuracy-in-ie10.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/11/08/typing-with-speed-and-accuracy-in-ie10.aspx</id><published>2011-11-08T17:00:02Z</published><updated>2011-11-08T17:00:02Z</updated><content type="html">&lt;p&gt;Typing quickly and accurately is a critical part of the user experience for any piece of 
    software. When using a device without a physical keyboard, providing a great text input 
    experience is even more important. Windows 8 provides several capabilities to make text 
    input great on any device, and spellchecking is one of them.&lt;/p&gt;
&lt;p&gt;Spellchecking in Windows 8 allows customers to identify misspelled words while
    they are entering text, have commonly misspelled words fixed automatically, and take 
    corrective action on others. In Windows 8, spellchecking support is available to applications 
    across the entire operating system, including IE10. Of course, spellchecking will also be 
    available as an IE10 browser feature on all supported versions of Windows (including
    Windows 7).&lt;/p&gt;
&lt;h2&gt;Auto-correction&lt;/h2&gt;
&lt;p&gt;IE10 has the first browser-based implementation of auto-correct.&lt;/p&gt;
&lt;p&gt;In some cases, a misspelled word is so common that it is better to just correct the 
    word immediately, rather than wait for you to review the error later In the rare case that auto-correct changes something that you didn’t want changed, 
    you can undo the change via CTRL+Z (Undo) using the keyboard, or bring up the 
    auto-correction context menu using the mouse. In addition to using the mouse, the 
    auto-correction menu can be activated via the keyboard by moving the insertion point 
    inside of the word and pressing SHIFT+F10 (that key combo works to trigger any context 
    menu). From the auto-correction menu you can also prevent the word from being 
    auto-corrected in the future.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="For auto-corrected words, press CTRL+Z to undo the change, or bring up a context menu for additional actions"
        src="http://ieblog.members.winisp.net/images/20111027-sii-image1-1.png" /&gt;&lt;br /&gt;
    &lt;span style="display: inline-block; max-width: 90%;"&gt;For auto-corrected words, press CTRL+Z to undo the change, or bring up a context
    menu for additional actions&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You can &lt;a href="http://ie.microsoft.com/testdrive/Browser/SpellChecking/"&gt;try out
    auto-correct in my test drive demo&lt;/a&gt;; it includes a short list of some of the
    common misspelled words that will be auto-corrected.&lt;/p&gt;
&lt;h2&gt;Word Identification and Corrective Actions Menu&lt;/h2&gt;
&lt;p&gt;No spellchecking experience would be complete without the red squiggles
    you’re familiar with from your favorite Office programs. &lt;/p&gt;
&lt;p&gt;By default, as you enter text into any HTML textarea element (a multi-line input
    box) or any region of editable HTML content, the spellchecking engine will be used
    to check the last entered word. The word is checked against a dictionary associated
    with the current keyboard input language. If that word is misspelled or repeated
    it will be identified as a potential error using the familiar red squiggly underline.
    The identification of potential misspelled or repeated words is done in the background
    so that it does not slow your text entry.&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="The corrective actions menu has suggested alternate words and options to add the misspelled word to your custom dictionary or ignore the word. This works across all supported languages, including Portuguese (shown here)."
        src="http://ieblog.members.winisp.net/images/20111027-sii-image2-1.png" /&gt;&lt;br /&gt;
    &lt;span style="display: inline-block; max-width: 90%;"&gt;The corrective actions menu has suggested alternate words and options to add the
    misspelled word to your custom dictionary or ignore the word. This works across
    all supported languages, including Portuguese (shown here).&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin-bottom: 0;"&gt;The corrective actions menu will offer the most likely
    replacements for the identified word. You can replace the identified word with the
    suggested word in one step by selecting it from this menu. In addition you may choose
    to:&lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
    &lt;li&gt;&lt;i&gt;Add to dictionary&lt;/i&gt;. Your Windows user account has a built-in custom dictionary (which
        is initially empty). You may add frequently used words to this dictionary (in my
        case, I always need to add my last name). &lt;a href="http://blogs.msdn.com/b/b8/archive/2011/09/26/signing-in-to-windows-8-with-a-windows-live-id.aspx"&gt;
            In Windows 8 this custom dictionary will be roamed&lt;/a&gt; to any other Windows
        8 machine that you use via the cloud.&lt;/li&gt;
    &lt;li&gt;&lt;i&gt;Ignore&lt;/i&gt;. The word will no longer be identified as a potentially misspelled
        word on this page. After you navigate away from the current page, the list of ignored
        words is cleared, and will again be flagged as a potential error. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Spellchecking in Your Language&lt;/h2&gt;
&lt;p&gt;Each of these spellchecking facilities (auto-correction, and word identification
    with corrective action menus), use the spellchecking dictionaries installed on your
    local PC. In the &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516"&gt;Windows
        Developer Preview&lt;/a&gt;, all of the dictionaries for all the supported languages
    are pre-installed. Many of the languages also include different language reform
    variants that you can toggle between in the re-designed Language control panel.
    All spellchecking options can be managed in the language control panel in Windows
    8. On Windows 7, the spellchecking management experience for IE10 will be provided
    by the browser instead; I'll describe this in more detail in a future post.
&lt;/p&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="The Windows 8 language options dialog for Portuguese (Brazil), including language reform variants"
        src="http://ieblog.members.winisp.net/images/20111027-sii-image3-1.png" /&gt;&lt;br /&gt;
    The Windows 8 language options dialog for Portuguese (Brazil), including language
    reform variants&lt;/p&gt;
&lt;p&gt;Internet Explorer 10 supports spellchecking in many common languages. 
    &lt;a href="http://ieblog.members.winisp.net/images/20111027-IE10SpellingLanguages.html" target="_blank"&gt;View a list&lt;/a&gt; of supported 
    spellchecking dictionaries and language/locales, including language reform variants.&lt;/p&gt;
&lt;p&gt;There are sometimes needs for highly specialized spellchecking dictionaries, for example,
    in specific industries with their own vernacular or for languages not commonly
    spoken such as Latin. To support these scenarios, the Windows 8 spellchecking facility supports 3rd party spellchecking engines. When installed, IE10 and all other Windows
    components will use the installed 3rd party spellchecking engine.&lt;/p&gt;
&lt;h2&gt;Web Developer Options&lt;/h2&gt;
&lt;p&gt;As alluded to earlier, &lt;i&gt;textarea&lt;/i&gt; and &lt;i&gt;contenteditable&lt;/i&gt; elements are spellchecked
    by default; single-line input boxes (input type=text) are not checked by default
    since many sites use them for username fields or other purposes not suitable for
    spellchecking. We tried to pick good defaults, but if your Web site needs to change
    any of these defaults, it can. The ‘spellcheck’ attribute defined by HTML5 allows
    you as a developer to override the default spellchecking behavior for an element
    and all of its children.&lt;/p&gt;
&lt;p&gt;By adding the &lt;i&gt;spellcheck=false&lt;/i&gt; attribute value on any element, you disable
    spellchecking for all &lt;i&gt;textarea&lt;/i&gt;, &lt;i&gt;contenteditable&lt;/i&gt;, and &lt;i&gt;input type=text&lt;/i&gt;
    elements that are children of the given element (including the element itself).
    Setting &lt;i&gt;spellcheck=true&lt;/i&gt; enables spellchecking in the same scenario, and can
    also be used to override the spellchecking setting from a parent in the element
    tree. For example, if you want spellchecking disabled for all &lt;i&gt;textarea&lt;/i&gt; elements
    on a page, with one exception, you can add the &lt;i&gt;spellcheck=false&lt;/i&gt; attribute
    value to the HTML element, and then add a &lt;i&gt;spellcheck=true&lt;/i&gt; attribute to the
    textarea element that is the exception.&lt;/p&gt;
&lt;p&gt;Try out this capability &lt;a href="http://ie.microsoft.com/testdrive/Browser/SpellChecking/"&gt;
    using the spellchecking IE10 test drive demo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The spellcheck attribute gives Web developers the flexibility to tailor the experience to 
    the needs of their users.&lt;/p&gt;
&lt;h2&gt;Spellchecking and Multiple Languages&lt;/h2&gt;
&lt;p&gt;We know a lot of our customers speak and write in more than one language. It’s important
    that the spellchecking engine use the right language when you are entering text,
    and that it is easy to switch between languages when necessary.&lt;/p&gt;
&lt;p style="margin-bottom: 0;"&gt;In IE10, the selection of the spellchecking language is
    determined by evaluating the following sources (in priority order):&lt;/p&gt;
&lt;ul style="margin-top: 0;"&gt;
    &lt;li&gt;The HTML &lt;i&gt;lang&lt;/i&gt; attribute. The Web developer knows the design and intent of
        the site and can control which parts of the page are associated with which language
        (in multi-language scenarios).&lt;/li&gt;
    &lt;li&gt;The keyboard input language. Windows 8 makes it easy for users to specify the languages
        they are interested in and to switch between them on the fly. To switch the language
        used by the spellchecking engine while entering text, you simply change the input
        language. With two or more languages configured (or two or more keyboard layouts)
        simply press the Windows key + spacebar. On the touch keyboard, there is a key to
        toggle the input language as well.&lt;/li&gt;
    &lt;li&gt;Window’s current display language (the language you are using to run Windows).&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: center; font-size: 8.25pt; font-style: italic;"&gt;
    &lt;img style="max-width: 95%;" alt="Switch between keyboard input languages via Win+Space or by the language key on the touch keyboard"
        src="http://ieblog.members.winisp.net/images/20111107-sii-image4-1.png" /&gt;&lt;br /&gt;
    Switch between keyboard input languages via Win+Space or by the language key on
    the touch keyboard&lt;/p&gt;
&lt;p&gt;Spellchecking is an IE10 feature; while it is seamlessly integrated into Windows
    8, we want to ensure that all users of IE10 benefit from this feature, including
    our users of IE10 on Windows 7. I’ll share more about the IE10 on Windows 7 experience
    in a future post.&lt;/p&gt;
&lt;p&gt;Spellchecking in the browser will improve the accuracy and speed at which you input text 
    on the Web. I’ve really enjoyed having it available and I know that the people with whom I 
    correspond online also appreciate it!&lt;/p&gt;
&lt;p&gt;—Travis Leithead, Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10235048" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="User Experiences" scheme="http://blogs.msdn.com/b/ie/archive/tags/User+Experiences/" /><category term="New in IE10" scheme="http://blogs.msdn.com/b/ie/archive/tags/New+in+IE10/" /></entry><entry><title>HTML5 History in IE10</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/ie/archive/2011/10/31/html5-history-in-ie10.aspx" /><id>http://blogs.msdn.com/b/ie/archive/2011/10/31/html5-history-in-ie10.aspx</id><published>2011-10-31T22:42:13Z</published><updated>2011-10-31T22:42:13Z</updated><content type="html">&lt;p&gt;Building fast and functional sites is a challenge with which most Web developers are familiar. Loading a new page every time the user clicks a link is slow. Fetching all content dynamically effectively disables the back button. Working with &lt;a href="http://msdn.microsoft.com/en-us/library/cc288209(v=vs.85).aspx"&gt;hashes&lt;/a&gt; is better, but still not ideal. Internet Explorer 10 in the &lt;a href="http://msdn.microsoft.com/en-us/windows/apps/br229516"&gt;Windows Developer Preview&lt;/a&gt; eliminates the compromise by adding support for &lt;a href="http://www.w3.org/TR/html5/history.html"&gt;HTML5 History&lt;/a&gt;. The &lt;i&gt;pushState&lt;/i&gt;, &lt;i&gt;replaceState&lt;/i&gt;, and &lt;i&gt;popstate&lt;/i&gt; APIs provide fine-grained control over the behavior of the back button and the URL presented to the user for dynamic content. Together these APIs help you improve the performance of your site without sacrificing usability.&lt;/p&gt;
&lt;p&gt;If you’re not already familiar with the HTML5 History APIs, think of &lt;i&gt;pushState&lt;/i&gt; as being the dynamic equivalent of navigating to another page. Similarly, &lt;i&gt;replaceState&lt;/i&gt; is much like &lt;i&gt;location.replace&lt;/i&gt;. The difference is these APIs leave the current page intact when updating the &lt;a href="http://dev.w3.org/html5/spec/Overview.html#the-session-history-of-browsing-contexts"&gt;session history&lt;/a&gt; by storing states instead of pages. Both &lt;i&gt;pushState&lt;/i&gt; and &lt;i&gt;replaceState&lt;/i&gt; take three parameters: a data object, a title, and an optional URL. &lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;history.pushState(data, title, url);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;history.replaceState(data, title, url);&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Note that the title parameter to &lt;i&gt;pushState&lt;/i&gt; and &lt;i&gt;replaceState&lt;/i&gt; is ignored by most browsers, including IE10. If you want, you can still provide this information since future browsers may expose it as part of their history UI.&lt;/p&gt;
&lt;h2&gt;Setting Custom URLs&lt;/h2&gt;
&lt;p&gt;The URL parameter to &lt;i&gt;pushState&lt;/i&gt; and &lt;i&gt;replaceState&lt;/i&gt; can be used to update the URL of the page without navigating. To illustrate, consider you’ve loaded “http://www.contoso.com/index.html.” Using hash changes, you can only append to the URL:&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Change to &amp;quot;http://www.contoso.com/index.html#about.html&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;location.hash = &lt;span style="color: Maroon;"&gt;&amp;quot;about.html&amp;quot;&lt;/span&gt;;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;But with &lt;i&gt;pushState&lt;/i&gt; and &lt;i&gt;replaceState&lt;/i&gt; you can point to a completely different page on your site without actually going there:&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Change to &amp;quot;http://www.contoso.com/about.html&amp;quot;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;history.pushState(&lt;span style="color: Blue;"&gt;null&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;&amp;quot;About&amp;quot;&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;&amp;quot;/about.html&amp;quot;&lt;/span&gt;); &lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Make sure your server can handle all dynamic URLs you create so things like favorites still work. You can also add some data to the state object so you don’t have to parse the full URL later to restore the state:&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;history.pushState(&lt;span style="color: Maroon;"&gt;&amp;quot;about.html&amp;quot;&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;&amp;quot;About&amp;quot;&lt;/span&gt;, &lt;span style="color: Maroon;"&gt;&amp;quot;/about.html&amp;quot;&lt;/span&gt;);&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The protocol, hostname, and port must match the current URL, but the path, query, and fragment are fair game for customization. This enables associating dynamic states with URLs that are easily backed by the server and work even when script is disabled. Ultimately, this lets you dynamically fetch and display only the data that changes from page to page while keeping the user experience intact.&lt;/p&gt;
&lt;h2&gt;Restoring Saved States&lt;/h2&gt;
&lt;p&gt;You should restore state after navigating the history (for example, when the user presses the back button) or reloading the page. Restoring state is accomplished by listening to the &lt;i&gt;popstate event&lt;/i&gt;. The &lt;i&gt;popstate event&lt;/i&gt; fires when state changes as a result of history navigation. At this point the data object for the destination state can be retrieved via &lt;i&gt;history.state&lt;/i&gt;. In cases where the page is reloaded the &lt;i&gt;popstate event&lt;/i&gt; will not fire, but &lt;i&gt;history.state&lt;/i&gt; can still be accessed at any time during or even after the load. Thus code like the following can restore state at the appropriate times:&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;function&lt;/span&gt; init() {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;/* ... */&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Handle page load and reload&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;loadState();&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Listen for history navigations (e.g. the back button)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;window.addEventListener(&lt;span style="color: Maroon;"&gt;&amp;quot;popstate&amp;quot;&lt;/span&gt;, loadState, &lt;span style="color: Blue;"&gt;false&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;function&lt;/span&gt; loadState() {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Grab the data for the current state so we can restore it&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; state = history.state;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;/* ... */&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;init();&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Storing Complex, Dynamic Data&lt;/h2&gt;
&lt;p&gt;The data object stored in a state can be more than a string. Custom JavaScript objects and even some native types such as &lt;i&gt;ImageData&lt;/i&gt; can also be used. The data provided is saved using the &lt;a href="http://dev.w3.org/html5/spec/common-dom-interfaces.html#safe-passing-of-structured-data"&gt;structured clone algorithm&lt;/a&gt;, which preserves complex relationships such as cycles and multiple references to the same object. This makes saving and restoring even complex objects a breeze as illustrated in &lt;a href="http://ieblog.members.winisp.net/images/simplehistorydemo.html"&gt;this simple demo&lt;/a&gt;. In the demo, snapshots of a canvas are captured to create an undo stack using code like the following:&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;function&lt;/span&gt; init() {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;/* ... */&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Handle page load and reload&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;loadState();&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Listen for history navigations (e.g. the back button)&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;window.addEventListener(&lt;span style="color: Maroon;"&gt;&amp;quot;popstate&amp;quot;&lt;/span&gt;, loadState, &lt;span style="color: Blue;"&gt;false&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;/* ... */&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;function&lt;/span&gt; stopDrawing() {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Take a snapshot of the current state as an ImageData instance&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; state = context.getImageData(0, 0, canvas.width, canvas.height);&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;history.pushState(state, &lt;span style="color: Maroon;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;/* ... */&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 2em"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;function&lt;/span&gt; loadState() {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Grab the data for the current state so we can restore it&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; state = history.state;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;/* ... */&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Blue;"&gt;if&lt;/span&gt; (state) {&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;// Restore the canvas to our saved ImageData state&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;context.putImageData(state, 0, 0);&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;}&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;To change this to keep track of the current state without tracking each change, you can use &lt;i&gt;replaceState&lt;/i&gt; instead of &lt;i&gt;pushState&lt;/i&gt;.&lt;/p&gt;
&lt;h2&gt;Size Considerations&lt;/h2&gt;
&lt;p&gt;HTML5 History makes pushing large amounts of data onto the stack easy if you’re not careful. For example, the undo demo above stores ~0.5MB per state and could easily use more if the canvas was larger. This data will consume memory as long the associated state entry remains in the session history, which can be long after the user leaves your site. The more data you store, the sooner a browser may start clearing your entries out to save space. In addition, some browsers also enforce a hard limit on the amount of data that can be stored with a single call to &lt;i&gt;pushState&lt;/i&gt; or &lt;i&gt;replaceState&lt;/i&gt;. &lt;/p&gt;
&lt;h2&gt;Cross-Browser Considerations&lt;/h2&gt;
&lt;p&gt;As always, use feature detection to handle differences in support across browsers. Since most of HTML5 History involves events and properties, the only new parts that truly require detection are calls to &lt;i&gt;pushState&lt;/i&gt; and &lt;i&gt;replaceState&lt;/i&gt;:&lt;/p&gt;
&lt;div style="font-family: Consolas, Monospace; font-size: 13px; color: Black; text-indent: -4em; padding: 0 0.25in;"&gt;&lt;div style="background-color: #f0f0f0; padding: 0 4px 2px 4px;"&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;&lt;span style="color: Blue;"&gt;function&lt;/span&gt; stopDrawing() {&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Blue;"&gt;var&lt;/span&gt; state = context.getImageData(0, 0, canvas.width, canvas.height);&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: Blue;"&gt;if&lt;/span&gt; (history.pushState)&lt;/p&gt;
&lt;p style="margin: 0 0 0 8em;"&gt;history.pushState(state, &lt;span style="color: Maroon;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style="margin: 0 0 0 6em;"&gt;&lt;span style="color: rgb(0,100,0);"&gt;/* ... */&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 0 0 0 4em;"&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Such detection will at least keep your script from failing in older browsers. Depending on your scenario, you may want to start with full-page navigations and upgrade to dynamic content when HTML5 History is supported. Alternatively, you can use a history framework or &lt;a href="http://remysharp.com/2010/10/08/what-is-a-polyfill/"&gt;polyfill&lt;/a&gt; to keep the back button working, but keep in mind that not everything can be emulated. For example, dynamic control over the path and query components of an URL can only be achieved via &lt;i&gt;pushState&lt;/i&gt; and &lt;i&gt;replaceState&lt;/i&gt;.&lt;/p&gt;
&lt;p style="margin-bottom:0;"&gt;Note that some browsers support an earlier draft of HTML5 History with two notable differences from the current draft:&lt;/p&gt;
&lt;ul style="margin-top:0;"&gt;
&lt;li&gt;The &lt;i&gt;popstate&lt;/i&gt; event fires even during page load&lt;/li&gt;
&lt;li&gt;The &lt;i&gt;history.state&lt;/i&gt; property does not exist&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In order to support these browsers, you can fall back to reading the state information off the &lt;i&gt;popstate&lt;/i&gt; event itself.&lt;/p&gt;
&lt;h2&gt;Wrap Up&lt;/h2&gt;
&lt;p&gt;Overall, the HTML5 History APIs provide a great deal of flexibility for building responsive and usable Web sites. With some care taken for legacy browsers, these APIs can be used today to great effect. Start testing them with your site in IE10 on the &lt;a href="http://ie.microsoft.com/testdrive/Info/Downloads/Default.html"&gt;Windows Developer Preview&lt;/a&gt; and send feedback via Connect. &lt;/p&gt;
&lt;p&gt;—Tony Ross, Program Manager, Internet Explorer&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10231854" width="1" height="1"&gt;</content><author><name>ieblog</name><uri>http://blogs.msdn.com/ieblog/ProfileUrlRedirect.ashx</uri></author><category term="Developers" scheme="http://blogs.msdn.com/b/ie/archive/tags/Developers/" /><category term="HTML5" scheme="http://blogs.msdn.com/b/ie/archive/tags/HTML5/" /></entry></feed>
