Last September, we announced our plan to remove NPAPI support from Chrome by the end of 2014. This change will improve Chrome’s security, speed, and stability as well as reduce complexity in the code base. Over the last few quarters, we’ve been encouraged to see an overall 12.9% drop in per-user instantiations of NPAPI plug-ins and declining usage of the most popular NPAPI plug-ins:
Monthly Plug-In Launch Percentage
We are actively helping still-popular NPAPI-based services migrate to open-web-based alternatives.
Deprecation has proceeded as scheduled. As of September 23rd, 2013, the Chrome Web Store no longer accepts NPAPI-based Apps and Extensions. Webpage-instantiated NPAPI plug-ins have been blocked by default since January 2014 using the infobar UI. NPAPI support was removed from Linux in Chrome 35.
To further prepare users and developers for complete removal, we’ll be making two more updates in the coming weeks. Starting today, the Chrome Web Store will no longer show NPAPI-based Apps and Extension on the home page, search results, and category pages. In Chrome 37, webpage-instantiated NPAPI plug-ins will be blocked using the harder-to-bypass page-action blocking UI.
Most use cases that previously required NPAPI are now supported by JavaScript-based open web technologies. For the few applications that need low-level APIs, threads, and machine-optimized code, Native Client offers the ability to run sandboxed native code in Chrome. To help ease the transition from NPAPI, NaCl recently exposed two new Pepper APIs for media playback and processing. The MediaStreams API enables low latency multimedia playback, and the Hardware Decode API enables efficient video decoding.
For more information, please see the developer NPAPI deprecation guide. We look forward to the transition to a safer, more mobile-friendly web.
elem.animate([ {transform: 'translateX(0px)'}, {transform: 'translateX(100px)'} ], 3000);
<link rel="import">
<head> <link rel="import" href="/path/to/imports/stuff.html"> </head>
// Let's say we have a model with data var model = {}; // Which we then observe Object.observe(model, function(changes) { // This asynchronous callback runs and aggregates changes changes.forEach(function(change) { // Letting us know what changed console.log(change.type, change.name, change.oldValue); }); });