<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Windows Live Quantum Mechanics : Windows Live</title><link>http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx</link><description>Tags: Windows Live</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>MIX07 UK Podcast with Craig Murphy</title><link>http://blogs.msdn.com/dthorpe/archive/2007/09/24/mix07-uk-podcast-with-craig-murphy.aspx</link><pubDate>Mon, 24 Sep 2007 20:37:18 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5102713</guid><dc:creator>dthorpe</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/5102713.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=5102713</wfw:commentRss><description>&lt;p&gt;I sat down with &lt;a href="http://www.craigmurphy.com"&gt;Craig Murphy&lt;/a&gt; to &lt;a href="http://www.craigmurphy.com/blog/?p=692"&gt;chat about Windows Live and life in general&lt;/a&gt; at MIX07 UK.&amp;nbsp;&amp;nbsp;Craig has just posted&amp;nbsp;a &lt;a href="http://www.craigmurphy.com/blog/?p=692"&gt;podcast&lt;/a&gt; of that conversation.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I've known Craig for many years through the Delphi community.&amp;nbsp; I think we first met in person in&amp;nbsp;2001 at "The Delphi Conference" run by the Borland User Group UK.&amp;nbsp;&amp;nbsp;Aha! Found&amp;nbsp;&lt;a href="http://www.facebook.com/photo.php?pid=178704&amp;amp;l=14c11&amp;amp;id=541062793"&gt;a photo&lt;/a&gt;.&amp;nbsp; Craig got his start&amp;nbsp;as one of the pillars of the Delphi developer community -&amp;nbsp;particularly at the Scottish end of the isles.&amp;nbsp;Today he provides much the same community organizing and informing service over a much broader swath of tech topics as a Microsoft MVP.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5102713" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Blogging/default.aspx">Blogging</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/events/default.aspx">events</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/MIX07/default.aspx">MIX07</category></item><item><title>MIX07 UK Blogging</title><link>http://blogs.msdn.com/dthorpe/archive/2007/09/14/mix07-uk-blogging.aspx</link><pubDate>Sat, 15 Sep 2007 06:54:51 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4922322</guid><dc:creator>dthorpe</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/4922322.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=4922322</wfw:commentRss><description>&lt;p&gt;The title of honorary MIX07 UK stenographer goes to &lt;a href="http://serialseb.blogspot.com/"&gt;Sebastien Lambla (aka SerialSeb)&lt;/a&gt;for transcribing nearly word for word just about every session he attended this week, in realtime!&amp;nbsp; Check out the detail in his notes on &lt;a href="http://serialseb.blogspot.com/2007/09/mixuk-07-building-next-generation-web.html"&gt;"Building Next Generation Web Applications using Windows Live Services"&lt;/a&gt;, for example.&amp;nbsp; He has half a dozen more posts on Mix07 UK just as detailed. Way to go SerialSeb! &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4922322" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Blogging/default.aspx">Blogging</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/events/default.aspx">events</category></item><item><title>PodCast Interview on LiveSide.Net</title><link>http://blogs.msdn.com/dthorpe/archive/2007/09/14/podcast-interview-on-liveside-net.aspx</link><pubDate>Sat, 15 Sep 2007 06:20:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4921935</guid><dc:creator>dthorpe</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/4921935.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=4921935</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/angus%5Flogan/"&gt;Angus&lt;/a&gt; and I had a &lt;a href="http://www.liveside.net/blogs/interview/archive/2007/09/14/windows-live-platform-interview-with-danny-thorpe-and-angus-logan.aspx"&gt;chat with the guys from LiveSide.Net&lt;/a&gt; during the MIX07 UK conference this week.&amp;nbsp; Check it out!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4921935" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/events/default.aspx">events</category></item><item><title>Halo 3 Promo Videos Running on Silverlight Streaming</title><link>http://blogs.msdn.com/dthorpe/archive/2007/09/04/halo-3-promo-videos-running-on-silverlight-streaming.aspx</link><pubDate>Tue, 04 Sep 2007 21:32:44 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4746893</guid><dc:creator>dthorpe</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/4746893.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=4746893</wfw:commentRss><description>&lt;p&gt;The promotional campaign for the new &lt;a href="http://www.halo3.com/"&gt;Halo 3&lt;/a&gt; FPS has begun with a series of in-game and thematic live action videos.&amp;nbsp; High-def 2mbps videos are here:&amp;nbsp; &lt;a href="http://halo3.msn.com/videosHD.aspx"&gt;http://halo3.msn.com/videosHD.aspx&lt;/a&gt;&amp;nbsp; Lower bandwidth versions of the same are here:&amp;nbsp; &lt;a href="http://halo3.msn.com/videos.aspx"&gt;http://halo3.msn.com/videos.aspx&lt;/a&gt;&amp;nbsp; These are already on the msn boards and will be referenced by&amp;nbsp;additional promotional spots throughout the rollout.&amp;nbsp; &lt;/p&gt; &lt;p&gt;How is the Halo promotions team serving up video to tens of millions of viewers over the next few days and weeks?&amp;nbsp; With Silverlight Streaming!&amp;nbsp;The video player is built with &lt;a href="http://www.microsoft.com/silverlight/"&gt;Silverlight&lt;/a&gt;, and the video content is being served up by &lt;a href="http://dev.live.com/silverlight/"&gt;Silverlight Streaming&lt;/a&gt;.&amp;nbsp; (The last&amp;nbsp;of the HD vids are being moved to SLS this afternoon to better handle the traffic volume)&amp;nbsp; &lt;/p&gt; &lt;p&gt;Way to go team!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4746893" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>MSN's The Podium 08 - Built On Silverlight</title><link>http://blogs.msdn.com/dthorpe/archive/2007/08/24/msn-s-the-podium-08-built-on-silverlight.aspx</link><pubDate>Sat, 25 Aug 2007 02:54:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4549717</guid><dc:creator>dthorpe</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/4549717.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=4549717</wfw:commentRss><description>&lt;p&gt;MSN just launched &lt;a href="http://election.msn.com/podium08.aspx"&gt;The Podium '08&lt;/a&gt;&amp;nbsp;as part of their 2008 US Presidential election coverage.&amp;nbsp; The Podium '08 brings together data on&amp;nbsp;presidential candidates for voters and election followers to&amp;nbsp;explore by topic and compare candidates head to head on specific issues.&lt;/p&gt; &lt;p&gt;What's interesting about The Podium is that the content is not canned editorial material.&amp;nbsp; When you select a candidate and click on a specific issue (say, Immigration) to see where the candidate stands on that issue, the list of articles displayed is actually drawn from Live Search on the fly.&amp;nbsp; As new articles appear on the web on these candidates and these topics, those articles&amp;nbsp;will&amp;nbsp;appear in&amp;nbsp;The Podium 08 for that candidate and topic.&lt;/p&gt; &lt;p&gt;The Podium 08 is built using&amp;nbsp;&lt;a href="http://www.microsoft.com/silverlight/"&gt;Silverlight&lt;/a&gt; 1.0 to present a slick, modern rich UI experience&amp;nbsp;that seamlessly and intelligently integrates services on the back-end.&amp;nbsp;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Want to&amp;nbsp;see what Software plus Services means to the average Joe?&amp;nbsp; Take a look at &lt;a href="http://election.msn.com/podium08.aspx"&gt;The Podium 08&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4549717" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Mashups/default.aspx">Mashups</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/web/default.aspx">web</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Windows Live SkyDrive</title><link>http://blogs.msdn.com/dthorpe/archive/2007/08/15/windows-live-skydrive.aspx</link><pubDate>Wed, 15 Aug 2007 21:58:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4403471</guid><dc:creator>dthorpe</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/4403471.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=4403471</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://skydrive.live.com"&gt;Windows Live SkyDrive&lt;/a&gt; (formerly known as Folders) is now in beta, enabling end users to store arbitrary data on the web under password access control.&amp;nbsp; Files can be accessed over http(s) from web pages and from stand-alone client applications (thanks to the http file handler add-on in XPSP2).&amp;nbsp; Files can be private to your Windows LiveID only, shared with other specific users (via their Windows LiveID), or publicly accessible to everyone on the Internet, anonymously.&lt;/p&gt; &lt;p&gt;The layout feels similar to SharePoint, with web-based directory trees and file metadata browsing and editing.&amp;nbsp; There's no mention of drive letter mapping (ala file shares) in the SkyDrive intro docs, but I'm sure someone will create a utility to map your private SkyDrive folder to a local drive letter.&amp;nbsp; It'd certainly be a slick way to shortcut the traditional file upload process.&lt;/p&gt; &lt;p&gt;SkyDrive isn't a web host - it's not intended to be the place from which you run a web app (html content), but you can store files in SkyDrive that are&amp;nbsp;referenced by your web app running on your own server or hosted provider. Browser cross-domain barriers stilly apply: you can easily reference JavaScript or image files stored on your SkyDrive from your web site, but the JavaScript in your web pages will not be able to read or write the SkyDrive files directly because they reside in a different domain than your web app.&lt;/p&gt; &lt;p&gt;You can link to individual files in your SkyDrive storage using plain old URLs, like this: &lt;a href="http://cid-96c2e8efd844bbf0.skydrive.live.com/self.aspx/Public/Paradoxes%20in%20Web%20App%20Development.ppt"&gt;Paradoxes in Web App Development&lt;/a&gt;&amp;nbsp;or you can embed a "badge" for the file in your web page in a couple of different styles,&amp;nbsp;like this:&lt;/p&gt; &lt;p&gt;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-96c2e8efd844bbf0.skydrive.live.com/embedrowdetail.aspx/Public/Paradoxes%20in%20Web%20App%20Development.ppt" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;or this: &lt;/p&gt; &lt;p&gt;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 26px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-96c2e8efd844bbf0.skydrive.live.com/embedrow.aspx/Public/Paradoxes%20in%20Web%20App%20Development.ppt" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;You can also embed a folder to direct&amp;nbsp;viewers to whole directories of related file content:&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-96c2e8efd844bbf0.skydrive.live.com/embedrowdetail.aspx/Public/" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt; &lt;p&gt;This will make it a &lt;strong&gt;lot&lt;/strong&gt; easier to post presentation slide decks, podcasts, code samples and demo app source code for blog articles!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4403471" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Blogging/default.aspx">Blogging</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/web/default.aspx">web</category></item><item><title>New In The Windows Live Contacts Control: Incremental Search!</title><link>http://blogs.msdn.com/dthorpe/archive/2007/08/08/new-in-the-windows-live-contacts-control-incremental-search.aspx</link><pubDate>Thu, 09 Aug 2007 01:01:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4298289</guid><dc:creator>dthorpe</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/4298289.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=4298289</wfw:commentRss><description>&lt;p&gt;Another month, another release!&amp;nbsp; This month we've added incremental search to the contacts and presence controls to make it easier to find a particular contact in your haystack of hundreds of family, friends, and coworkers.&amp;nbsp; Just type in a few letters of the name or word you're looking for, and the control will reduce the list of displayed contacts to only those that contain that letter sequence, anywhere in the contact display name, case insensitive.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Check it out in our little control testbed apps:&amp;nbsp; &lt;a href="http://dev.live.com/mashups/trycontactscontrol"&gt;http://dev.live.com/mashups/trycontactscontrol&lt;/a&gt; and &lt;a href="http://dev.live.com/mashups/trypresencecontrol"&gt;http://dev.live.com/mashups/trypresencecontrol&lt;/a&gt;&lt;/p&gt; &lt;p&gt;While we were at it, we also added support for filtering the&amp;nbsp;list by group as well.&amp;nbsp; Click on the dropdown button to the right of the search box to select from a list of groups you have defined in your addressbook.&amp;nbsp; In the Contacts Control in tile view, you can also filter by online state, to display only your buddies that are online, for example.&lt;/p&gt; &lt;p&gt;We've cleaned up the control UI a bit, too.&amp;nbsp;The info panel below the contacts list didn't get favorable reviews from the field, so&amp;nbsp;we've removed it&amp;nbsp;to make room for displaying more contacts in our always-cramped-for-display-real-estate web control.&amp;nbsp; The edit and delete buttons that bordered the info panel have been moved to the display contact details page.&amp;nbsp; You really ought to review the details before editing or deleting anyway, so putting them all on the same page makes sense.&lt;/p&gt; &lt;p&gt;What do you need to do to pick up these new features?&amp;nbsp; Nothing!&amp;nbsp; It's an inline release on the v0.3 version.&amp;nbsp; As long as you're referencing &lt;a href="http://controls.services.live.com/scripts/base/v0.3/live.js"&gt;http://controls.services.live.com/scripts/base/v0.3/live.js&lt;/a&gt;&amp;nbsp;and &lt;a href="http://controls.services.live.com/scripts/base/v0.3/controls.js"&gt;http://controls.services.live.com/scripts/base/v0.3/controls.js&lt;/a&gt;&amp;nbsp;in your web page, you'll get these enhancements and refinements for free.&lt;/p&gt; &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4298289" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category></item><item><title>Custom Colors in the Windows Live Web Controls</title><link>http://blogs.msdn.com/dthorpe/archive/2007/06/28/custom-colors-in-the-windows-live-web-controls.aspx</link><pubDate>Fri, 29 Jun 2007 01:26:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3593218</guid><dc:creator>dthorpe</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/3593218.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=3593218</wfw:commentRss><description>&lt;p&gt;The Windows Live Web Controls now support custom colors!&amp;nbsp; The &lt;a href="http://dev.live.com/contactscontrol/"&gt;Windows Live Contacts web control&lt;/a&gt; and &lt;a href="http://dev.live.com/spacescontrol"&gt;Windows Live Spaces web control&lt;/a&gt; now accept additional parameters to specify the text and background colors of the inner and outer regions of the controls so that you can "skin" the controls to more naturally blend in with your web site's color scheme.&lt;/p&gt; &lt;p&gt;So you can now do this:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/CustomColorsintheWindowsLiveWebControls_D939/image%7B0%7D%5B6%5D.png" atomicselection="true"&gt;&lt;img height="313" src="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/CustomColorsintheWindowsLiveWebControls_D939/image%7B0%7D_thumb%5B4%5D.png" width="212"&gt;&lt;/a&gt; &lt;a href="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/CustomColorsintheWindowsLiveWebControls_D939/image%7B0%7D%5B13%5D.png" atomicselection="true"&gt;&lt;img height="314" src="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/CustomColorsintheWindowsLiveWebControls_D939/image%7B0%7D_thumb%5B7%5D.png" width="212"&gt;&lt;/a&gt; &lt;a href="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/CustomColorsintheWindowsLiveWebControls_D939/image%7B0%7D%5B14%5D.png" atomicselection="true"&gt;&lt;img height="311" src="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/CustomColorsintheWindowsLiveWebControls_D939/image%7B0%7D_thumb%5B8%5D.png" width="209"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;We use the term "inner" and "outer" because the inner region serves slightly different purposes in the different controls.&amp;nbsp; In the Contacts Control's list view, the inner region is the listbox containing the scrollable list of contacts.&amp;nbsp; In tile view, it's a list of contact photo tiles.&amp;nbsp; In the Spaces Control, it's a list of photo thumbnails.&lt;/p&gt; &lt;p&gt;The Windows Live logo banner is now a transparent PNG with an alpha blended halo to provide contrast against any background color.&lt;/p&gt; &lt;p&gt;The color parameters are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;OuterBackgroundColor&lt;/li&gt; &lt;li&gt;OuterTextColor&lt;/li&gt; &lt;li&gt;InnerBackgroundColor&lt;/li&gt; &lt;li&gt;InnerTextColor&lt;/li&gt; &lt;li&gt;LinkColor&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;These color parameters determine the screen color for everything&amp;nbsp;in the controls displayed in-situ on your host page&amp;nbsp;except for the submit button, the scrollbar, the piping and the Windows Live logo.&amp;nbsp; Popup windows for Windows Live login or user confirmations, error messages, and user prompts&amp;nbsp;are not affected by custom colors.&lt;/p&gt; &lt;p&gt;The color values you can assign to these color parameters follow the &lt;a href="http://www.w3.org/TR/REC-CSS1#color-units"&gt;W3C CSS color specification&lt;/a&gt;:&amp;nbsp; 15 color names, plus hexadecimal notation (#FFFFFF), plus RGB octets notation ("rgb(255,255,255)").&lt;/p&gt; &lt;p&gt;The "try*" demo apps have also been updated to&amp;nbsp;help you configure the colors interactively and see how they look:&amp;nbsp; &lt;a href="http://dev.live.com/mashups/trycontactscontrol"&gt;trycontactscontrol&lt;/a&gt;, &lt;a href="http://dev.live.com/mashups/trypresencecontrol"&gt;trypresencecontrol&lt;/a&gt;, &lt;a href="http://dev.live.com/mashups/trystoragecontrol"&gt;trystoragecontrol&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3593218" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category></item><item><title>Secure Cross-Domain Communication:  The Architecture Journal</title><link>http://blogs.msdn.com/dthorpe/archive/2007/06/18/secure-cross-domain-communication-the-architecture-journal.aspx</link><pubDate>Tue, 19 Jun 2007 01:53:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3392059</guid><dc:creator>dthorpe</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/3392059.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=3392059</wfw:commentRss><description>&lt;p&gt;The June issue (Journal 12) of &lt;a href="http://msdn2.microsoft.com/en-us/arcjournal/default.aspx"&gt;The Architecture Journal&lt;/a&gt;&amp;nbsp;focuses on web architecture.&amp;nbsp; I was delighted to be invited to contribute, and wrote "Secure Cross-Domain Communication in the Browser" for this issue.&amp;nbsp;&amp;nbsp;In the article I&amp;nbsp;describe&amp;nbsp;a&amp;nbsp;somewhat bizarre technique we use in the&amp;nbsp;&lt;a href="http://dev.live.com/contactscontrol/"&gt;Windows Live Contacts web control&lt;/a&gt; and &lt;a href="http://dev.live.com/spacescontrol"&gt;Windows Live Spaces web control&lt;/a&gt; to move data from HTML pages running on&amp;nbsp;*.live.com to and from third party web sites.&amp;nbsp; This is how the contacts control returns&amp;nbsp;user-selected contact data to the page hosting the control, a web site that is not a Microsoft site.&amp;nbsp;&amp;nbsp;&lt;/p&gt; &lt;p&gt;The print edition of &lt;a href="http://download.microsoft.com/download/f/5/2/f520c83a-d2ed-4be8-9bc6-b39a1f9a4562/AJ12_EN.zip"&gt;Journal 12&lt;/a&gt; is out already and was handed out at TechEd in Orlando&amp;nbsp;earlier this month.&amp;nbsp; You can request&amp;nbsp;a print copy by registering on the Journal's web site, or you can just &lt;a href="http://download.microsoft.com/download/f/5/2/f520c83a-d2ed-4be8-9bc6-b39a1f9a4562/AJ12_EN.zip"&gt;grab the PDF&lt;/a&gt; and read it on-screen.&amp;nbsp;&amp;nbsp;Journal 12&amp;nbsp;will&amp;nbsp;rotate into the headlines on the Journal's homepage soon.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/dthorpe/archive/2007/05/31/quot-undisclosed-browser-technology-quot.aspx"&gt;A few posts ago&lt;/a&gt; I mentioned I could finally reveal &lt;a href="http://blogs.msdn.com/dthorpe/archive/2007/05/31/quot-undisclosed-browser-technology-quot.aspx"&gt;what I had been working on at Google&lt;/a&gt;.&amp;nbsp; Now I can also tell you in exquisite detail what I've been working on here at Microsoft for the past year and foreseeable future:&amp;nbsp; cross-domain browser communication techniques.&amp;nbsp; Coaxing stubborn little bits to migrate through impenetrable browser&amp;nbsp;barriers.&amp;nbsp; &lt;/p&gt; &lt;p&gt;"Secure Cross-Domain Communication in the Browser"&amp;nbsp;is a high-level walk-through of the iframe URL technique of passing information between domain contexts in the browser, it's limitations and weaknesses, and the approach we've taken to build a channel communications library to fortify against those weaknesses and limitations.&lt;/p&gt; &lt;p&gt;Over the next few weeks I will be posting here on&amp;nbsp;&lt;a href="http://blogs.msdn.com/dthorpe/"&gt;Windows Live Quantum Mechanics&lt;/a&gt;&amp;nbsp;a series of articles&amp;nbsp;digging into the nitty gritty of cross-domain communication, why it has been&amp;nbsp;taboo&amp;nbsp;in the browser, why it's time to change that perception, and techniques and code you can use today to achieve it - without compromising security or server scalability.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Cross domain communication would be much easier with the browser's help and shepherding, but with a little bit of effort we can actually do quite a bit today - safely -&amp;nbsp;in spite of the browser's objections.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3392059" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Blogging/default.aspx">Blogging</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/cross+domain/default.aspx">cross domain</category></item><item><title>Windows Live Web Controls Mix07 Video</title><link>http://blogs.msdn.com/dthorpe/archive/2007/06/18/windows-live-web-controls-mix07-video.aspx</link><pubDate>Mon, 18 Jun 2007 21:40:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3388452</guid><dc:creator>dthorpe</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/3388452.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=3388452</wfw:commentRss><description>&lt;p&gt;In the better late than never department, a video interview with Koji and me from the week prior to MIX07 is now posted on Channel 9:&amp;nbsp; &lt;a href="http://channel9.msdn.com/ShowPost.aspx?PostID=317385"&gt;http://channel9.msdn.com/ShowPost.aspx?PostID=317385&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Yay!&amp;nbsp; Thanks Catherine for pushing it on through.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3388452" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/events/default.aspx">events</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/MIX07/default.aspx">MIX07</category></item><item><title>New Domains for Windows Live Web Controls</title><link>http://blogs.msdn.com/dthorpe/archive/2007/06/14/new-domains-for-windows-live-web-controls.aspx</link><pubDate>Fri, 15 Jun 2007 00:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3298049</guid><dc:creator>dthorpe</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/3298049.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=3298049</wfw:commentRss><description>&lt;P&gt;Our little web controls are growing up so fast!&amp;nbsp;We've migrated the &lt;a href="http://dev.live.com/contactscontrol/"&gt;Windows Live Contacts web control&lt;/a&gt; and &lt;a href="http://dev.live.com/spacescontrol"&gt;Windows Live Spaces web control&lt;/a&gt; to new servers&amp;nbsp;in the Microsoft datacenters and a new domain name: &lt;STRONG&gt;controls.services.live.com&lt;/STRONG&gt;.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The web controls will continue to work on the old domain name (dev.live.com) during the beta period for existing apps, but you should consider updating your web apps to use the new&amp;nbsp;URL as soon as possible.&amp;nbsp; Why?&amp;nbsp; Better performance!&amp;nbsp; The new configuration serves up the controls faster than ever.&lt;/P&gt;
&lt;P&gt;Moving to new physical servers in the Microsoft data centers could have been done without a code-breaking domain name change (the old servers were not in MS data centers, fwiw), but we decided now was the best time to bite the bullet and make the domain name change.&amp;nbsp;&amp;nbsp;The new controls.services.live.com&amp;nbsp;domain name aligns with the Windows Live Services platform map rolled out at MIX07 this past April,&amp;nbsp;and allows us to make&amp;nbsp;a clean separation between information content and live web services.&amp;nbsp; dev.live.com will continue to be the developer information portal on how to use Windows Live services in your applications. The actual services your code talks to will&amp;nbsp;be under *.services.live.com.&amp;nbsp; This will also help prevent sudden surges in web traffic on the content site from affecting the performance of the web services themselves.&lt;/P&gt;
&lt;H4&gt;Make the Switch&lt;/H4&gt;
&lt;P&gt;To switch your web apps to use the new servers, you need to change script tags referencing&amp;nbsp;&lt;EM&gt;dev.live.com&lt;/EM&gt; to &lt;EM&gt;controls.services.live.com&lt;/EM&gt;, and change &lt;EM&gt;v0.2&lt;/EM&gt; to &lt;EM&gt;v0.3&lt;/EM&gt; in the URL path:&lt;PRE&gt;&amp;lt;script type="text/javascript" &lt;BR&gt;src="http://&lt;STRONG&gt;dev.live.com&lt;/STRONG&gt;/scripts/base/&lt;STRONG&gt;v0.2&lt;/STRONG&gt;/live.js"&amp;gt;&lt;/PRE&gt;
&lt;P&gt;becomes&lt;/P&gt;&lt;PRE&gt;&amp;lt;script type="text/javascript" &lt;BR&gt;src="http://&lt;STRONG&gt;controls.services.live.com&lt;/STRONG&gt;/scripts/base/&lt;STRONG&gt;v0.3&lt;/STRONG&gt;/live.js"&amp;gt;&lt;/PRE&gt;
&lt;P&gt;In addition, if your code still references &lt;EM&gt;http://dev.live.com/scripts/&lt;STRONG&gt;contacts&lt;/STRONG&gt;/v0.2/control.js&lt;/EM&gt;, change that to &lt;EM&gt;http://controls.services.live.com/scripts/&lt;STRONG&gt;base&lt;/STRONG&gt;/v0.3/control&lt;STRONG&gt;s&lt;/STRONG&gt;.js&lt;/EM&gt;.&amp;nbsp; Note that the old file was singular "control", whereas the new version is plural "controls".&amp;nbsp; The old file (singular) only knew how to bootstrap the Contacts control.&amp;nbsp; The new file (plural) has been refactored so that it can recognize and bootstrap multiple different Windows Live web controls on a page.&amp;nbsp;&amp;nbsp;One script reference to rule them all and in the darkness bind them. Or something like that.&lt;/P&gt;
&lt;P&gt;While you're cleaning out cobwebs, it'd be a good idea to copy the latest channel.htm to your server.&amp;nbsp; We've made a few minor adjustments to it for bug fixes, stability and performance that you should get.&lt;/P&gt;
&lt;H4&gt;Bonus!&amp;nbsp;&lt;/H4&gt;
&lt;P&gt;Also new with this v0.3 release:&amp;nbsp; New languages for the &lt;a href="http://dev.live.com/spacescontrol"&gt;Windows Live Spaces web control&lt;/a&gt;!&amp;nbsp; The Spaces control now supports the same 10 languages as the Contacts control:&amp;nbsp; Dutch, English, French, German, Italian, Japanese, Korean, Spanish,&amp;nbsp;and Chinese Simplified&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3298049" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category></item><item><title>A Cross-Domain Silverlight Channel 9 VideoRSS Player</title><link>http://blogs.msdn.com/dthorpe/archive/2007/05/30/a-cross-domain-silverlight-channel-9-videorss-player.aspx</link><pubDate>Wed, 30 May 2007 11:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2984147</guid><dc:creator>dthorpe</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/2984147.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=2984147</wfw:commentRss><description>&lt;P&gt;Last week Kevin Ledley, keeper of the dev.live.com content, asked me for a bit of help to get a &lt;a href="http://www.microsoft.com/silverlight/"&gt;Silverlight&lt;/a&gt; video player working.&amp;nbsp; He wanted to "borrow" the cool scrolling video list and video player from our sister site, &lt;A href="http://msdn2.microsoft.com/" mce_href="http://msdn2.microsoft.com/"&gt;msdn2.microsoft.com&lt;/A&gt; and set it up on our &lt;A href="http://dev.live.com/" mce_href="http://dev.live.com"&gt;dev.live.com&lt;/A&gt; homepage to show Windows Live related videos from &lt;A href="http://channel9.msdn.com/" mce_href="http://channel9.msdn.com"&gt;Channel 9&lt;/A&gt;.&amp;nbsp; Copying the necessary JavaScript and XAML files for the Silverlight video player was easy enough, but even after fixing all the URL references, it still wasn't working.&amp;nbsp; So, I took a look.&lt;/P&gt;
&lt;H3&gt;Get the files&lt;/H3&gt;
&lt;P&gt;First, I needed to grab the files and set them up on my localhost IIS server.&amp;nbsp; The msdn2.microsoft.com page referenced the following JS files:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Silverlight.js - we know what that is 
&lt;LI&gt;main.js 
&lt;LI&gt;button.js 
&lt;LI&gt;helpermethods.js 
&lt;LI&gt;listbox.js 
&lt;LI&gt;listboxitem.js 
&lt;LI&gt;scrollbar.js 
&lt;LI&gt;transportButtons.js 
&lt;LI&gt;videoEntry.js 
&lt;LI&gt;videoPlayer.js 
&lt;LI&gt;videoService.js&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;main.js is what makes the call to create the Silverlight control, same as our CreateSilverlight.js file in helloworld earlier.&amp;nbsp; main.js has a lot of other code in it as well.&amp;nbsp; Scanning for ".xaml", we find there are actually three&amp;nbsp;different xaml files used&amp;nbsp;by main.js:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;videoListHor.xaml 
&lt;LI&gt;itemTemplate.xaml 
&lt;LI&gt;videoPlayer.xaml&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;After copying these files locally, I scanned each for hard coded URL references and stripped them down to relative paths for easier tinkering on localhost.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I made a small test page to host the video player, using the same variable and element names as the original msdn page:&lt;/P&gt;
&lt;H4&gt;vidtest.html&lt;/H4&gt;&lt;PRE style="BACKGROUND-COLOR: #e0e0e0"&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;!DOCTYPE&lt;/SPAN&gt; html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;
&lt;SPAN style="COLOR: black"&gt;&amp;lt;html&lt;/SPAN&gt; xmlns=&lt;SPAN style="COLOR: black"&gt;"http://www.w3.org/1999/xhtml"&lt;/SPAN&gt; xml:lang=&lt;SPAN style="COLOR: black"&gt;"en"&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;head&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;title&amp;gt;&lt;/SPAN&gt;Channel 9 Video on Silverlight&lt;SPAN style="COLOR: black"&gt;&amp;lt;/title&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"SilverLight.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"main.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"transportButtons.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"listbox.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"listboxitem.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"button.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"scrollbar.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"helperMethods.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"videoPlayer.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"videoEntry.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"videoService.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/head&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;div&lt;/SPAN&gt; style=&lt;SPAN style="COLOR: black"&gt;"position: relative;text-align:center;width:475px; z-index:10;"&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;div&lt;/SPAN&gt; id=&lt;SPAN style="COLOR: black"&gt;"videoListHost"&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        &amp;nbsp;&amp;nbsp;&amp;nbsp; var videoScrollerFeedUrl = &lt;BR&gt;"http://www.mscommunities.com/MixItUp/Search/default.aspx?q=msdn";&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         startVideoScroller();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;          &amp;lt;/script&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;div&lt;/SPAN&gt; id=&lt;SPAN style="COLOR: black"&gt;"videoPlayerHost"&lt;/SPAN&gt; &amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: black"&gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;        &lt;/PRE&gt;
&lt;P&gt;With this in place,&amp;nbsp;I had all the bits in place on the localhost server to run the app.&amp;nbsp; Would it work?&amp;nbsp; Probably not, but no harm in trying!&lt;/P&gt;
&lt;H3&gt;Eliminate Framework Dependencies&lt;/H3&gt;
&lt;P&gt;Sure enough, vidtest.html threw a JavaScript exception on load.&amp;nbsp; The culprit:&amp;nbsp; Some of the code in the js files refers to a $get() function which appear to be a shortcut for document.getElementById.&amp;nbsp; A little bit of spelunking around in the msdn code with&amp;nbsp;a JavaScript debugger confirmed this hypothesis. $get() is a helper function implemented in the JavaScript libraries that run the msdn web site.&amp;nbsp; I definitely did not want to start pulling on that thread.&amp;nbsp; $get() is innocuous enough, so we can placate the borrowed JS files on our localhost system by implementing a $get() function in vidtest.html&lt;/P&gt;&lt;PRE style="BACKGROUND-COLOR: #e0e0e0"&gt;&lt;SPAN style="COLOR: black"&gt;function&lt;/SPAN&gt; $get(id) {&lt;BR&gt;&lt;SPAN style="COLOR: black"&gt;    return&lt;/SPAN&gt; document.getElementById(id);&lt;BR&gt;}&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;Easy enough.&amp;nbsp; Will it work now?&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Bzzzt!&amp;nbsp;The browser next complains about "Object required" or somesuch on the expression Sys.Application.notifyScriptLoaded() at the bottom of one of the .JS files.&amp;nbsp; This, too, is a bit of goo defined by the msdn web site infrastructure.&amp;nbsp; It notifies the application when the .JS file has finished loading, so that it's ok to construct the Silverlight control.&lt;/P&gt;
&lt;P&gt;For vidtest.html, I have an equivalent, simpler approach:&amp;nbsp; construct the Silverlight control in the onLoad event of the body element.&amp;nbsp; The page's onLoad event won't fire until after all the JavaScript references in the head of the document have been loaded.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Ok.&amp;nbsp; Will it work now?&lt;/P&gt;
&lt;P&gt;Yes!&amp;nbsp; The Silverlight video scroller draws itself on the page!&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/ASilverlightVideoRSSPlayer_13B48/image%7B0%7D%5B3%5D.png" mce_href="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/ASilverlightVideoRSSPlayer_13B48/image%7B0%7D%5B3%5D.png" atomicselection="true"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=107 alt="This is a screenshot of a Silverlight app.  Had this been an actual Silverlight app, it would look much cooler." src="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/ASilverlightVideoRSSPlayer_13B48/image%7B0%7D_thumb%5B1%5D.png" width=360 border=0 mce_src="http://blogs.msdn.com/blogfiles/dthorpe/WindowsLiveWriter/ASilverlightVideoRSSPlayer_13B48/image%7B0%7D_thumb%5B1%5D.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;But it's empty.&amp;nbsp; Why is it empty?&amp;nbsp; Let's go look at that videoScrollerFeedURL&amp;nbsp;variable and where it's used in the code.&lt;/P&gt;
&lt;P&gt;A quick grep&amp;nbsp;of the&amp;nbsp;JS files brings us to videoService.js, in a function called getVideoEntryList:&lt;/P&gt;&lt;PRE style="BACKGROUND-COLOR: #e0e0e0"&gt;&lt;SPAN style="COLOR: black"&gt;function&lt;/SPAN&gt; getVideoEntryList() {&lt;BR&gt;&lt;SPAN style="COLOR: black"&gt;&lt;P&gt;    Microsoft.Mtps.Rendering.Behaviors.VideoService.GetVideoEntryList(&lt;BR&gt;        videoScrollerFeedUrl, loadVideos);&lt;/P&gt;&lt;/SPAN&gt;}&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;What's all that about?&lt;/P&gt;
&lt;H3&gt;Bubble Burster&lt;/H3&gt;
&lt;P&gt;videoScrollerFeedUrl is a string with a value of &lt;A href="http://www.mscommunities.com/MixItUp/Search/default.aspx?q=msdn" mce_href="http://www.mscommunities.com/MixItUp/Search/default.aspx?q=msdn"&gt;http://www.mscommunities.com/MixItUp/Search/default.aspx?q=msdn&lt;/A&gt;.&amp;nbsp; If you follow that link, you'll see that it's an RSS feed.&amp;nbsp; But you should also notice that the URL is in a domain that is not msdn.&amp;nbsp; How is the msdn web code able to use the RSS data from mscommunities.com?&lt;/P&gt;
&lt;P&gt;Microsoft.Mtps.Rendering.Behaviors.VideoService.GetVideoEntryList must be a cross-domain proxy of some kind responsible for fetching RSS entries from mscommunities.com and returning them to the JavaScript running on msdn.microsoft.com.&amp;nbsp; A little friendly debugger inspecting confirms that this&amp;nbsp;function call&amp;nbsp;receives back an array of JavaScript objects - a &lt;A href="http://en.wikipedia.org/wiki/Json" mce_href="http://en.wikipedia.org/wiki/Json"&gt;JSON&lt;/A&gt; result - describing the video description, a thumbnail image URL and a video&amp;nbsp;stream URL.&lt;/P&gt;
&lt;P&gt;This presents a not so small problem for our objective.&amp;nbsp; dev.live.com is not msdn.microsoft.com.&amp;nbsp; We can't call that GetVideoEntryList function or use the web service behind it to find out what videos are available on Channel 9.&amp;nbsp; Full stop.&lt;/P&gt;
&lt;H3&gt;The Options: Few and Ugly&lt;/H3&gt;
&lt;P&gt;I called Kevin up with the bad news.&amp;nbsp; Our options were few and ugly:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Get the server proxy code from msdn and install it on dev.live.com.&amp;nbsp; Great plan, but even if we could get our hands on the code, chances are high that some sort of server configuration difference (installed version of ASP.NET, installed version of .NET framework, etc) between how msdn is set up from how dev.live.com is set up could still make this a no-go.&amp;nbsp; 
&lt;LI&gt;Write our own server side proxy to perform the same relay of RSS content.&amp;nbsp; Trivially simple, perhaps, but the depth of security and code reviews and testing that would be required to roll out live code on a production server would turn our cute little video thingie into a&amp;nbsp;weeks-long fire-breathing hydra from hell.&amp;nbsp; No thanks.&amp;nbsp; I already do that for my day job - why take on all that for a side project? 
&lt;LI&gt;Hardcode the URLs of the videos we want shown in this video scroller into the JS code.&amp;nbsp; Kevin: "We don't have that many videos."&amp;nbsp; Danny:&amp;nbsp; "Yet."&amp;nbsp; Doesn't scale, labor intensive. 
&lt;LI&gt;Construct an RSS feed on the dev.live.com domain to feed video URLs into the video scroller.&amp;nbsp; Much more maintainable over time than #3, but still requires constant maintenance to update the local feed when something relevant shows up on Channel 9.&amp;nbsp; The whole reason for RSS is to have the machine take care of discovery and updating.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Kevin said he'd work on #1 and #4.&amp;nbsp; I opted for #5: Stew on it some more.&amp;nbsp; Take the dog on a long walk. Check the mailbox.&amp;nbsp; Return.&lt;/P&gt;
&lt;H3&gt;Strange Bedfellows&lt;/H3&gt;
&lt;P&gt;A funny thing happened on the way back from the mailbox -&amp;nbsp;it dawned on me that I was trying to solve the wrong problem, or at least,&amp;nbsp;more problem than we needed to solve.&amp;nbsp; We needed a way to read the video RSS feed in the browser across domain boundaries, but we didn't need an all-purpose cross domain data conduit (like we use in the &lt;a href="http://dev.live.com/contactscontrol/"&gt;Windows Live Contacts web control&lt;/a&gt;).&amp;nbsp;A conduit that could move just RSS data and only RSS data would suffice for this project.&lt;/P&gt;
&lt;P&gt;That's when I recalled hearing about Google's recent launch of&amp;nbsp;an RSS Feed&amp;nbsp;API.&amp;nbsp; Mark Lucovsky, who I had a chance to meet (and almost work for) in my Google days now&amp;nbsp;400 days ago, &lt;A href="http://googleajaxsearchapi.blogspot.com/2007/04/announcing-google-ajax-feed-api.html" mce_href="http://googleajaxsearchapi.blogspot.com/2007/04/announcing-google-ajax-feed-api.html"&gt;announced&lt;/A&gt; about a month and a half ago a new API built from a subset of the Google Search API that returns only RSS data.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;In concept, the &lt;A href="http://code.google.com/apis/ajaxfeeds/" mce_href="http://code.google.com/apis/ajaxfeeds/"&gt;Google Feed API&lt;/A&gt; acts as a cross-domain proxy service between your web app and the RSS content you want to use.&amp;nbsp; In reality, it's far simpler:&amp;nbsp; it returns the RSS data cached in Google's search index.&amp;nbsp; This approach creates a multitude of curious&amp;nbsp;artifacts with positive and negative spin:&amp;nbsp; &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Response latency to your RSS requests is&amp;nbsp;determined solely&amp;nbsp;by Google's network infrastructure, not the server originating the RSS data.&amp;nbsp; The server of origin might not even be up but you can still get the RSS data from the Feed API. 
&lt;LI&gt;This use of RSS data is entirely in the spirit of syndication.&amp;nbsp;It's a bummer that the server of origin can't find out how many secondary and tertiary consumers of their data are out there, but hey, that's the nature of syndication.&amp;nbsp; 
&lt;LI&gt;The RSS data you&amp;nbsp;get from the Feed API could be stale or out of sync with the server of origin by several hours or more depending on how quickly Google's web crawlers return to the server of origin to index new content.&amp;nbsp; That's not a major concern for our video viewer, but could be a show stopper for, say, live broadcasting. 
&lt;LI&gt;It's possible the RSS feed you want is not indexed by Google.&amp;nbsp; Hey, it does happen - the RSS feed could be too new to be in the index, or too isolated (no inbound links) to be considered indexible, or the server of origin could have&amp;nbsp;a robots.txt file that tells search engine spiders to piss off. It seems a bit contradictory to have an RSS feed that does not want to be found, but stranger things have happened.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;Wait a second.&amp;nbsp; Use a Google API in a Microsoft app?&amp;nbsp; What blasphemy is this?!&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Oh, grow up.&amp;nbsp; Use what works.&amp;nbsp; Windows Live Search has a perfectly good Search API, but it doesn't provide anything to bring RSS content from a specific RSS URL into our web app.&lt;/P&gt;
&lt;P&gt;And why shouldn't a Microsoft app use a Google service when appropriate?&amp;nbsp; Google certainly uses plenty of Microsoft browsers and operating systems to&amp;nbsp;reach end users!&lt;/P&gt;
&lt;H3&gt;API Keys&lt;/H3&gt;
&lt;P&gt;To use the Google Feed API (I don't know why they had to put "AJAX" in the middle of it), you have to agree to the&amp;nbsp;usual mile long list of terms of use plus generate an API key&amp;nbsp;associated your web site URL.&amp;nbsp; You use the API key when initializing the Google API subsystem.&amp;nbsp; Presumably, this is&amp;nbsp;so they can get an idea of how much traffic your app is generating and be able to block your app's access if you're found to be abusing the system or violating the ToU.&lt;/P&gt;
&lt;P&gt;As far as I can tell by experimentation, the API key only gives Google some idea of who is using their service; the key does not appear to automatically disable API access if the key is used from a domain different from the URL you&amp;nbsp;specified when you generated the key.&amp;nbsp; I generated a key for use&amp;nbsp;on localhost, but found that it works just as well when I run my app from 127.0.0.1.&amp;nbsp; (It doesn't matter that one resolves into the other - a DNS name and an IP address are considered distinct domain names by the browser.&amp;nbsp; Domain name matching in the browser is by string matching, not by what the strings mean)&amp;nbsp; Perhaps lockouts only occur after a significant volume of suspicious traffic goes by.&amp;nbsp; I dunno.&lt;/P&gt;
&lt;H3&gt;The Brass Tacks&lt;/H3&gt;
&lt;P&gt;Here's the vidtest main page again, with the Google Feed API spliced in and bootstrapped:&lt;/P&gt;
&lt;H4&gt;vidtest.html&lt;/H4&gt;&lt;PRE style="BACKGROUND-COLOR: #e0e0e0"&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;!DOCTYPE&lt;/SPAN&gt; html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;
&lt;SPAN style="COLOR: black"&gt;&amp;lt;html&lt;/SPAN&gt; xmlns=&lt;SPAN style="COLOR: black"&gt;"http://www.w3.org/1999/xhtml"&lt;/SPAN&gt; xml:lang=&lt;SPAN style="COLOR: black"&gt;"en"&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;head&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;title&amp;gt;&lt;/SPAN&gt;Channel 9 Video on Silverlight&lt;SPAN style="COLOR: black"&gt;&amp;lt;/title&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"SilverLight.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"main.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"transportButtons.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"listbox.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"listboxitem.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"button.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"scrollbar.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"helperMethods.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"videoPlayer.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"videoEntry.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;script&lt;/SPAN&gt; src=&lt;SPAN style="COLOR: black"&gt;"videoService.js"&lt;/SPAN&gt; type=&lt;SPAN style="COLOR: black"&gt;"text/javascript"&amp;gt;&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/script&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src=http://www.google.com/jsapi?key=xxxGetYerOwnAPIKeyxxx"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &amp;lt;script type="text/javascript"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       google.load("feeds", "1");&lt;BR&gt; &lt;BR&gt;&lt;BR&gt;            var videoScrollerFeedUrl = &lt;BR&gt;"http://www.mscommunities.com/MixItUp/Search/default.aspx?q=msdn";&lt;BR&gt;&amp;nbsp;&lt;BR&gt;     &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function initialize() { &lt;BR&gt;      &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; startVideoScroller();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     } &lt;BR&gt;&lt;BR&gt; &lt;BR&gt;          google.setOnLoadCallback(initialize);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt; &lt;BR&gt;          function $get(id) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       return document.getElementById(id);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;     } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/head&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;  &amp;lt;body&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;    &lt;SPAN style="COLOR: black"&gt;&amp;lt;div&lt;/SPAN&gt; style=&lt;SPAN style="COLOR: black"&gt;"position: relative;text-align:center;width:475px; z-index:10;"&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;      &lt;SPAN style="COLOR: black"&gt;&amp;lt;div&lt;/SPAN&gt; id=&lt;SPAN style="COLOR: black"&gt;"videoListHost"&amp;gt;&lt;BR&gt;&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &lt;SPAN style="COLOR: black"&gt;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &lt;SPAN style="COLOR: black"&gt;&amp;lt;div&lt;/SPAN&gt; id=&lt;SPAN style="COLOR: black"&gt;"videoPlayerHost"&lt;/SPAN&gt; &amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    &lt;SPAN style="COLOR: black"&gt;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &lt;SPAN style="COLOR: black"&gt;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: black"&gt;&amp;lt;/body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: black"&gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;        &lt;/PRE&gt;
&lt;P&gt;We've added a new script reference that pulls in jsapi from www.google.com, and includes our API key.&amp;nbsp; I replaced my API key with a dummy value.&amp;nbsp; You'll need to go generate your own key if you want to run this code yourself.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;google.load("feeds", "1")&lt;/STRONG&gt; tells Google that we want to use the Feeds API.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;google.setOnLoadCallback(initialize)&lt;/STRONG&gt; tells Google to call our initialize() function when the requested API has been loaded. Dynamic loading of JavaScript might not be finished before the body onLoad event fires, so we have to take this route to wait for the Feed API to load.&amp;nbsp; Body onLoad event deleted.&lt;/P&gt;
&lt;P&gt;Now, let's go load that RSS content and build our video list, in videoService.js:&lt;/P&gt;
&lt;H4&gt;videoService.js&lt;/H4&gt;&lt;PRE style="BACKGROUND-COLOR: #e0e0e0"&gt;function getVideoEntryList() {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var feed = new google.feeds.Feed(videoScrollerFeedUrl); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; feed.setNumEntries(100);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; feed.setResultFormat(google.feeds.Feed.MIXED_FORMAT);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; feed.load(function(result) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!result.error) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var videoEntries = [];&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; result.feed.entries.length; i++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var entry = result.feed.entries[i];&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var vidEntry = new Object;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vidEntry.VideoTitle = entry.title;&lt;BR&gt; &lt;BR&gt;                var test = google.feeds.getElementsByTagNameNS(&lt;BR&gt;                        entry.xmlNode, &lt;BR&gt;                        "http://search.yahoo.com/mrss", &lt;BR&gt;                        "content");&lt;BR&gt;                if (!test || !test.length) continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vidEntry.VideoUrl = test[0].getAttribute("url");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt; &lt;BR&gt;                test = google.feeds.getElementsByTagNameNS(&lt;BR&gt;                        entry.xmlNode, &lt;BR&gt;                        "http://search.yahoo.com/mrss", &lt;BR&gt;                        "thumbnail");&lt;BR&gt;                if (!test || !test.length) continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vidEntry.VideoThumbnailUrl = test[0].getAttribute("url");&lt;BR&gt; &lt;BR&gt;                test = google.feeds.getElementsByTagNameNS(&lt;BR&gt;                        entry.xmlNode, &lt;BR&gt;                        "http://purl.org/dc/elements/1.1/", &lt;BR&gt;                        "creator")&lt;BR&gt;                if (test &amp;amp;&amp;amp; test.length) {&lt;BR&gt;    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vidEntry.Author = test[0].text;&lt;BR&gt;                }&lt;BR&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; videoEntries.push(vidEntry);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loadVideos(videoEntries);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;}&lt;BR&gt;&lt;/PRE&gt;
&lt;P&gt;The msdn2.microsoft.com video scroller expects an array of vidEntry objects as input to build its playlist.&amp;nbsp; The msdn server side proxy takes care of digesting the RSS XML content down to a simple list of vidEntry objects.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;For our dev.live.com version of the video scroller, we need to build the vidEntry objects ourselves.&amp;nbsp;The Google Feed API can return JSON, XML, or both.&amp;nbsp; The title of the RSS entry is standard fare, so that's easy to grab from the JSON field entry.title.&amp;nbsp;The other fields we need - thumbnail URL, video URL, and author - are not normal RSS fields.&amp;nbsp; These fields are defined&amp;nbsp;in the &lt;A href="http://en.wikipedia.org/wiki/Media_RSS" mce_href="http://en.wikipedia.org/wiki/Media_RSS"&gt;Media RSS&lt;/A&gt; (MRSS) RSS extension module and are&amp;nbsp;generated by the Channel 9 video RSS feed as such.&lt;/P&gt;
&lt;P&gt;We make short work of finding the exact XML elements we're looking for by using a utility function provided by the google.feeds library: a cross-browser implementation of getElementsByTagNameNS().&amp;nbsp; &lt;/P&gt;
&lt;P&gt;We push each vidEntry object into the array and loop until we run out of RSS items.&lt;/P&gt;
&lt;P&gt;Finally, we hand off the array of objects to loadVideos and return to the original code path of the video scroller implementation.&lt;/P&gt;
&lt;P&gt;The result looks something like this:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;IMG title="Screenshot of Silverlight video player in action" style="WIDTH: 600px; HEIGHT: 353px" height=353 alt="Screenshot of Silverlight video player in action" src="http://storage.msn.com/y1pzRzjtWRm1XdRRsx8xkn8abFGABJ2qFich9CPbh33-j6lHwlqKaeQokFLRgDnCT98" width=600 mce_src=" http://storage.msn.com/y1pzRzjtWRm1XdRRsx8xkn8abFGABJ2qFich9CPbh33-j6lHwlqKaeQokFLRgDnCT98"&gt;&lt;/P&gt;
&lt;H3&gt;Why stop there?&lt;/H3&gt;
&lt;P&gt;So now we have what we set out to build:&amp;nbsp; a Silverlight video player that can show videos from the Channel 9 libraries, using the video RSS feeds returned by the mscommunities.com query service.&amp;nbsp;Note that this is built on the &lt;a href="http://www.microsoft.com/silverlight/"&gt;Silverlight&lt;/a&gt; 1.0 beta control using browser JavaScript, not the Silverlight 1.1 Alpha.&lt;/P&gt;
&lt;P&gt;The fact that we ended up using a generic RSS provider to get the specific RSS feed we needed opens some interesting possibilities:&amp;nbsp; Aren't we just a hair's breadth from showing any video from any video RSS feed on the Internet?&amp;nbsp; All we'd need to change is the videoScrollerFeedURL to point to a different RSS feed, right?&amp;nbsp; Perhaps this could be wired directly into Yahoo's Video Search service, which returns MRSS results for keyword searches of videos across the web?&lt;/P&gt;
&lt;P&gt;The answer is: yes and no.&amp;nbsp; Yes, the app actually is just a small step away from using any video RSS feed, or even a video search service that returns MRSS results.&amp;nbsp; The catch is: there are a bezillion different video formats and codecs out there in the wild.&amp;nbsp; It would be unreasonable to expect Silverlight 1.0 beta to be able to play all of them.&amp;nbsp; Silverlight's media player&amp;nbsp;isn't designed to play all video formats - it's designed to play media content encoded for Silverlight playback, using tools such as Expression Media.&amp;nbsp; Apparently, the Channel 9 video library is already encoded in a format that Silverlight can use.&amp;nbsp; Most video in the wild is not.&lt;/P&gt;
&lt;P&gt;That's no ding against Silverlight - all video sharing sites with built-in players play only one video format - their own.&amp;nbsp; When you upload a video to the sharing site, it&amp;nbsp;is almost always&amp;nbsp;converted (transcoded) into the site's native encoding format so that the site's player can play it.&amp;nbsp; You can build that kind of video sharing site with Silverlight.&lt;/P&gt;
&lt;P&gt;With a few tricks from this article, you can show Channel 9 videos on your web site or blog pages with Silverlight!&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2984147" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/cross+domain/default.aspx">cross domain</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Google/default.aspx">Google</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Feed+API/default.aspx">Feed API</category></item><item><title>HTML Namespace Attributes and IE document.namespaces</title><link>http://blogs.msdn.com/dthorpe/archive/2007/05/27/html-namespace-attributes-and-ie-document-namespaces.aspx</link><pubDate>Sun, 27 May 2007 21:27:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2924082</guid><dc:creator>dthorpe</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/2924082.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=2924082</wfw:commentRss><description>&lt;p&gt;A &lt;a href="http://blogs.msdn.com/dthorpe/archive/2007/05/18/popfly-mashups-made-easy.aspx"&gt;few posts ago&lt;/a&gt; I promised to elaborate on a little gotcha that bit us in the butt while prepping the "blocks" to enable Popfly apps to use the &lt;a href="http://dev.live.com/contactscontrol/"&gt;Windows Live Contacts web control&lt;/a&gt; and &lt;a href="http://dev.live.com/spacescontrol"&gt;Windows Live Spaces web control&lt;/a&gt; .&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Here it is:&lt;/strong&gt;&amp;nbsp; IE has a handy document.namespaces object that reflects the namespaces defined in attributes of the HTML element of the page.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;The gotcha:&lt;/strong&gt;&amp;nbsp; document.namespaces does not track with attributes that are dynamically added to the HTML element after page load.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The situation:&lt;/strong&gt; "blocks" in Popfly can emit HTML code to set up shop in the application host page, but they do not have control over the host page's HTML tag.&amp;nbsp; Since our web controls pretty much requires namespaces (that's a bug -&amp;nbsp;they should work with or without namespaces), we tossed in a quick fix in the Popfly block:&amp;nbsp; look up the html element and use setAttribute to set the namespace attributes we would have set on the html tag if we had access to it.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&amp;nbsp; worked great in Firefox, but that was only because Firefox doesn't provide any support for namespaces in HTML docs.&amp;nbsp; I ranted on this &lt;a href="http://blogs.msdn.com/dthorpe/archive/2006/12/18/namespaces-in-html-too-much-trouble-to-bother-with.aspx"&gt;awhile back&lt;/a&gt;.&amp;nbsp; You have to serve up content type text/xml in order to get Firefox's namespace support to kick in, but doing that kills all the JavaScript on your page, among other things, and in general one should not take lightly renaming HTML as XML or visa-versa.&amp;nbsp; It'll sneak up and bite you when you least have time to deal with it.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Result2:&lt;/strong&gt; Didn't work in IE.&amp;nbsp; Our bootstrap code in the contacts control takes advantage of document.namespaces in IE, and falls back to savage spelunking to find the namespace attributes the hard way in Firefox and other browsers.&amp;nbsp; document.namespaces is populated when the html document is being loaded and is not updated after it has loaded.&amp;nbsp; Our quick fix of adding the namespace attributes to the html element in our Popfly code block had no effect because they were added after document.namespaces was locked down.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&amp;nbsp; Change the Popfly code block to call document.namespaces.add() if document.namespaces exists, otherwise add the namespace attributes to the html element.&amp;nbsp; Do it. Test it. Ship it.&amp;nbsp;Whew!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2924082" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/web/default.aspx">web</category></item><item><title>More: Avoiding Popup Windows in Your Web Apps</title><link>http://blogs.msdn.com/dthorpe/archive/2007/05/22/more-avoiding-popup-windows-in-your-web-apps.aspx</link><pubDate>Wed, 23 May 2007 04:10:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2804012</guid><dc:creator>dthorpe</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/2804012.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=2804012</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://weblogging.com/"&gt;Scott Isaacs&lt;/a&gt; shares some additional "best practices" points on dealing with popup windows and popup blockers:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Always program window.open() very defensively...&lt;/p&gt; &lt;p&gt;Always try catch any calls to window.open() and if you are retaining a reference to the window (e.g., var w = window.open(…)), always make sure the “w” is a valid object (and again try catch your first attempt to leverage the window).&amp;nbsp; &lt;/p&gt; &lt;p&gt;Last, it was recently discovered that Symantec’s internet products have a popup blocker that actually augments the web page with their own custom script. This script disables any calls to window.open() that may occur before the onload event of the page. Therefore, if the user quickly clicks a hyperlink that calls window.open before the page loads, the user will see either nothing happen or receive a script error.&amp;nbsp; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I heartily agree.&amp;nbsp; The&amp;nbsp;variable assigned the return value of window.open() ("w" above) is particularly obnoxious.&amp;nbsp; It can fail to be initialized if the window.open() failed or took an unexpected detour due to popup blockers.&amp;nbsp; Once the popup window is up and running, the "w" variable will again be at risk when the user closes the popup window.&amp;nbsp; The "w" variable will be unusable after the window it refers to is closed - it's almost as though the object it refers to has been garbage collected out from under the variable.&amp;nbsp; Any reference to the variable will raise an exception.&amp;nbsp; Testing for &lt;strong&gt;typeof w == "undefined"&lt;/strong&gt; isn't entirely reliable across browsers because for the brief period while the window is closing "w"&amp;nbsp;may&amp;nbsp;be unusable but not undefined.&lt;/p&gt; &lt;p&gt;For the &lt;a href="http://dev.live.com/contactscontrol/"&gt;Windows Live Contacts web control&lt;/a&gt; we ultimately solved these quasi state problems with the popup window variable&amp;nbsp;once and for all by eliminating the variable!&amp;nbsp; Instead of having the main page hold onto a variable pointing to the popup window&amp;nbsp;so that the main window&amp;nbsp;code could check the state of what's going on in the&amp;nbsp;popup, we turned everything inside out so that the popup calls or writes back to the main window.&amp;nbsp; This arrangement allows the main window to create the popup, set a state variable to indicate that the popup is up, and then forget about it.&amp;nbsp; When the popup is closed, it will call back to the main page to clear the state variable and set the result of the operation.&lt;/p&gt; &lt;p&gt;Another thing to watch out for when you have multiple windows in your web app:&amp;nbsp; Firefox 1.x does not do well with executing script while a window is closing.&amp;nbsp;&amp;nbsp;If the popup window is&amp;nbsp;in the process of closing and&amp;nbsp;calls into&amp;nbsp;a JavaScript method on the main page&amp;nbsp;which fires off a new XMLHttpRequest, chances are high that the XMLHttpRequest will implode in its onReadyStateChanged event.&amp;nbsp; Accessing any field or method of the XMLHttpRequest object will throw an exception, and all subsequent XMLHttpRequests (even new instances) will be fried.&amp;nbsp; The only way to clear this state appears to be to reload the main page.&amp;nbsp;&amp;nbsp;I don't recall offhand if this has been fixed already in Firefox 2.0, but it's a known, logged issue in Firefox 1.x&lt;/p&gt; &lt;p&gt;The best&amp;nbsp;solution is to&amp;nbsp;avoid the problem by not initiating&amp;nbsp;an XMLHttpRequest in a call chain started&amp;nbsp;by a window close event.&amp;nbsp; Use a short timer to decouple the closing popup window's call context from the desired XMLHttpRequest action.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2804012" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/web/default.aspx">web</category></item><item><title>Avoiding Popup Blockers in Your Web Apps</title><link>http://blogs.msdn.com/dthorpe/archive/2007/05/15/avoiding-popup-blockers-in-your-web-apps.aspx</link><pubDate>Wed, 16 May 2007 00:51:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2657804</guid><dc:creator>dthorpe</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/dthorpe/comments/2657804.aspx</comments><wfw:commentRss>http://blogs.msdn.com/dthorpe/commentrss.aspx?PostID=2657804</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://timheuer.com/blog/"&gt;Tim Heuer&lt;/a&gt; laments the growing number of otherwise reputable web sites that instruct their flocks to &lt;a href="http://timheuer.com/blog/archive/2007/05/07/14076.aspx"&gt;disable popup blockers&lt;/a&gt; in order to complete some task within that web site.&lt;/p&gt; &lt;p&gt;Having stumbled into popup blocker hell myself only a few months ago with the &lt;a href="http://dev.live.com/contactscontrol/v0.2/default.aspx"&gt;Windows Live Contacts Control&lt;/a&gt; I can certainly attest to how easy it is for the blissfully ignorant (me!) to get snared by a popup blocker.&amp;nbsp; However, I agree with Tim that popup blockers provide a valuable service and disabling them should not be part of anyone's standard operating procedure, especially when the target audience is the non-technical consumer.&lt;/p&gt; &lt;p&gt;When a&amp;nbsp;web site asks you to lower your shields in order to complete an online order or do some other mundane task, it seems a little odd.&amp;nbsp; But when you consider how easy it is to avoid tripping popup blocker alarms, asking the consumer to disable them is just plain sad.&lt;/p&gt; &lt;p&gt;The purpose of a popup blocker is to block popup "spam"&amp;nbsp;- windows that pop up without the user's consent or request.&amp;nbsp;Some of the more irritating sites throw up dozens of popup windows all at once, leaving the viewer lost in a forest of trash.&amp;nbsp; Some toss up a popup window when you leave their site.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Why do the popup spammers&amp;nbsp;do it?&amp;nbsp; To artificially inflate their page view counts.&amp;nbsp;A browser popup window&amp;nbsp;showing a particular HTML page counts&amp;nbsp;as a page view, whether the consumer is looking at it or not.&amp;nbsp; Most banner advertisers consider that action a form of click fraud, and at a minimum grounds for termination of your ad serving account.&lt;/p&gt; &lt;p&gt;Here's the deal:&amp;nbsp; &lt;strong&gt;Popup blockers in web browsers don't block all popup windows.&lt;/strong&gt;&amp;nbsp; A popup window that is opened in direct response to a user action, such as a button click, will not trigger a popup blocker alarm.&amp;nbsp; If you do a window.open() in a JavaScript button click event, the window opens without issue.&amp;nbsp; If the same code executes in a timer event, it will trip a popup blocker alarm.&amp;nbsp; Why?&amp;nbsp; Because a timer event is not the direct result of a user action.&amp;nbsp; &lt;/p&gt; &lt;p&gt;The same goes for page loads, page unloads, XMLHttpRequest events, or anything else that is not a direct user action implying consent.&amp;nbsp;&amp;nbsp;Mouse clicks are user actions.&amp;nbsp; I haven't tried this, but I'd be willing to bet that mouse hovers over an&amp;nbsp;HTML element do not qualify as a user action.&amp;nbsp; If anything, waiving the mouse around on the screen indicates &lt;em&gt;indecision&lt;/em&gt;!&lt;/p&gt; &lt;p&gt;Different popup blockers have different degrees of sophistication in how they determine whether a window.open() is happening in response to a user action.&amp;nbsp; Some may tolerate&amp;nbsp;a call to window.open() being made in a subroutine called by a click event, but for best results across the board keep the window.open as close to the click event as possible.&amp;nbsp; Meaning:&amp;nbsp;keep the window.open&amp;nbsp;in the click event itself.&lt;/p&gt; &lt;p&gt;We tripped over this&amp;nbsp;in the first iteration of the Windows Live Contacts Control's WriteAPI.&amp;nbsp; When a third party web app submits contact data to the Contacts control, we need to make sure the user is aware of what the third party app is doing, so we need to show the submitted data to them and ask for their approval of the action.&amp;nbsp; There isn't enough screen real estate in the control itself to display the potentially large data, so a popup window is justified.&lt;/p&gt; &lt;p&gt;Let's say the user clicks a button on the third party web page to send data into the contacts control.&amp;nbsp; The web app calls a method on the Contacts control, which is actually JavaScript from our library executing in the context of the third party app.&amp;nbsp; Our code sanity checks the data, then bundles it up and tosses it over the domain barrier to our code that lives inside the Contacts control iframe, hosted on a Microsoft domain.&amp;nbsp; Our code on the inside checks the data again, then opens a popup window to ask the user to review and approve the submitted data.&lt;/p&gt; &lt;p&gt;That's where we got caught - the JavaScript code opening the popup window was not directly tied to a user click.&amp;nbsp; In our minds it was the direct result of the user click, but in the reality of the browser there were far too many call frames and other indirections between the user action and the window.open for the popup blocker to determine a causal relationship between them.&lt;/p&gt; &lt;p&gt;One solution that&amp;nbsp;came to mind (very briefly)&amp;nbsp;was to display the confirmation popup window from our code that executes in the context of the third party web app.&amp;nbsp; This has many problems, not the least of which is that we cannot trust code that is executing in the third party domain context.&amp;nbsp; We can only trust code that executes in the context of our own domain.&amp;nbsp; Besides, given that our code would still be at least one function call removed from the actual user action event, this approach is likely to fail with less sophisticated popup blockers.&lt;/p&gt; &lt;p&gt;Our solution?&amp;nbsp; Display a message&amp;nbsp;inside the Contacts control to inform the user that data had been received from the web app, and prompt the user to "Click here to review the data".&amp;nbsp; This solution has the downside of introducing an extra user click into the chain of events, but that click is what enables us to display the popup window from our JavaScript running in the context of our Microsoft domain without offending the popup blockers.&lt;/p&gt; &lt;p&gt;So, we should allow some measure of&amp;nbsp;understanding for&amp;nbsp;a web app that stumbles into popup blockers unexpectedly.&amp;nbsp; The web&amp;nbsp;developer is only guilty of a little ignorance and lack of testing.&amp;nbsp; &lt;/p&gt; &lt;p&gt;But a web site that actively instructs you to disable popup blockers to use their site? This is where making ignorance into corporate policy&amp;nbsp;has become easier than understanding the problem and its usually trivial solution.&amp;nbsp; Show them no mercy!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2657804" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Windows+Live/default.aspx">Windows Live</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/Rants/default.aspx">Rants</category><category domain="http://blogs.msdn.com/dthorpe/archive/tags/web/default.aspx">web</category></item></channel></rss>