{"id":981,"date":"2010-05-14T12:30:38","date_gmt":"2010-05-14T20:30:38","guid":{"rendered":"http:\/\/blog.mozilla.org\/webdev\/?p=981"},"modified":"2010-05-16T22:39:12","modified_gmt":"2010-05-17T06:39:12","slug":"behind-the-scenes-of-the-plugin-check-page","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/","title":{"rendered":"Behind the Scenes of the Plugin Check Page"},"content":{"rendered":"<p>As noted on our <a href=\"http:\/\/blog.mozilla.org\/security\/2010\/05\/11\/plugin-check-for-everyone\/\">security blog<\/a>, we\u2019ve just pushed out a major update to the plugin check page and service.<br \/>\n<a href=\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot.jpg\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot-300x158.jpg\" alt=\"\" title=\"Cross Browser Support\" width=\"300\" height=\"158\" class=\"alignright size-medium wp-image-1002\" style=\"margin-right: 15px;\" srcset=\"https:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot-300x158.jpg 300w, https:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot-1024x541.jpg 1024w, https:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot.jpg 1241w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nThe two core ideas are:<\/p>\n<ul>\n<li>Groundwork for a plugin directory<\/li>\n<li>Cross browser plugin checking<\/li>\n<\/ul>\n<h3 style=\"clear:right\">The Backend<\/h3>\n<p>Les Orchard has <a href=\"http:\/\/blog.mozilla.org\/webdev\/2010\/01\/08\/rebuilding-the-plugin-directory\/\"> created a backend<\/a> to the plugin finder service. We\u2019ve added another input to the call named \u2018detection\u2019 which will allow us more flexibility in how we match known releases to OS \/ Product \/ Version \/ Plugin \/ Plugin Version combos. More news at 11, but he\u2019s built the core pieces for a self-service plugin release application.<\/p>\n<h3>The Frontend<\/h3>\n<p>We updated the JavaScript client to support \u2018<strong>modern browsers<\/strong>\u2019 as well as IE. <\/p>\n<h4>But IE 8 is a modern browser!<\/h4>\n<p>Hmm, well it doesn\u2019t have a <code>navigator.plugins object<\/code>. Other popular and recently released desktop browsers *do* have this feature. Heck, even some phone&#8217;s browsers have it.<\/p>\n<p><em>Breaking News:<\/em> The platform preview of IE 9 has a working <code>navigator.plugins<\/code> object! So IE 9 fits the modern browser category&#8230; <strong>Congrats to the IE 9 team<\/strong>! We&#8217;ll make sure the page works by the time IE 9 ships, filed <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=566003\">Bug#566003<\/a>.<\/p>\n<h3>Cross Browser Flavors<\/h3>\n<p>Our plugin detection uses one of three strategies:<\/p>\n<ol>\n<li>Strategy 1) <strong>Iterate<\/strong> the plugins objects and parse a version string out of the description or name<\/li>\n<li>Strategy 2) <strong>Iterate<\/strong> the plugins objects and use the \u2018version\u2019 property<\/li>\n<li>Strategy 3) Instantiate <strong>well-known<\/strong> plugins and test their version via the <a href=\"http:\/\/www.pinlady.net\/PluginDetect\/\">pinlady.net<\/a> version detection library.<\/li>\n<\/ol>\n<p>If your goal is to protect as many users from as many known plugin vulnerabilities as possible&#8230; Strategy 3 doesn\u2019t scale. Strategies 1 and 2 are dynamic and (in the best case) plugin agnostic. As new plugins come onto the market, the plugin finder service has to be updated, but no new code has to be written and shipped.<\/p>\n<p>This is why IE plugin detection <a href=\"http:\/\/www.mozilla.com\/en-US\/plugincheck\/more_info.html\">is limited<\/a>.<\/p>\n<p>Strategy 2 is the cleanest&#8230; and only supported by Firefox 3.6+. We would be pleased as punch if other browser vendors would create a version property. The Plugin Check page and other pieces of code that do plugin detection, will become more accurate.<\/p>\n<p>We\u2019re really excited about supporting all browsers and that is what Strategy 1 buys us. When a vendor has put a useful version number in the description or name, then it&#8217;s possible for our page to help Safari, Opera, or Chrome users understand their plugin versions better.<\/p>\n<h4>Geeky Aside:<\/h4>\n<p>Fly in the ointment, even for Firefox 3.6+ we currently will use methods #1 and #2 depending on what\u2019s best for detecting the most accurate version for the most popular plugins. Why is nothing every simple?<\/p>\n<h3>What can browser vendors do?<\/h3>\n<p>Please implement the <code>navigator.plugins[x].version<\/code> property. This exposes an explicit plugin version number from the vendor.<\/p>\n<h4>Why?<\/h4>\n<p>It will keep your users safer. This and other security tools can detect vulnerable versions easier and more accurately.<\/p>\n<h3>What can plugin vendors do?<\/h3>\n<p>At a minimum, please put your full version number in the plugin description field.  Also make this as exact as possible, include the build number etc. 1.1.2.9282 is better than 1.1.2. Bonus points, expose your version numbers in the version property, even on Linux builds of your plugin.<\/p>\n<h4>Why?<\/h4>\n<ul>\n<li>Keep your users safe<\/li>\n<li>Improve your lastest version uptake<\/li>\n<li>Keep users coming back to your distribution channel<\/li>\n<li>Reduce your support costs<\/li>\n<\/ul>\n<h4>What&#8217;s next?<\/h4>\n<p>We&#8217;ve built the plumbing and populated it with some popular plugins versions. Our next major release will be focused on building a self-service plugin release management app, so that vendors can populate the data for the backend API.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As noted on our security blog, we\u2019ve just pushed out a major update to the plugin check page and service. The two core ideas are: Groundwork for a plugin directory Cross browser plugin checking The Backend Les Orchard has created &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/\">Continue reading<\/a><\/p>\n","protected":false},"author":119,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[288],"tags":[128,756,99,69],"coauthors":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Behind the Scenes of the Plugin Check Page - Mozilla Web Development<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Austin King\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/\",\"url\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/\",\"name\":\"Behind the Scenes of the Plugin Check Page - Mozilla Web Development\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot-300x158.jpg\",\"datePublished\":\"2010-05-14T20:30:38+00:00\",\"dateModified\":\"2010-05-17T06:39:12+00:00\",\"author\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/b3090d13ff3b5ebf995ba12f529cce21\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#primaryimage\",\"url\":\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot-300x158.jpg\",\"contentUrl\":\"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot-300x158.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/webdev\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Behind the Scenes of the Plugin Check Page\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#website\",\"url\":\"https:\/\/blog.mozilla.org\/webdev\/\",\"name\":\"Mozilla Web Development\",\"description\":\"For make benefit of glorious tubes\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.mozilla.org\/webdev\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/b3090d13ff3b5ebf995ba12f529cce21\",\"name\":\"Austin King\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/image\/e48c319790d7cbf429d9e8f97f590cb1\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4a031c81db087774e3c1ecfb4b588fc0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4a031c81db087774e3c1ecfb4b588fc0?s=96&d=mm&r=g\",\"caption\":\"Austin King\"},\"description\":\"aka Ozten is a Seattle-based programmer working with the Identity team.\",\"sameAs\":[\"http:\/\/ozten.com\"],\"url\":\"https:\/\/blog.mozilla.org\/webdev\/author\/akingmozillacom\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Behind the Scenes of the Plugin Check Page - Mozilla Web Development","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/","twitter_misc":{"Written by":"Austin King","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/","url":"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/","name":"Behind the Scenes of the Plugin Check Page - Mozilla Web Development","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/webdev\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot-300x158.jpg","datePublished":"2010-05-14T20:30:38+00:00","dateModified":"2010-05-17T06:39:12+00:00","author":{"@id":"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/b3090d13ff3b5ebf995ba12f529cce21"},"breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#primaryimage","url":"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot-300x158.jpg","contentUrl":"http:\/\/blog.mozilla.org\/webdev\/files\/2010\/05\/CrossBrowserScreenshot-300x158.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/webdev\/2010\/05\/14\/behind-the-scenes-of-the-plugin-check-page\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/webdev\/"},{"@type":"ListItem","position":2,"name":"Behind the Scenes of the Plugin Check Page"}]},{"@type":"WebSite","@id":"https:\/\/blog.mozilla.org\/webdev\/#website","url":"https:\/\/blog.mozilla.org\/webdev\/","name":"Mozilla Web Development","description":"For make benefit of glorious tubes","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.mozilla.org\/webdev\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/b3090d13ff3b5ebf995ba12f529cce21","name":"Austin King","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/webdev\/#\/schema\/person\/image\/e48c319790d7cbf429d9e8f97f590cb1","url":"https:\/\/secure.gravatar.com\/avatar\/4a031c81db087774e3c1ecfb4b588fc0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4a031c81db087774e3c1ecfb4b588fc0?s=96&d=mm&r=g","caption":"Austin King"},"description":"aka Ozten is a Seattle-based programmer working with the Identity team.","sameAs":["http:\/\/ozten.com"],"url":"https:\/\/blog.mozilla.org\/webdev\/author\/akingmozillacom\/"}]}},"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/posts\/981"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/users\/119"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/comments?post=981"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/posts\/981\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/media?parent=981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/categories?post=981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/tags?post=981"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mozilla.org\/webdev\/wp-json\/wp\/v2\/coauthors?post=981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}