CINXE.COM
Chromium Blog: 2014
<!DOCTYPE html> <html class='v2 list-page' dir='ltr' itemscope='' itemtype='http://schema.org/Blog' lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/3566091532-css_bundle_v2.css' rel='stylesheet' type='text/css'/> <title> Chromium Blog: 2014 </title> <meta content='width=device-width, height=device-height, initial-scale=1.0' name='viewport'/> <meta content='IE=Edge' http-equiv='X-UA-Compatible'/> <meta content='Chromium Blog' property='og:title'/> <meta content='en_US' property='og:locale'/> <meta content='https://blog.chromium.org/2014/' property='og:url'/> <meta content='Chromium Blog' property='og:site_name'/> <!-- Twitter Card properties --> <meta content='Chromium Blog' property='og:title'/> <meta content='summary' name='twitter:card'/> <meta content='@ChromiumDev' name='twitter:creator'/> <link href='https://fonts.googleapis.com/css?family=Roboto:400italic,400,500,500italic,700,700italic' rel='stylesheet' type='text/css'/> <link href='https://fonts.googleapis.com/icon?family=Material+Icons' rel='stylesheet'/> <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js' type='text/javascript'></script> <!-- End --> <style id='page-skin-1' type='text/css'><!-- /* <Group description="Header Color" selector="header"> <Variable name="header.background.color" description="Header Background" type="color" default="#ffffff"/> </Group> */ .header-outer { border-bottom: 1px solid #e0e0e0; background: #ffffff; } html, .Label h2, #sidebar .rss a, .BlogArchive h2, .FollowByEmail h2.title, .widget .post h2 { font-family: Roboto, sans-serif; } .plusfollowers h2.title, .post h2.title, .widget h2.title { font-family: Roboto, sans-serif; } .widget-item-control { height: 100%; } .widget.Header, #header { position: relative; height: 100%; width: 100%; } } .widget.Header .header-logo1 { float: left; margin-right: 15px; padding-right: 15px; border-right: 1px solid #ddd; } .header-title h2 { color: rgba(0,0,0,.54); display: inline-block; font-size: 40px; font-family: Roboto, sans-serif; font-weight: normal; line-height: 76px; vertical-align: top; } .header-inner { background-repeat: no-repeat; background-position: right 0px; } .post-author, .byline-author { font-size: 14px; font-weight: normal; color: #757575; color: rgba(0,0,0,.54); } .post-content .img-border { border: 1px solid rgb(235, 235, 235); padding: 4px; } .header-title a { text-decoration: none !important; } pre { border: 1px solid #bbbbbb; margin-top: 1em 0 0 0; padding: 0.99em; overflow-x: auto; overflow-y: auto; } pre, code { font-size: 9pt; background-color: #fafafa; line-height: 125%; font-family: monospace; } pre, code { color: #060; font: 13px/1.54 "courier new",courier,monospace; } .header-left .header-logo1 { width: 128px !important; } .header-desc { line-height: 20px; margin-top: 8px; } .fb-custom img, .twitter-custom img, .gplus-share img { cursor: pointer; opacity: 0.54; } .fb-custom img:hover, .twitter-custom img:hover, .gplus-share img:hover { opacity: 0.87; } .fb-like { width: 80px; } .post .share { float: right; } #twitter-share{ border: #CCC solid 1px; border-radius: 3px; background-image: -webkit-linear-gradient(top,#ffffff,#dedede); } .twitter-follow { background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimKBWDeRb1pqsbNiP9AFLyFDZHzXGYEJZRELMrZ6iI0yz4KeMPH_7tPsrMq9PpJ3H6riC_UohpWMn83_Z1N2sTuTTrVL7i6TrNzpO9oFg4e8VFK4zFJb1rfamWfc8RxG8Fhz2RgRgHN10u/s1600/twitter-bird.png) no-repeat left center; padding-left: 18px; font: normal normal normal 11px/18px 'Helvetica Neue',Arial,sans-serif; font-weight: bold; text-shadow: 0 1px 0 rgba(255,255,255,.5); cursor: pointer; margin-bottom: 10px; } .twitter-fb { padding-top: 2px; } .fb-follow-button { background: -webkit-linear-gradient(#4c69ba, #3b55a0); background: -moz-linear-gradient(#4c69ba, #3b55a0); background: linear-gradient(#4c69ba, #3b55a0); border-radius: 2px; height: 18px; padding: 4px 0 0 3px; width: 57px; border: #4c69ba solid 1px; } .fb-follow-button a { text-decoration: none !important; text-shadow: 0 -1px 0 #354c8c; text-align: center; white-space: nowrap; font-size: 11px; color: white; vertical-align: top; } .fb-follow-button a:visited { color: white; } .fb-follow { padding: 0px 5px 3px 0px; width: 14px; vertical-align: bottom; } .gplus-wrapper { margin-top: 3px; display: inline-block; vertical-align: top; } .twitter-custom, .gplus-share { margin-right: 12px; } .fb-follow-button{ margin: 10px auto; } /** CUSTOM CODE **/ --></style> <style id='template-skin-1' type='text/css'><!-- .header-outer { clear: both; } .header-inner { margin: auto; padding: 0px; } .footer-outer { background: #f5f5f5; clear: both; margin: 0; } .footer-inner { margin: auto; padding: 0px; } .footer-inner-2 { /* Account for right hand column elasticity. */ max-width: calc(100% - 248px); } .google-footer-outer { clear: both; } .cols-wrapper, .google-footer-outer, .footer-inner, .header-inner { max-width: 978px; margin-left: auto; margin-right: auto; } .cols-wrapper { margin: auto; clear: both; margin-top: 60px; margin-bottom: 60px; overflow: hidden; } .col-main-wrapper { float: left; width: 100%; } .col-main { margin-right: 278px; max-width: 660px; } .col-right { float: right; width: 248px; margin-left: -278px; } /* Tweaks for layout mode. */ body#layout .google-footer-outer { display: none; } body#layout .header-outer, body#layout .footer-outer { background: none; } body#layout .header-inner { height: initial; } body#layout .cols-wrapper { margin-top: initial; margin-bottom: initial; } --></style> <!-- start all head --> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href='https://blog.chromium.org/favicon.ico' rel='icon' type='image/x-icon'/> <link href='https://blog.chromium.org/2014/' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Chromium Blog - Atom" href="https://blog.chromium.org/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Chromium Blog - RSS" href="https://blog.chromium.org/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Chromium Blog - Atom" href="https://www.blogger.com/feeds/2471378914199150966/posts/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='https://blog.chromium.org/2014/' property='og:url'/> <meta content='Chromium Blog' property='og:title'/> <meta content='News and developments from the open source browser project' property='og:description'/> <!-- end all head --> <base target='_self'/> <style> html { font-family: Roboto, sans-serif; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; } body { padding: 0; /* This ensures that the scroll bar is always present, which is needed */ /* because content render happens after page load; otherwise the header */ /* would "bounce" in-between states. */ min-height: 150%; } h2 { font-size: 16px; } h1, h2, h3, h4, h5 { line-height: 2em; } html, h4, h5, h6 { font-size: 14px; } a, a:visited { /* Ensures links meet minimum contrast ratios. */ color: #3974d6; text-decoration: none; } a:focus, a:hover, a:active { text-decoration: none; } .Header { margin-top: 15px; } .Header h1 { font-size: 32px; font-weight: 300; line-height: 32px; height: 42px; } .header-inner .Header .titlewrapper { padding: 0; margin-top: 30px; } .header-inner .Header .descriptionwrapper { padding: 0; margin: 0; } .cols-wrapper { margin-top: 56px; } .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 60px; } .header-inner { height: 256px; position: relative; } html, .header-inner a { color: #212121; color: rgba(0,0,0,.87); } .header-inner .google-logo { display: inline-block; background-size: contain; z-index: 1; height: 70px; overflow: hidden; margin-top: 4px; margin-right: 8px; } .header-left { position: absolute; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); margin-top: 12px; width: 100%; } .google-logo { margin-left: -4px; } .google-logo img{ height:70px; } #google-footer { position: relative; font-size: 13px; list-style: none; text-align: right; } #google-footer a { color: #444; } #google-footer ul { margin: 0; padding: 0; height: 144px; line-height: 144px; } #google-footer ul li { display: inline; } #google-footer ul li:before { color: #999; content: "\00b7"; font-weight: bold; margin: 5px; } #google-footer ul li:first-child:before { content: ''; } #google-footer .google-logo-dark { left: 0; margin-top: -16px; position: absolute; top: 50%; } /** Sitemap links. **/ .footer-inner-2 { font-size: 14px; padding-top: 42px; padding-bottom: 74px; } .footer-inner-2 .HTML h2 { color: #212121; color: rgba(0,0,0,.87); font-size: 14px; font-weight: 500; padding-left: 0; margin: 10px 0; } .footer-inner-2 .HTML ul { font-weight: normal; list-style: none; padding-left: 0; } .footer-inner-2 .HTML li { line-height: 24px; padding: 0; } .footer-inner-2 li a { color: rgba(65,132,243,.87); } /** Archive widget. **/ .BlogArchive { font-size: 13px; font-weight: normal; } .BlogArchive .widget-content { display: none; } .BlogArchive h2, .Label h2 { color: #4184F3; text-decoration: none; } .BlogArchive .hierarchy li { display: inline-block; } /* Specificity needed here to override widget CSS defaults. */ .BlogArchive #ArchiveList ul li, .BlogArchive #ArchiveList ul ul li { margin: 0; padding-left: 0; text-indent: 0; } .BlogArchive .intervalToggle { cursor: pointer; } .BlogArchive .expanded .intervalToggle .new-toggle { -ms-transform: rotate(180deg); transform: rotate(180deg); } .BlogArchive .new-toggle { float: right; padding-top: 3px; opacity: 0.87; } #ArchiveList { text-transform: uppercase; } #ArchiveList .expanded > ul:last-child { margin-bottom: 16px; } #ArchiveList .archivedate { width: 100%; } /* Months */ .BlogArchive .items { max-width: 150px; margin-left: -4px; } .BlogArchive .expanded .items { margin-bottom: 10px; overflow: hidden; } .BlogArchive .items > ul { float: left; height: 32px; } .BlogArchive .items a { padding: 0 4px; } .Label { font-size: 13px; font-weight: normal; } .sidebar-icon { display: inline-block; width: 24px; height: 24px; vertical-align: middle; margin-right: 12px; margin-top: -1px } .Label a { margin-right: 4px; } .Label .widget-content { display: none; } .FollowByEmail { font-size: 13px; font-weight: normal; } .FollowByEmail h2 { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); background-repeat: no-repeat; background-position: 0 50%; text-indent: 30px; } .FollowByEmail .widget-content { display: none; } .searchBox input { border: 1px solid #eee; color: #212121; color: rgba(0,0,0,.87); font-size: 14px; padding: 8px 8px 8px 40px; width: 164px; font-family: Roboto, sans-serif; background: url("https://www.gstatic.com/images/icons/material/system/1x/search_grey600_24dp.png") 8px center no-repeat; } .searchBox ::-webkit-input-placeholder { /* WebKit, Blink, Edge */ color: rgba(0,0,0,.54); } .searchBox :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #000; opacity: 0.54; } .searchBox ::-moz-placeholder { /* Mozilla Firefox 19+ */ color: #000; opacity: 0.54; } .searchBox :-ms-input-placeholder { /* Internet Explorer 10-11 */ color: #757575; } .widget-item-control { margin-top: 0px; } .section { margin: 0; padding: 0; } #sidebar-top { border: 1px solid #eee; } #sidebar-top > div { margin: 16px 0; } .widget ul { line-height: 1.6; } /*main post*/ .post { margin-bottom:30px; } #main .post .title { margin: 0; } #main .post .title a { color: #212121; color: rgba(0,0,0,.87); font-weight: normal; font-size: 24px; } #main .post .title a:hover { text-decoration:none; color: #3974d6; } .message, #main .post .post-header { margin: 0; padding: 0; } #main .post .post-header .caption, #main .post .post-header .labels-caption, #main .post .post-footer .caption, #main .post .post-footer .labels-caption { color: #444; font-weight: 500; } #main .tr-caption-container td { text-align: left; } #main .post .tr-caption { color: #757575; color: rgba(0,0,0,.54); display: block; max-width: 560px; padding-bottom: 20px; } #main .post .tr-caption-container { line-height: 24px; margin: -1px 0 0 0 !important; padding: 4px 0; text-align: left; } #main .post .post-header .published{ font-size:11px; font-weight:bold; } .post-header .publishdate { font-size: 17px; font-weight:normal; color: #757575; color: rgba(0,0,0,.54); } #main .post .post-footer{ font-size:12px; padding-bottom: 21px; } .label-footer { margin-bottom: 12px; margin-top: 12px; } .comment-img { margin-right: 16px; opacity: 0.54; vertical-align: middle; } #main .post .post-header .published { margin-bottom: 40px; margin-top: -2px; } .post .post-content { color: #212121; color: rgba(0,0,0,.87); font-size: 17px; margin: 25px 0 36px 0; line-height: 32px; } .post-body .post-content ul, .post-body .post-content ol { margin: 16px 0; padding: 0 48px; } .post-summary { display: none; } /* Another old-style caption. */ .post-content div i, .post-content div + i { font-size: 14px; font-style: normal; color: #757575; color: rgba(0,0,0,.54); display: block; line-height: 24px; margin-bottom: 16px; text-align: left; } /* Another old-style caption (with link) */ .post-content a > i { color: #4184F3 !important; } /* Old-style captions for images. */ .post-content .separator + div:not(.separator) { margin-top: -16px; } /* Capture section headers. */ .post-content br + br + b, .post-content .space + .space + b, .post-content .separator + b { display: inline-block; margin-bottom: 8px; margin-top: 24px; } .post-content li { line-height: 32px; } /* Override all post images/videos to left align. */ .post-content .separator, .post-content > div { text-align: left; } .post-content .separator > a, .post-content .separator > span { margin-left: 0 !important; } .post-content img { max-width: 100%; height: auto; width: auto; } .post-content .tr-caption-container img { margin-bottom: 12px; } .post-content iframe, .post-content embed { max-width: 100%; } .post-content .carousel-container { margin-bottom: 48px; } #main .post-content b { font-weight: 500; } /* These are the main paragraph spacing tweaks. */ #main .post-content br { content: ' '; display: block; padding: 4px; } .post-content .space { display: block; height: 8px; } .post-content iframe + .space, .post-content iframe + br { padding: 0 !important; } #main .post .jump-link { margin-bottom:10px; } .post-content img, .post-content iframe { margin: 30px 0 20px 0; } .post-content > img:first-child, .post-content > iframe:first-child { margin-top: 0; } .col-right .section { padding: 0 16px; } #aside { background:#fff; border:1px solid #eee; border-top: 0; } #aside .widget { margin:0; } #aside .widget h2, #ArchiveList .toggle + a.post-count-link { color: #212121; color: rgba(0,0,0,.87); font-weight: 400 !important; margin: 0; } #ArchiveList .toggle { float: right; } #ArchiveList .toggle .material-icons { padding-top: 4px; } #sidebar .tab { cursor: pointer; } #sidebar .tab .arrow { display: inline-block; float: right; } #sidebar .tab .icon { display: inline-block; vertical-align: top; height: 24px; width: 24px; margin-right: 13px; margin-left: -1px; margin-top: 1px; color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget-content > :first-child { padding-top: 8px; } #sidebar .active .tab .arrow { -ms-transform: rotate(180deg); transform: rotate(180deg); } #sidebar .arrow { color: #757575; color: rgba(0,0,0,.54); } #sidebar .widget h2 { font-size: 14px; line-height: 24px; display: inline-block; } #sidebar .widget .BlogArchive { padding-bottom: 8px; } #sidebar .widget { border-bottom: 1px solid #eee; box-shadow: 0px 1px 0 white; margin-bottom: 0; padding: 14px 0; min-height: 20px; } #sidebar .widget:last-child { border-bottom: none; box-shadow: none; margin-bottom: 0; } #sidebar ul { margin: 0; padding: 0; } #sidebar ul li { list-style:none; padding:0; } #sidebar ul li a { line-height: 32px; } #sidebar .archive { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUeNpiNDY23s9AAWBioBCwYBM8c+YMVsUmJibEGYBNMS5DaeMFfDYSZQA2v9I3FrB5AZeriI4FmnrBccCT8mhmGs1MwyAzAQQYAKEWG9zm9QFEAAAAAElFTkSuQmCC"); height: 24px; line-height: 24px; padding-left: 30px; } #sidebar .labels { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUxJREFUeNpiNDY23s9AAMycOfM7UF05kHkZmzwTMkdSUhKrIcXFxZy3bt3qBjIN8RrS09PDsHnzZjCNDr58+cKQlpbGDjSoHcg1w2oIyAUODg5gARCNzUVIBrUCuVYYhjx//pzhwIEDYAEQDeJjA1CDWIAGNQK59jBxRuSABbkAlwHIgIeHh2HWrFn/1NTU2oDcvSgBS4wBSC5iArqoCsj1YGIgEyAZVMoEchqlBjEB/cZAiUHg2AEGznpKDAImxOeM////B4VLKtBvEUCngZ1ILKivr3/u6+ubBzJAGZQ9gC5aQoqLgAY8BhkAZL4BuQQkxgXE34A4BuiiZEIuAhrwEGhAEZD5DpzYoIaA2UAM4kQADUrHZRDUgAIg8wO2XAwzbQXQa5OweQ1owB10AyA6gS7BgX1u3ry5397eHow3bdo0EyjGi00tQIABANPgyAH1q1eaAAAAAElFTkSuQmCC"); height: 20px; line-height: 20px; padding-left: 30px; } #sidebar .rss a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAX5JREFUeNqsVDGSgkAQHL2rIiIikohIc/EBRkbwAIwuwgfwAXiAD9AHSI7kEkECRCb6AIyINDLx7K0aa6kT7uq0q7YYtnZ7umdnt7darXbr9Zpegeu61DNNc0dvwCcH4/GYJpMJnc9nOhwOVJbl/4hAAokMECZJQtvt9k+kH7qufyEYDAakqqqYxFdRFBqNRmTbNg2HQ0rTlK7XayvR0xqBdDqdkuM4dE/0ULhYLOh4PHYrknG5XGi/31MYhuL/nkwonM1mlGUZ1XXdrsiyLGEDhY7juJEZ1u5tIixDGdYhmYw+B7CAzPP5nDabjdgIAgCksMX1832/3drtdqPT6SQWapomiGEFNkDEdpDMMAzK81ys/7XYy+XyoQgq2WoURSIJ2iIIgp/WZCCTvFm2wgeAU31aI3Q2GhIDMeB53qPYPIcm5VrxXIOIOxsDMStjVawAc1VViRgN22lNBiuQN3GR+SY07hpOoStmFQAKXRRFY93bnpG+fONfedi+BRgAbkS8Fxp7QQIAAAAASUVORK5CYII="); } #sidebar .subscription a { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAALCAYAAACZIGYHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUBJREFUeNrMkSGLAlEUhb+ZB4JFi8mx2cz+ApvhRUGTcUCrNqNJDYIi+DO0GUwmQXDK2DSIoGgZcSaIjDrzwrK4ssvChj1w0733O+fdp+m6PozH4yQSCfb7Pa7r8pOi0SjJZBLP8zgej4gAIMvlMuPxmADIYrHger1+C6lUKmo+NJ/NZojb7SZDWiwWo1qtks1msW2bw+HwZdkwDHq9HvV6nel0SqvVYrvdIh6Ph3Qch+VyqRYLhQJSSjRNw7IsfN9XgGKxSLfbJZfL0e/3aTabrFYr7vc7IujLcOh8PqunrNdr0uk0pVKJVCpFJBJRgEajweVyod1uMxgM2O12BAGUgRbU8DV2JpOhVquRz+cRQii3+XxOp9NRN3jVR5LPOp1OjEYjlSL8hclkgmmabDabt4d+m+S30vkD/R/IU4ABAPTZgnZdmG/PAAAAAElFTkSuQmCC"); } #sidebar-bottom { background: #f5f5f5; border-top:1px solid #eee; } #sidebar-bottom .widget { border-bottom: 1px solid #e0e0e0; padding: 15px 0; text-align: center; } #sidebar-bottom > div:last-child { border-bottom: 0; } #sidebar-bottom .text { line-height: 20px; } /* Home, forward, and backward pagination. */ .blog-pager { border-top : 1px #e0e0e0 solid; padding-top: 10px; margin-top: 15px; text-align: right !important; } #blog-pager { margin-botom: 0; margin-top: -14px; padding: 16px 0 0 0; } #blog-pager a { display: inline-block; } .blog-pager i.disabled { opacity: 0.2 !important; } .blog-pager i { color: black; margin-left: 16px; opacity: 0.54; } .blog-pager i:hover, .blog-pager i:active { opacity: 0.87; } #blog-pager-older-link, #blog-pager-newer-link { float: none; } .gplus-profile { background-color: #fafafa; border: 1px solid #eee; overflow: hidden; width: 212px; } .gplus-profile-inner { margin-left: -1px; margin-top: -1px; } /* Sidebar follow buttons. */ .followgooglewrapper { padding: 12px 0 0 0; } .loading { visibility: hidden; } .detail-page .post-footer .cmt_iframe_holder { padding-top: 40px !important; } /** Desktop **/ @media (max-width: 900px) { .col-right { display: none; } .col-main { margin-right: 0; min-width: initial; } .footer-outer { display: none; } .cols-wrapper { min-width: initial; } .google-footer-outer { background-color: #f5f5f5; } } /** Tablet **/ @media (max-width: 712px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 40px; } } /* An extra breakpoint accommodating for long blog titles. */ @media (max-width: 600px) { .header-left { height: 100%; position: initial; top: inherit; margin-top: 0; -webkit-transform: initial; transform: initial; } .header-title { margin-top: 18px; } .header-inner { height: auto; margin-bottom: 32px; margin-top: 32px; } .header-desc { margin-top: 12px; } .header-inner .google-logo { height: 70px; margin-top: 3px; } .header-inner .google-logo img { height: 70px; } .header-title h2 { font-size: 32px; line-height: 76px; } } /** Mobile/small desktop window; also landscape. **/ @media (max-width: 480px), (max-height: 480px) { .header-outer, .cols-wrapper, .footer-outer, .google-footer-outer { padding: 0 16px; } .cols-wrapper { margin-top: 0; } .post-header .publishdate, .post .post-content { font-size: 16px; } .post .post-content { line-height: 28px; margin-bottom: 30px; } .post { margin-top: 30px; } .byline-author { display: block; font-size: 12px; line-height: 24px; margin-top: 6px; } #main .post .title a { font-weight: 500; color: #4c4c4c; color: rgba(0,0,0,.70); } #main .post .post-header { padding-bottom: 12px; } #main .post .post-header .published { margin-bottom: -8px; margin-top: 3px; } .post .read-more { display: block; margin-top: 14px; } .post .tr-caption { font-size: 12px; } #main .post .title a { font-size: 20px; line-height: 30px; } .post-content iframe { /* iframe won't keep aspect ratio when scaled down. */ max-height: 240px; } .post-content .separator img, .post-content .tr-caption-container img, .post-content iframe { margin-left: -16px; max-width: inherit; width: calc(100% + 32px); } .post-content table, .post-content td { width: 100%; } #blog-pager { margin: 0; padding: 16px 0; } /** List page tweaks. **/ .list-page .post-original { display: none; } .list-page .post-summary { display: block; } .list-page .comment-container { display: none; } .list-page #blog-pager { padding-top: 0; border: 0; margin-top: -8px; } .list-page .label-footer { display: none; } .list-page #main .post .post-footer { border-bottom: 1px solid #eee; margin: -16px 0 0 0; padding: 0 0 20px 0; } .list-page .post .share { display: none; } /** Detail page tweaks. **/ .detail-page .post-footer .cmt_iframe_holder { padding-top: 32px !important; } .detail-page .label-footer { margin-bottom: 0; } .detail-page #main .post .post-footer { padding-bottom: 0; } .detail-page #comments { display: none; } } [data-about-pullquote], [data-is-preview], [data-about-syndication] { display: none; } </style> <noscript> <style> .loading { visibility: visible }</style> </noscript> <script type='text/javascript'> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-37592578-1', 'auto', 'blogger'); ga('blogger.send', 'pageview'); </script> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=2471378914199150966&zx=1e9da898-4807-4374-942f-3d02c74bbdb1' media='none' onload='if(media!='all')media='all'' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=2471378914199150966&zx=1e9da898-4807-4374-942f-3d02c74bbdb1' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?display=swap&family=Roboto"></head> <body> <script type='text/javascript'> //<![CDATA[ var axel = Math.random() + ""; var a = axel * 10000000000000; document.write('<iframe src="https://2542116.fls.doubleclick.net/activityi;src=2542116;type=gblog;cat=googl0;ord=ord=' + a + '?" width="1" height="1" frameborder="0" style="display:none"></iframe>'); //]]> </script> <noscript> <img alt='' height='1' src='https://ad.doubleclick.net/ddm/activity/src=2542116;type=gblog;cat=googl0;ord=1?' width='1'/> </noscript> <!-- Header --> <div class='header-outer'> <div class='header-inner'> <div class='section' id='header'><div class='widget Header' data-version='1' id='Header1'> <div class='header-left'> <div class='header-title'> <a class='google-logo' href='https://blog.chromium.org/'> <img alt="Chromium Blog" height="50" src="//1.bp.blogspot.com/-vkF7AFJOwBk/VkQxeAGi1mI/AAAAAAAARYo/57denvsQ8zA/s1600-r/logo_chromium.png"> </a> <a href='/.'> <h2> Chromium Blog </h2> </a> </div> <div class='header-desc'> News and developments from the open source browser project </div> </div> </div></div> </div> </div> <!-- all content wrapper start --> <div class='cols-wrapper loading'> <div class='col-main-wrapper'> <div class='col-main'> <div class='section' id='main'><div class='widget Blog' data-version='1' id='Blog1'> <div class='post' data-id='8029059063684352705' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/12/chrome-40-beta-powerful-offline-and.html' itemprop='url' title='Chrome 40 Beta: Powerful Offline and Lightspeed Loading with Service Workers'> Chrome 40 Beta: Powerful Offline and Lightspeed Loading with Service Workers </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, December 4, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> The newest Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes several new developer features to help you make richer, more compelling web content and apps, especially for mobile devices. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>Service Workers</b><br /> <br /> <span style="font-weight: normal;">This release adds <a href="http://www.w3.org/TR/service-workers/">service workers</a>, a powerful new API that allows developers to make sites work offline by intercepting network requests to deliver programmatic or cached responses. Besides enabling a rich offline experience, developers can also use the API to achieve dramatic performance improvements by caching UI and other common resources between page loads.</span><br /> <span style="font-weight: normal;"><br /></span> <br /> <div style="text-align: center;"> <iframe allowfullscreen="" frameborder="0" height="281" src="https://www.youtube.com/embed/px-J9Ghvcx4?rel=0" width="500"></iframe></div> <br /> <div style="text-align: center;"> <i>A before and after comparison of a repeat visitor loading a site that uses Service Workers.</i></div> <b><br /></b> Unlike other web technologies, the lifetime of a service worker is independent of the page that installed it. This lays the foundation for a new class of web applications with rich background capabilities. For example, future APIs like <a href="https://w3c.github.io/push-api/index.html">Push</a> and <a href="https://github.com/slightlyoff/BackgroundSync/blob/master/explainer.md">Background Sync</a> could do their work even after the page is closed, provided the user has given permission.<br /> <br /> This release includes two new APIs for use only within service workers. The <a href="https://fetch.spec.whatwg.org/">Fetch API</a> allows service workers to make network requests—including cross-origin—and return the responses to pages they control. The <a href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#cache-objects">Cache API</a> can save fetched responses and then return them directly the next time the same resource is requested, bypassing the latency-prone network and the eviction-prone HTTP cache.<br /> <br /> These APIs are still under active development and we are committed to keeping our implementation in sync with the specifications as they evolve. This release supports a subset of the Cache API, but developers can use a <a href="https://github.com/coonsta/cache-polyfill/blob/master/dist/serviceworker-cache-polyfill.js">polyfill</a> for full compatibility. If you’re interested in more in-depth information, check out <a href="http://www.html5rocks.com/en/tutorials/service-worker/introduction/">HTML5 Rocks</a> or our <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker">collection</a> of useful service worker “recipes.”<br /> <b><br /></b> <b>Other updates in this release</b><br /> <ul> <li> This release brings support for <a href="https://w3c.github.io/webappsec/specs/content-security-policy/#changes-from-level-1">the new directives</a> introduced in Content Security Policy (CSP) Level 2.</li> </ul> <ul> <li> The new <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/report-validity">reportValidity</a> method causes Chrome to draw the user’s attention to form fields with <a href="https://developers.google.com/web/fundamentals/input/form/provide-real-time-validation">validation</a> errors, saving developers from needing to implement this feature manually in JavaScript. </li> </ul> <ul> <li> Chrome now supports the <a href="http://www.w3.org/TR/html5/forms.html#attr-fe-minlength">minlength attribute</a>, a <a href="https://developers.google.com/web/fundamentals/input/form/provide-real-time-validation">validation</a> feature that allows developers to declare a lower bound on the number of characters a user can input.</li> </ul> <ul> <li>Thanks to a collaboration with <a href="https://01.org/chromium/blogs/drott/2014/intel-otc-hosted-google-engineers-coding-camp-non-latin-text-improvements-blink">Intel's Open Source Technology Center</a>, Chrome on Mac now uses <a href="http://www.harfbuzz.org/">HarfBuzz</a> for text shaping which improves performance and rendering of non-Latin text, brings new optimizations, and unifies the font system across all platforms.</li> </ul> <ul> <li> Developers can use the <a href="http://updates.html5rocks.com/2014/11/Support-for-theme-color-in-Chrome-39-for-Android">theme-color meta tag</a> to customize their toolbar color in the <a href="http://updates.html5rocks.com/2014/11/Support-for-theme-color-in-Chrome-39-for-Android">app switcher</a> on Android Lollipop.</li> </ul> As always, visit <a href="https://www.chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates.<br /> <br /> Posted by Dominic Cooney and Joshua Bell, Software Engineers at your service <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> The newest Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes several new developer features to help you make richer, more compelling web content and apps, especially for mobile devices. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>Service Workers</b><br /> <br /> <span style="font-weight: normal;">This release adds <a href="http://www.w3.org/TR/service-workers/">service workers</a>, a powerful new API that allows developers to make sites work offline by intercepting network requests to deliver programmatic or cached responses. Besides enabling a rich offline experience, developers can also use the API to achieve dramatic performance improvements by caching UI and other common resources between page loads.</span><br /> <span style="font-weight: normal;"><br /></span> <br /> <div style="text-align: center;"> <iframe allowfullscreen="" frameborder="0" height="281" src="https://www.youtube.com/embed/px-J9Ghvcx4?rel=0" width="500"></iframe></div> <br /> <div style="text-align: center;"> <i>A before and after comparison of a repeat visitor loading a site that uses Service Workers.</i></div> <b><br /></b> Unlike other web technologies, the lifetime of a service worker is independent of the page that installed it. This lays the foundation for a new class of web applications with rich background capabilities. For example, future APIs like <a href="https://w3c.github.io/push-api/index.html">Push</a> and <a href="https://github.com/slightlyoff/BackgroundSync/blob/master/explainer.md">Background Sync</a> could do their work even after the page is closed, provided the user has given permission.<br /> <br /> This release includes two new APIs for use only within service workers. The <a href="https://fetch.spec.whatwg.org/">Fetch API</a> allows service workers to make network requests—including cross-origin—and return the responses to pages they control. The <a href="https://slightlyoff.github.io/ServiceWorker/spec/service_worker/index.html#cache-objects">Cache API</a> can save fetched responses and then return them directly the next time the same resource is requested, bypassing the latency-prone network and the eviction-prone HTTP cache.<br /> <br /> These APIs are still under active development and we are committed to keeping our implementation in sync with the specifications as they evolve. This release supports a subset of the Cache API, but developers can use a <a href="https://github.com/coonsta/cache-polyfill/blob/master/dist/serviceworker-cache-polyfill.js">polyfill</a> for full compatibility. If you’re interested in more in-depth information, check out <a href="http://www.html5rocks.com/en/tutorials/service-worker/introduction/">HTML5 Rocks</a> or our <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker">collection</a> of useful service worker “recipes.”<br /> <b><br /></b> <b>Other updates in this release</b><br /> <ul> <li> This release brings support for <a href="https://w3c.github.io/webappsec/specs/content-security-policy/#changes-from-level-1">the new directives</a> introduced in Content Security Policy (CSP) Level 2.</li> </ul> <ul> <li> The new <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/report-validity">reportValidity</a> method causes Chrome to draw the user’s attention to form fields with <a href="https://developers.google.com/web/fundamentals/input/form/provide-real-time-validation">validation</a> errors, saving developers from needing to implement this feature manually in JavaScript. </li> </ul> <ul> <li> Chrome now supports the <a href="http://www.w3.org/TR/html5/forms.html#attr-fe-minlength">minlength attribute</a>, a <a href="https://developers.google.com/web/fundamentals/input/form/provide-real-time-validation">validation</a> feature that allows developers to declare a lower bound on the number of characters a user can input.</li> </ul> <ul> <li>Thanks to a collaboration with <a href="https://01.org/chromium/blogs/drott/2014/intel-otc-hosted-google-engineers-coding-camp-non-latin-text-improvements-blink">Intel's Open Source Technology Center</a>, Chrome on Mac now uses <a href="http://www.harfbuzz.org/">HarfBuzz</a> for text shaping which improves performance and rendering of non-Latin text, brings new optimizations, and unifies the font system across all platforms.</li> </ul> <ul> <li> Developers can use the <a href="http://updates.html5rocks.com/2014/11/Support-for-theme-color-in-Chrome-39-for-Android">theme-color meta tag</a> to customize their toolbar color in the <a href="http://updates.html5rocks.com/2014/11/Support-for-theme-color-in-Chrome-39-for-Android">app switcher</a> on Android Lollipop.</li> </ul> As always, visit <a href="https://www.chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates.<br /> <br /> Posted by Dominic Cooney and Joshua Bell, Software Engineers at your service <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Chrome 40 Beta: Powerful Offline and Lightspeed Loading with Service Workers&url=https://blog.chromium.org/2014/12/chrome-40-beta-powerful-offline-and.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/12/chrome-40-beta-powerful-offline-and.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/12/chrome-40-beta-powerful-offline-and.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://blog.chromium.org/search/label/beta' rel='tag'> beta </a> </span> </div> </div> </div> <div class='post' data-id='1664608431460134615' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/11/the-final-countdown-for-npapi.html' itemprop='url' title='The Final Countdown for NPAPI'> The Final Countdown for NPAPI </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, November 24, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Last September we <a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html">announced</a> our plan to remove NPAPI support from Chrome, a change that will improve Chrome’s security, speed, and stability as well as reduce complexity in the code base. Since our <a href="http://blog.chromium.org/2014/05/update-on-npapi-deprecation.html">last update</a>, NPAPI usage has continued its decline. Given this usage data, we will continue with our deprecation plan.<br /> <br /> <b>Monthly Plug-in Launch Percentage</b><br /> <br /> <center> <table border="0"> <colgroup> <col width="125"></col> <col width="106"></col> <col width="76"></col> <col width="90"></col> </colgroup> <tbody> <tr> <td><br /></td> <td><i>Sept 13</i></td> <td><i>May 14</i></td> <td><i>Oct 14</i></td> </tr> <tr> <td>Silverlight</td> <td>15%</td> <td>13.3%</td> <td>11%</td> </tr> <tr> <td>Google Talk</td> <td>8.7%</td> <td>8.7%</td> <td>7%</td> </tr> <tr> <td>Java</td> <td>8.9%</td> <td>7.2%</td> <td>3.7%</td> </tr> <tr> <td>Facebook </td> <td>6%</td> <td>4.2%</td> <td>3.0%</td> </tr> <tr> <td>Unity</td> <td>9.1%</td> <td>3.1%</td> <td>1.9%</td> </tr> <tr> <td>Google Earth</td> <td>9.1%</td> <td>0.1%</td> <td>0.1%</td> </tr> </tbody></table> </center> <br /> Currently Chrome supports NPAPI plugins, but they are blocked by default unless the user chooses to allow them for specific sites (via the <a href="https://sites.google.com/a/chromium.org/dev/developers/npapi-deprecation?pli=1">page action UI</a>). A small number of the most popular plugins are whitelisted and allowed by default. In January 2015 we will remove the whitelist, meaning all plugins will be blocked by default.<br /> <br /> In April 2015 NPAPI support will be disabled by default in Chrome and we will unpublish extensions requiring NPAPI plugins from the Chrome Web Store. Although plugin vendors are working hard to move to alternate technologies, a small number of users still rely on plugins that haven’t completed the transition yet. We will provide an override for advanced users (via chrome://flags/#enable-npapi) and enterprises (via Enterprise Policy) to <b>temporarily</b> re-enable NPAPI while they wait for mission-critical plugins to make the transition.<br /> <br /> In September 2015 we will remove the override and NPAPI support will be permanently removed from Chrome. Installed extensions that require NPAPI plugins will no longer be able to load those plugins.<br /> <br /> For more details on the timeline, including guidance for NPAPI plugin developers, see the <a href="http://www.chromium.org/developers/npapi-deprecation">NPAPI deprecation guide</a>. With each step in this transition, we get closer to a safer, more mobile-friendly web.<br /> <br /> Posted by Justin Schuh, Software Engineer and Plug-in Retirement Planner<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Last September we <a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html">announced</a> our plan to remove NPAPI support from Chrome, a change that will improve Chrome’s security, speed, and stability as well as reduce complexity in the code base. Since our <a href="http://blog.chromium.org/2014/05/update-on-npapi-deprecation.html">last update</a>, NPAPI usage has continued its decline. Given this usage data, we will continue with our deprecation plan.<br /> <br /> <b>Monthly Plug-in Launch Percentage</b><br /> <br /> <center> <table border="0"> <colgroup> <col width="125"></col> <col width="106"></col> <col width="76"></col> <col width="90"></col> </colgroup> <tbody> <tr> <td><br /></td> <td><i>Sept 13</i></td> <td><i>May 14</i></td> <td><i>Oct 14</i></td> </tr> <tr> <td>Silverlight</td> <td>15%</td> <td>13.3%</td> <td>11%</td> </tr> <tr> <td>Google Talk</td> <td>8.7%</td> <td>8.7%</td> <td>7%</td> </tr> <tr> <td>Java</td> <td>8.9%</td> <td>7.2%</td> <td>3.7%</td> </tr> <tr> <td>Facebook </td> <td>6%</td> <td>4.2%</td> <td>3.0%</td> </tr> <tr> <td>Unity</td> <td>9.1%</td> <td>3.1%</td> <td>1.9%</td> </tr> <tr> <td>Google Earth</td> <td>9.1%</td> <td>0.1%</td> <td>0.1%</td> </tr> </tbody></table> </center> <br /> Currently Chrome supports NPAPI plugins, but they are blocked by default unless the user chooses to allow them for specific sites (via the <a href="https://sites.google.com/a/chromium.org/dev/developers/npapi-deprecation?pli=1">page action UI</a>). A small number of the most popular plugins are whitelisted and allowed by default. In January 2015 we will remove the whitelist, meaning all plugins will be blocked by default.<br /> <br /> In April 2015 NPAPI support will be disabled by default in Chrome and we will unpublish extensions requiring NPAPI plugins from the Chrome Web Store. Although plugin vendors are working hard to move to alternate technologies, a small number of users still rely on plugins that haven’t completed the transition yet. We will provide an override for advanced users (via chrome://flags/#enable-npapi) and enterprises (via Enterprise Policy) to <b>temporarily</b> re-enable NPAPI while they wait for mission-critical plugins to make the transition.<br /> <br /> In September 2015 we will remove the override and NPAPI support will be permanently removed from Chrome. Installed extensions that require NPAPI plugins will no longer be able to load those plugins.<br /> <br /> For more details on the timeline, including guidance for NPAPI plugin developers, see the <a href="http://www.chromium.org/developers/npapi-deprecation">NPAPI deprecation guide</a>. With each step in this transition, we get closer to a safer, more mobile-friendly web.<br /> <br /> Posted by Justin Schuh, Software Engineer and Plug-in Retirement Planner<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:The Final Countdown for NPAPI&url=https://blog.chromium.org/2014/11/the-final-countdown-for-npapi.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/11/the-final-countdown-for-npapi.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/11/the-final-countdown-for-npapi.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='6000637140562557395' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/10/learning-statistics-with-privacy-aided.html' itemprop='url' title='Learning Statistics with Privacy, aided by the Flip of a Coin'> Learning Statistics with Privacy, aided by the Flip of a Coin </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, October 30, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <i>[Cross-posted on the <a href="http://googleresearch.blogspot.com/">Google Research Blog</a> and the <a href="http://googleonlinesecurity.blogspot.com/2014/10/learning-statistics-with-privacy-aided.html">Google Online Security Blog</a>]</i><br /> <br /> At Google, we are constantly trying to improve the techniques we use to <a href="https://www.google.com/policies/technologies/">protect our users' security and privacy</a>. One such project, RAPPOR (Randomized Aggregatable Privacy-Preserving Ordinal Response), provides a new state-of-the-art, privacy-preserving way to learn software statistics that we can use to better safeguard our users’ security, find bugs, and improve the overall user experience.<br /> <br /> Building on the concept of <a href="http://en.wikipedia.org/wiki/Randomized_response">randomized response</a>, RAPPOR enables learning statistics about the behavior of users’ software while guaranteeing client privacy. The guarantees of <a href="http://en.wikipedia.org/wiki/Differential_privacy">differential privacy</a>, which are widely accepted as being the <a href="http://arxiv.org/abs/1402.3329">strongest form of privacy</a>, have almost never been used in practice despite <a href="https://www.youtube.com/watch?v=Gx13lgEudtU">intense research in academia</a>. RAPPOR introduces a practical method to achieve those guarantees.<br /> <br /> To understand RAPPOR, consider the following example. Let’s say you wanted to count how many of your online friends were dogs, while respecting the maxim that, <a href="http://en.wikipedia.org/wiki/On_the_Internet,_nobody_knows_you%27re_a_dog">on the Internet, nobody should know you’re a dog</a>. To do this, you could ask each friend to answer the question “Are you a dog?” in the following way. Each friend should flip a coin in secret, and answer the question truthfully if the coin came up heads; but, if the coin came up tails, that friend should always say “Yes” regardless. Then you could get a good estimate of the true count from the greater-than-half fraction of your friends that answered “Yes”. However, you still wouldn’t know which of your friends was a dog: each answer “Yes” would most likely be due to that friend’s coin flip coming up tails.<br /> <br /> RAPPOR builds on the above concept, allowing software to send reports that are effectively indistinguishable from the results of random coin flips and are free of any unique identifiers. However, by aggregating the reports we can learn the common statistics that are shared by many users. We’re currently testing the use of RAPPOR in Chrome, to learn statistics about how <a href="//www.google.com/about/company/unwanted-software-policy.html">unwanted software</a> is <a href="http://chrome.blogspot.com/2013/10/dont-mess-with-my-browser.html">hijacking</a> users’ settings.<br /> <br /> We believe that RAPPOR has the potential to be applied for a number of different purposes, so we're making it freely available for all to use. We'll continue development of RAPPOR as a standalone <a href="https://github.com/google/rappor">open-source project</a> so that anybody can inspect and test its reporting and analysis mechanisms, and help develop the technology. We’ve written up the technical details of RAPPOR in a <a href="http://arxiv.org/abs/1407.6981">report</a> that will be published next week at the <a href="http://www.sigsac.org/ccs/CCS2014/">ACM Conference on Computer and Communications Security</a>.<br /> <br /> We’re encouraged by the <a href="https://cdt.org/blog/having-your-big-data-cake-and-eating-it-too/">feedback</a> we’ve received so far from academics and other stakeholders, and we’re looking forward to additional comments from the community. We hope that everybody interested in preserving user privacy will review the technology and share their feedback at <a href="https://groups.google.com/forum/#!forum/rappor-discuss">rappor-discuss@googlegroups.com</a>.<br /> <br /> Posted by Úlfar Erlingsson, Tech Lead Manager, Security Research<br /> <div> <br /></div> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <i>[Cross-posted on the <a href="http://googleresearch.blogspot.com/">Google Research Blog</a> and the <a href="http://googleonlinesecurity.blogspot.com/2014/10/learning-statistics-with-privacy-aided.html">Google Online Security Blog</a>]</i><br /> <br /> At Google, we are constantly trying to improve the techniques we use to <a href="https://www.google.com/policies/technologies/">protect our users' security and privacy</a>. One such project, RAPPOR (Randomized Aggregatable Privacy-Preserving Ordinal Response), provides a new state-of-the-art, privacy-preserving way to learn software statistics that we can use to better safeguard our users’ security, find bugs, and improve the overall user experience.<br /> <br /> Building on the concept of <a href="http://en.wikipedia.org/wiki/Randomized_response">randomized response</a>, RAPPOR enables learning statistics about the behavior of users’ software while guaranteeing client privacy. The guarantees of <a href="http://en.wikipedia.org/wiki/Differential_privacy">differential privacy</a>, which are widely accepted as being the <a href="http://arxiv.org/abs/1402.3329">strongest form of privacy</a>, have almost never been used in practice despite <a href="https://www.youtube.com/watch?v=Gx13lgEudtU">intense research in academia</a>. RAPPOR introduces a practical method to achieve those guarantees.<br /> <br /> To understand RAPPOR, consider the following example. Let’s say you wanted to count how many of your online friends were dogs, while respecting the maxim that, <a href="http://en.wikipedia.org/wiki/On_the_Internet,_nobody_knows_you%27re_a_dog">on the Internet, nobody should know you’re a dog</a>. To do this, you could ask each friend to answer the question “Are you a dog?” in the following way. Each friend should flip a coin in secret, and answer the question truthfully if the coin came up heads; but, if the coin came up tails, that friend should always say “Yes” regardless. Then you could get a good estimate of the true count from the greater-than-half fraction of your friends that answered “Yes”. However, you still wouldn’t know which of your friends was a dog: each answer “Yes” would most likely be due to that friend’s coin flip coming up tails.<br /> <br /> RAPPOR builds on the above concept, allowing software to send reports that are effectively indistinguishable from the results of random coin flips and are free of any unique identifiers. However, by aggregating the reports we can learn the common statistics that are shared by many users. We’re currently testing the use of RAPPOR in Chrome, to learn statistics about how <a href="//www.google.com/about/company/unwanted-software-policy.html">unwanted software</a> is <a href="http://chrome.blogspot.com/2013/10/dont-mess-with-my-browser.html">hijacking</a> users’ settings.<br /> <br /> We believe that RAPPOR has the potential to be applied for a number of different purposes, so we're making it freely available for all to use. We'll continue development of RAPPOR as a standalone <a href="https://github.com/google/rappor">open-source project</a> so that anybody can inspect and test its reporting and analysis mechanisms, and help develop the technology. We’ve written up the technical details of RAPPOR in a <a href="http://arxiv.org/abs/1407.6981">report</a> that will be published next week at the <a href="http://www.sigsac.org/ccs/CCS2014/">ACM Conference on Computer and Communications Security</a>.<br /> <br /> We’re encouraged by the <a href="https://cdt.org/blog/having-your-big-data-cake-and-eating-it-too/">feedback</a> we’ve received so far from academics and other stakeholders, and we’re looking forward to additional comments from the community. We hope that everybody interested in preserving user privacy will review the technology and share their feedback at <a href="https://groups.google.com/forum/#!forum/rappor-discuss">rappor-discuss@googlegroups.com</a>.<br /> <br /> Posted by Úlfar Erlingsson, Tech Lead Manager, Security Research<br /> <div> <br /></div> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Learning Statistics with Privacy, aided by the Flip of a Coin&url=https://blog.chromium.org/2014/10/learning-statistics-with-privacy-aided.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/10/learning-statistics-with-privacy-aided.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/10/learning-statistics-with-privacy-aided.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='2020862835264274310' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/10/noto-on-chromeos-no-more-tofu.html' itemprop='url' title='Noto on ChromeOS: No More “Tofu”'> Noto on ChromeOS: No More “Tofu” </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, October 14, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Every so often when reading a page written in a different language—especially Chinese, Korean, or Japanese (CJK) pages—you might see little boxes where letters should be, something that we call “tofu”. What's happened is that some of the characters are not supported by your computer. In July <a href="//www.google.com/url?q=http://googledevelopers.blogspot.com/2014/07/noto-cjk-font-that-is-complete.html&sa=D&sntz=1&usg=AFQjCNHIJwsoQZmSOxrJoEVtEGGd3l3iJA">Google released Noto Sans CJK</a>, the newest font in a family designed to cover 200+ languages in a harmonious way. As of Chrome OS 38, Noto is now the default sans serif and UI font for CJK languages.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg44-7LKMMYJ0HGRevoIVSugFPxKLa0jRQI03_ugHoCqK_XvYjLIlkT9q8TP3QjmO0eH9jjIkt9CzoPIWNzm-r4b2jQbGPuPHYhsbIKmcAmYxL5nfO1LgNmRGSYg_ix1UvWwAwEUOPGFL2B/s1600/tofu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="25" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg44-7LKMMYJ0HGRevoIVSugFPxKLa0jRQI03_ugHoCqK_XvYjLIlkT9q8TP3QjmO0eH9jjIkt9CzoPIWNzm-r4b2jQbGPuPHYhsbIKmcAmYxL5nfO1LgNmRGSYg_ix1UvWwAwEUOPGFL2B/s1600/tofu.png" width="400" /></a></div> <br /> Noto supports major living languages such as English, Russian, Greek, Arabic, and Hebrew, as well as widely supported languages such as Cherokee and Sinhala, and even ancient languages like Egyptian hieroglyphics and Imperial Aramaic. The ultimate goal is for Noto to support every character for every language in the world—which will make tofu a thing of the past.<br /> <br /> Noto has many advanced features:<br /> <ul> <li><b>Pan-CJK: </b>Simplified and Traditional Chinese, Japanese, and Korean, all in a single font.</li> <li><b>Seven weights: </b>Thin, Light, DemiLight, Regular, Medium, Bold, Black. ChromeOS has default support for Regular and Bold, with more coming soon.</li> <li><b>Free and open source: </b>Freely available for everyone under the <a href="//www.google.com/url?q=http://www.apache.org/licenses/LICENSE-2.0.html&sa=D&sntz=1&usg=AFQjCNHpksB5gXq52YoWpCRd2CNEURXmJA">Apache License, v2.0</a>.</li> <li><b>Comprehensive character coverage: </b>Covers all the CJK Ideographs in the Unicode Basic Multilingual Plane and a few hundred Ideographs in Unicode Plane 2. Also covered are over twelve thousand Korean Hangul characters with full support for Old Hangul. The total number of glyphs in each font instance is exactly 65,536, the maximum number of glyphs allowed by the OpenType font specification. </li> <li><b>Region-appropriate glyph forms:</b> CJK-shared ideographic characters follow region writing conventions to look appropriate to Chinese, Japanese, and Korean users. </li> <li><b>Harmony:</b> Noto Sans CJK and all other members of the Noto family are visually compatible with Noto Sans for English, so that text mixing English with another language looks harmonious.</li> </ul> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoWqQuhZTPKe22UpJ_55ErWZKscOJxwjtYtoZpwVjxLWHvjoRvb_x72JJ7JX4njfUs8aq8v5N1MnAjCxT3eKGDp87dnJutLRQAradi6_4waReoYOlaVSH38LFsG0Y6uAqP76IOqwRSMis2/s1600/cjk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoWqQuhZTPKe22UpJ_55ErWZKscOJxwjtYtoZpwVjxLWHvjoRvb_x72JJ7JX4njfUs8aq8v5N1MnAjCxT3eKGDp87dnJutLRQAradi6_4waReoYOlaVSH38LFsG0Y6uAqP76IOqwRSMis2/s1600/cjk.png" width="373" /></a> </div> <br /> In ChromeOS, Noto is now the default “sans serif” font. Developers that want to use Noto on platforms other than ChromeOS can load them as web fonts from <a href="//www.google.com/fonts/earlyaccess">Google Fonts: Early Access</a>.<br /> <br /> Although Noto's Latin, Greek, and Cryllic (LGC) characters are designed to harmonize with the CJK characters, developers might still want to use more familiar fonts for the LGC text. To support that, Noto is available in different subsets including Japanese, Korean, Simplified Chinese, Traditional Chinese, and all of CJK. Developers can then use CSS's font fallback mechanism to specify a LGC font ahead of a Noto Sans subset.<br /> <br /> For example, if you're targeting devices that don't have Noto installed, want to use Arial for LGC characters, and want to use Noto for Japanese characters, you can include the following in your stylesheet:<br /> <blockquote> <span style="font-family: Courier New, Courier, monospace;">@import url(http://fonts.googleapis.com/earlyaccess/notosansjapanese.css);</span> </blockquote> <blockquote> <span style="font-family: 'Courier New', Courier, monospace;">body {</span></blockquote> <blockquote> <blockquote> <span style="font-family: Courier New, Courier, monospace;">font-family: Arial, 'Noto Sans Japanese', sans-serif;</span></blockquote> <span style="font-family: Courier New, Courier, monospace;">}</span></blockquote> Shipping Noto by default on ChromeOS is one step towards making “tofu” a thing of the past. You can learn more at the <a href="//www.google.com/get/noto/#/">Noto homepage</a>.<br /> <br /> Jungshik Shin, Font Harmony Master<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Every so often when reading a page written in a different language—especially Chinese, Korean, or Japanese (CJK) pages—you might see little boxes where letters should be, something that we call “tofu”. What's happened is that some of the characters are not supported by your computer. In July <a href="//www.google.com/url?q=http://googledevelopers.blogspot.com/2014/07/noto-cjk-font-that-is-complete.html&sa=D&sntz=1&usg=AFQjCNHIJwsoQZmSOxrJoEVtEGGd3l3iJA">Google released Noto Sans CJK</a>, the newest font in a family designed to cover 200+ languages in a harmonious way. As of Chrome OS 38, Noto is now the default sans serif and UI font for CJK languages.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg44-7LKMMYJ0HGRevoIVSugFPxKLa0jRQI03_ugHoCqK_XvYjLIlkT9q8TP3QjmO0eH9jjIkt9CzoPIWNzm-r4b2jQbGPuPHYhsbIKmcAmYxL5nfO1LgNmRGSYg_ix1UvWwAwEUOPGFL2B/s1600/tofu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="25" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg44-7LKMMYJ0HGRevoIVSugFPxKLa0jRQI03_ugHoCqK_XvYjLIlkT9q8TP3QjmO0eH9jjIkt9CzoPIWNzm-r4b2jQbGPuPHYhsbIKmcAmYxL5nfO1LgNmRGSYg_ix1UvWwAwEUOPGFL2B/s1600/tofu.png" width="400" /></a></div> <br /> Noto supports major living languages such as English, Russian, Greek, Arabic, and Hebrew, as well as widely supported languages such as Cherokee and Sinhala, and even ancient languages like Egyptian hieroglyphics and Imperial Aramaic. The ultimate goal is for Noto to support every character for every language in the world—which will make tofu a thing of the past.<br /> <br /> Noto has many advanced features:<br /> <ul> <li><b>Pan-CJK: </b>Simplified and Traditional Chinese, Japanese, and Korean, all in a single font.</li> <li><b>Seven weights: </b>Thin, Light, DemiLight, Regular, Medium, Bold, Black. ChromeOS has default support for Regular and Bold, with more coming soon.</li> <li><b>Free and open source: </b>Freely available for everyone under the <a href="//www.google.com/url?q=http://www.apache.org/licenses/LICENSE-2.0.html&sa=D&sntz=1&usg=AFQjCNHpksB5gXq52YoWpCRd2CNEURXmJA">Apache License, v2.0</a>.</li> <li><b>Comprehensive character coverage: </b>Covers all the CJK Ideographs in the Unicode Basic Multilingual Plane and a few hundred Ideographs in Unicode Plane 2. Also covered are over twelve thousand Korean Hangul characters with full support for Old Hangul. The total number of glyphs in each font instance is exactly 65,536, the maximum number of glyphs allowed by the OpenType font specification. </li> <li><b>Region-appropriate glyph forms:</b> CJK-shared ideographic characters follow region writing conventions to look appropriate to Chinese, Japanese, and Korean users. </li> <li><b>Harmony:</b> Noto Sans CJK and all other members of the Noto family are visually compatible with Noto Sans for English, so that text mixing English with another language looks harmonious.</li> </ul> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoWqQuhZTPKe22UpJ_55ErWZKscOJxwjtYtoZpwVjxLWHvjoRvb_x72JJ7JX4njfUs8aq8v5N1MnAjCxT3eKGDp87dnJutLRQAradi6_4waReoYOlaVSH38LFsG0Y6uAqP76IOqwRSMis2/s1600/cjk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoWqQuhZTPKe22UpJ_55ErWZKscOJxwjtYtoZpwVjxLWHvjoRvb_x72JJ7JX4njfUs8aq8v5N1MnAjCxT3eKGDp87dnJutLRQAradi6_4waReoYOlaVSH38LFsG0Y6uAqP76IOqwRSMis2/s1600/cjk.png" width="373" /></a> </div> <br /> In ChromeOS, Noto is now the default “sans serif” font. Developers that want to use Noto on platforms other than ChromeOS can load them as web fonts from <a href="//www.google.com/fonts/earlyaccess">Google Fonts: Early Access</a>.<br /> <br /> Although Noto's Latin, Greek, and Cryllic (LGC) characters are designed to harmonize with the CJK characters, developers might still want to use more familiar fonts for the LGC text. To support that, Noto is available in different subsets including Japanese, Korean, Simplified Chinese, Traditional Chinese, and all of CJK. Developers can then use CSS's font fallback mechanism to specify a LGC font ahead of a Noto Sans subset.<br /> <br /> For example, if you're targeting devices that don't have Noto installed, want to use Arial for LGC characters, and want to use Noto for Japanese characters, you can include the following in your stylesheet:<br /> <blockquote> <span style="font-family: Courier New, Courier, monospace;">@import url(http://fonts.googleapis.com/earlyaccess/notosansjapanese.css);</span> </blockquote> <blockquote> <span style="font-family: 'Courier New', Courier, monospace;">body {</span></blockquote> <blockquote> <blockquote> <span style="font-family: Courier New, Courier, monospace;">font-family: Arial, 'Noto Sans Japanese', sans-serif;</span></blockquote> <span style="font-family: Courier New, Courier, monospace;">}</span></blockquote> Shipping Noto by default on ChromeOS is one step towards making “tofu” a thing of the past. You can learn more at the <a href="//www.google.com/get/noto/#/">Noto homepage</a>.<br /> <br /> Jungshik Shin, Font Harmony Master<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Noto on ChromeOS: No More “Tofu”&url=https://blog.chromium.org/2014/10/noto-on-chromeos-no-more-tofu.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/10/noto-on-chromeos-no-more-tofu.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/10/noto-on-chromeos-no-more-tofu.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='4034797254387152027' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/10/chrome-39-beta-js-generators-animation.html' itemprop='url' title='Chrome 39 Beta: JS Generators, Animation Playback Control, and the WebApp Manifest'> Chrome 39 Beta: JS Generators, Animation Playback Control, and the WebApp Manifest </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, October 9, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Today’s Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes new tools to make web application development simpler and more powerful. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>JavaScript Generators</b><br /> <br /> Writing asynchronous code in JavaScript can be <a href="http://jakearchibald.com/2014/es7-async-functions/">less than straightforward</a>. It often involves several nested functions and non-linear program execution, making it hard to develop, maintain and debug. This is such a common pain point for developers that they've given it a name: callback soup.<br /> <br /> Starting today, Chrome Beta supports ES6 Generators. They allow developers to create iterators that pause their execution after yielding a value, and resume again when later invoked. This greatly simplifies the process of developing asynchronous code and reduces dependence on callback functions.<br /> <br /> For additional information about Generators, <a href="http://updates.html5rocks.com/2014/10/Generators-the-Gnarly-Bits">read more about them</a> or <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/generators">see them in action</a>.<br /> <br /> <b>Web Animation Playback Control</b><br /> <br /> <a href="http://updates.html5rocks.com/2014/05/Web-Animations---element-animate-is-now-in-Chrome-36">Web Animations</a> is a powerful new API that unifies all of the animation APIs on the web. We shipped basic support in May with Chrome 36. In this release we've added playback control, with methods such as <span style="font-family: Courier New, Courier, monospace;">play()</span>, <span style="font-family: Courier New, Courier, monospace;">pause()</span>, and <span style="font-family: Courier New, Courier, monospace;">reverse()</span>, and the ability to jump to a specific point in an animation's timeline. With our initial support, developers could create animations but not precisely control their playback. This next iteration enables <a href="http://web-animations.github.io/web-animations-demos/#playback-control">animations that can react in real time to user input</a> - as well as a variety of other creative uses.<br /> <br /> <b>Web Application Manifest</b><br /> <br /> Previously when developers wanted to allow their web applications to be added to the home screen from Chrome for Android, they had to use a variety of <span style="font-family: Courier New, Courier, monospace;"><meta></span> and <span style="font-family: Courier New, Courier, monospace;"><link></span> tags to trigger this behavior and deliver relevant resources such as icons. Having this embedded in every page was not only repetitive, but was a waste of bandwidth and put <a href="https://www.youtube.com/watch?v=YV1nKLWoARQ">extra bits on the critical path</a>.<br /> <br /> Starting in Chrome 39, <a href="http://w3c.github.io/manifest/">Manifests</a> provide a way to wrap metadata about a web application into a single file, reducing duplication. Developers seeking to enable "<a href="https://developer.chrome.com/multidevice/android/installtohomescreen">add to homescreen</a>" can define a title, landing page, default orientation, and different icons depending on size and screen density. You can <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/web-application-manifest">see how it works today</a>, but stay tuned for more properties to be added in later releases.<br /> <br /> <b>Other updates in this release</b><br /> <ul> <li>The <a href="http://updates.html5rocks.com/2014/10/Send-beacon-data-in-Chrome-39">Beacon API</a> enables developers to queue asynchronous network requests that will be sent, regardless of whether the user navigates to a new page</li> <li>Scroll offsets (<span style="font-family: Courier New, Courier, monospace;">scrollTop</span>, <span style="font-family: Courier New, Courier, monospace;">scrollLeft</span>) now return high-precision fractional values in preparation for high-DPI support</li> <li>XMLHttpRequest progress event properties <span style="font-family: Courier New, Courier, monospace;">position</span> and <span style="font-family: Courier New, Courier, monospace;">totalSize</span> are now deprecated in favor of the <span style="font-family: Courier New, Courier, monospace;">loaded</span> and <span style="font-family: Courier New, Courier, monospace;">total</span> properties</li> </ul> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates.<br /> <br /> Posted by Mounir Lamouri, the Manifestation of a Software Engineer <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Today’s Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes new tools to make web application development simpler and more powerful. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>JavaScript Generators</b><br /> <br /> Writing asynchronous code in JavaScript can be <a href="http://jakearchibald.com/2014/es7-async-functions/">less than straightforward</a>. It often involves several nested functions and non-linear program execution, making it hard to develop, maintain and debug. This is such a common pain point for developers that they've given it a name: callback soup.<br /> <br /> Starting today, Chrome Beta supports ES6 Generators. They allow developers to create iterators that pause their execution after yielding a value, and resume again when later invoked. This greatly simplifies the process of developing asynchronous code and reduces dependence on callback functions.<br /> <br /> For additional information about Generators, <a href="http://updates.html5rocks.com/2014/10/Generators-the-Gnarly-Bits">read more about them</a> or <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/generators">see them in action</a>.<br /> <br /> <b>Web Animation Playback Control</b><br /> <br /> <a href="http://updates.html5rocks.com/2014/05/Web-Animations---element-animate-is-now-in-Chrome-36">Web Animations</a> is a powerful new API that unifies all of the animation APIs on the web. We shipped basic support in May with Chrome 36. In this release we've added playback control, with methods such as <span style="font-family: Courier New, Courier, monospace;">play()</span>, <span style="font-family: Courier New, Courier, monospace;">pause()</span>, and <span style="font-family: Courier New, Courier, monospace;">reverse()</span>, and the ability to jump to a specific point in an animation's timeline. With our initial support, developers could create animations but not precisely control their playback. This next iteration enables <a href="http://web-animations.github.io/web-animations-demos/#playback-control">animations that can react in real time to user input</a> - as well as a variety of other creative uses.<br /> <br /> <b>Web Application Manifest</b><br /> <br /> Previously when developers wanted to allow their web applications to be added to the home screen from Chrome for Android, they had to use a variety of <span style="font-family: Courier New, Courier, monospace;"><meta></span> and <span style="font-family: Courier New, Courier, monospace;"><link></span> tags to trigger this behavior and deliver relevant resources such as icons. Having this embedded in every page was not only repetitive, but was a waste of bandwidth and put <a href="https://www.youtube.com/watch?v=YV1nKLWoARQ">extra bits on the critical path</a>.<br /> <br /> Starting in Chrome 39, <a href="http://w3c.github.io/manifest/">Manifests</a> provide a way to wrap metadata about a web application into a single file, reducing duplication. Developers seeking to enable "<a href="https://developer.chrome.com/multidevice/android/installtohomescreen">add to homescreen</a>" can define a title, landing page, default orientation, and different icons depending on size and screen density. You can <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/web-application-manifest">see how it works today</a>, but stay tuned for more properties to be added in later releases.<br /> <br /> <b>Other updates in this release</b><br /> <ul> <li>The <a href="http://updates.html5rocks.com/2014/10/Send-beacon-data-in-Chrome-39">Beacon API</a> enables developers to queue asynchronous network requests that will be sent, regardless of whether the user navigates to a new page</li> <li>Scroll offsets (<span style="font-family: Courier New, Courier, monospace;">scrollTop</span>, <span style="font-family: Courier New, Courier, monospace;">scrollLeft</span>) now return high-precision fractional values in preparation for high-DPI support</li> <li>XMLHttpRequest progress event properties <span style="font-family: Courier New, Courier, monospace;">position</span> and <span style="font-family: Courier New, Courier, monospace;">totalSize</span> are now deprecated in favor of the <span style="font-family: Courier New, Courier, monospace;">loaded</span> and <span style="font-family: Courier New, Courier, monospace;">total</span> properties</li> </ul> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates.<br /> <br /> Posted by Mounir Lamouri, the Manifestation of a Software Engineer <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Chrome 39 Beta: JS Generators, Animation Playback Control, and the WebApp Manifest&url=https://blog.chromium.org/2014/10/chrome-39-beta-js-generators-animation.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/10/chrome-39-beta-js-generators-animation.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/10/chrome-39-beta-js-generators-animation.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://blog.chromium.org/search/label/beta' rel='tag'> beta </a> </span> </div> </div> </div> <div class='post' data-id='8856012203310564434' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/09/fewer-bugs-mo-money.html' itemprop='url' title='Fewer bugs, mo’ money'> Fewer bugs, mo’ money </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, September 30, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <i>[Cross-posted on the <a href="http://googleonlinesecurity.blogspot.com/2014/09/fewer-bugs-mo-money.html">Google Online Security Blog</a>]</i><br /> <br /> We work hard to keep you safe online. In Chrome, for instance, we warn users against malware and phishing and offer rewards for finding security bugs. Due in part to our collaboration with the research community, we’ve squashed more than 700 Chrome security bugs and have rewarded more than $1.25 million through our <a href="https://www.google.com/about/appsecurity/chrome-rewards/index.html">bug reward program</a>. But as Chrome has become more <a href="https://www.google.com/chrome/browser/features.html#security">secure</a>, it’s gotten even harder to find and exploit security bugs.<br /> <br /> This is a good problem to have! In recognition of the extra effort it takes to uncover vulnerabilities in Chrome, we’re increasing our reward levels. We’re also making some changes to be more transparent with researchers reporting a bug.<br /> <br /> First, we’re increasing our usual reward pricing range to $500-$15,000 per bug, up from a previous published maximum of $5,000. This is accompanied with <a href="https://www.google.com/about/appsecurity/chrome-rewards/index.html#rewards">a clear breakdown of likely reward amounts</a> by bug type. As always, we reserve the right to reward above these levels for particularly great reports. (For example, <a href="http://googlechromereleases.blogspot.com/2014/09/stable-channel-update-for-chrome-os.html">last month</a> we awarded $30,000 for a very impressive report.)<br /> <br /> Second, we’ll pay at the higher end of the range when researchers can provide an exploit to demonstrate a specific attack path against our users. Researchers now have an option to submit the vulnerability first and follow up with an exploit later. We believe that this a win-win situation for security and researchers: we get to patch bugs earlier and our contributors get to lay claim to the bugs sooner, lowering the chances of submitting a duplicate report.<br /> <br /> Third, Chrome reward recipients will be listed in the <a href="https://www.google.com/about/appsecurity/hall-of-fame/reward/">Google Hall of Fame</a>, so you’ve got something to print out and hang on the fridge.<br /> <br /> As a special treat, we’re going to back-pay valid submissions from July 1, 2014 at the increased reward levels we’re announcing today. Good times.<br /> <br /> We’ve also <a href="https://www.google.com/about/appsecurity/chrome-rewards/index.html#faq">answered some new FAQs</a> on our rules page, including questions about our new Trusted Researcher program and a bit about our philosophy and alternative markets for zero-day bugs.<br /> <br /> Happy bug hunting!<br /> <br /> Posted by Tim Willis, Hacker Philanthropist, Chrome Security Team <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <i>[Cross-posted on the <a href="http://googleonlinesecurity.blogspot.com/2014/09/fewer-bugs-mo-money.html">Google Online Security Blog</a>]</i><br /> <br /> We work hard to keep you safe online. In Chrome, for instance, we warn users against malware and phishing and offer rewards for finding security bugs. Due in part to our collaboration with the research community, we’ve squashed more than 700 Chrome security bugs and have rewarded more than $1.25 million through our <a href="https://www.google.com/about/appsecurity/chrome-rewards/index.html">bug reward program</a>. But as Chrome has become more <a href="https://www.google.com/chrome/browser/features.html#security">secure</a>, it’s gotten even harder to find and exploit security bugs.<br /> <br /> This is a good problem to have! In recognition of the extra effort it takes to uncover vulnerabilities in Chrome, we’re increasing our reward levels. We’re also making some changes to be more transparent with researchers reporting a bug.<br /> <br /> First, we’re increasing our usual reward pricing range to $500-$15,000 per bug, up from a previous published maximum of $5,000. This is accompanied with <a href="https://www.google.com/about/appsecurity/chrome-rewards/index.html#rewards">a clear breakdown of likely reward amounts</a> by bug type. As always, we reserve the right to reward above these levels for particularly great reports. (For example, <a href="http://googlechromereleases.blogspot.com/2014/09/stable-channel-update-for-chrome-os.html">last month</a> we awarded $30,000 for a very impressive report.)<br /> <br /> Second, we’ll pay at the higher end of the range when researchers can provide an exploit to demonstrate a specific attack path against our users. Researchers now have an option to submit the vulnerability first and follow up with an exploit later. We believe that this a win-win situation for security and researchers: we get to patch bugs earlier and our contributors get to lay claim to the bugs sooner, lowering the chances of submitting a duplicate report.<br /> <br /> Third, Chrome reward recipients will be listed in the <a href="https://www.google.com/about/appsecurity/hall-of-fame/reward/">Google Hall of Fame</a>, so you’ve got something to print out and hang on the fridge.<br /> <br /> As a special treat, we’re going to back-pay valid submissions from July 1, 2014 at the increased reward levels we’re announcing today. Good times.<br /> <br /> We’ve also <a href="https://www.google.com/about/appsecurity/chrome-rewards/index.html#faq">answered some new FAQs</a> on our rules page, including questions about our new Trusted Researcher program and a bit about our philosophy and alternative markets for zero-day bugs.<br /> <br /> Happy bug hunting!<br /> <br /> Posted by Tim Willis, Hacker Philanthropist, Chrome Security Team <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Fewer bugs, mo’ money&url=https://blog.chromium.org/2014/09/fewer-bugs-mo-money.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/09/fewer-bugs-mo-money.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/09/fewer-bugs-mo-money.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://blog.chromium.org/search/label/security' rel='tag'> security </a> </span> </div> </div> </div> <div class='post' data-id='7075920004393245476' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/09/now-with-faster-dev-workflow-and-modern.html' itemprop='url' title='Chrome Apps for Mobile: Now with a faster dev workflow and a modern WebView'> Chrome Apps for Mobile: Now with a faster dev workflow and a modern WebView </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, September 22, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> In January, we <a href="http://blog.chromium.org/2014/01/run-chrome-apps-on-mobile-using-apache.html">told you</a> about Chrome Apps for Mobile, a project based on Apache Cordova to run your <a href="https://developer.chrome.com/apps/about_apps">Chrome Apps</a> on both Android and iOS. The project provides a native application wrapper around your Chrome App, allowing you to distribute it via the Google Play Store and the Apple App Store. Cordova plugins give your App access to a wide range of APIs, including many of the core Chrome APIs. The newest version of Chrome Apps for Mobile includes Chrome APIs for <a href="https://developer.chrome.com/apps/identity">identity</a>, Google Cloud Messaging (<a href="https://developer.chrome.com/apps/gcm">GCM</a>) and <a href="https://developer.chrome.com/apps/notifications">rich notifications</a>, as well as an improved developer workflow and modern WebView capabilities extended to older versions of Android.<br /> <br /> The developer workflow for Chrome Apps for Mobile is now significantly faster and simpler with the new live deploy feature. With live deploy, you can instantly preview the Chrome App you’re editing, running right on your Android or iOS device. When you make a change to the code, you will be able to see it straight away. Live deploy is available in both <a href="https://github.com/dart-lang/chromedeveditor">Chrome Dev Editor</a> (CDE) and the <a href="https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/README.md#the-cca-command-line-tool">Chrome Apps for Mobile command line tool</a>.<br /> <br /> Chrome Apps are at their best when they leverage the powerful functionality and performance of the latest Chromium WebView. The introduction of an updated WebView into Android KitKat paved the way for advanced features such as WebRTC, WebAudio and Accelerated 2D Canvas, and we will continue to see improvements with each new Android release. However, now you have a way to leverage the latest Chromium WebView on any device running Android versions back to Ice Cream Sandwich by bundling your Chrome App with an embeddable Chromium WebView, provided by the <a href="https://crosswalk-project.org/">Crosswalk</a> open source project.<br /> <br /> To show Crosswalk in action, we have taken the <a href="http://www.polymer-project.org/apps/topeka/">Topeka Polymer Web App</a> released at I/O and packaged it as a Chrome App for Mobile, available for you to <a href="https://play.google.com/store/apps/details?id=com.chromecordova.Topeka">try out on Android</a>.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNjRpcl3_ZbIgoQONKfzy_1H3f1jdSg8MbJYlSooxsgls9KIU0P6oV8rZ98MNLsascNSdaTIiFR0MvHKeBZEohZRzXxGTGmdNWMiqAiPuKOYw8EE_t_sQzsRzANcS_sQAyFMyKLoNs_Y3V/s1600/topeka_framed_screenshots.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNjRpcl3_ZbIgoQONKfzy_1H3f1jdSg8MbJYlSooxsgls9KIU0P6oV8rZ98MNLsascNSdaTIiFR0MvHKeBZEohZRzXxGTGmdNWMiqAiPuKOYw8EE_t_sQzsRzANcS_sQAyFMyKLoNs_Y3V/s1600/topeka_framed_screenshots.png" width="320" /></a> </div> <br /> The Topeka Android app uses an embedded Crosswalk WebView to achieve smooth performance even on older versions of Android, enabling a full fidelity material design UI with fluid animations and no polyfills. Crosswalk is now readily available through the Chrome Apps for Mobile tooling and should be used with an understanding of its <a href="https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/docs/Crosswalk.md">advantages and tradeoffs</a>.<br /> <br /> Using Chrome Apps, you can now build performant and capable applications that target desktop, Android, and iOS devices. To get started, take a look at our <a href="https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/README.md">documentation</a>. As always, we welcome your feedback on <a href="http://stackoverflow.com/questions/tagged/google-chrome-app">Stack Overflow</a> and our <a href="https://plus.sandbox.google.com/+GoogleChromeDevelopers/posts">G+ Developers</a> page.<br /> <br /> Posted by Michal Mocny, Chrome Apps for Mobile Engineer and Mobile Magic Maker<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> In January, we <a href="http://blog.chromium.org/2014/01/run-chrome-apps-on-mobile-using-apache.html">told you</a> about Chrome Apps for Mobile, a project based on Apache Cordova to run your <a href="https://developer.chrome.com/apps/about_apps">Chrome Apps</a> on both Android and iOS. The project provides a native application wrapper around your Chrome App, allowing you to distribute it via the Google Play Store and the Apple App Store. Cordova plugins give your App access to a wide range of APIs, including many of the core Chrome APIs. The newest version of Chrome Apps for Mobile includes Chrome APIs for <a href="https://developer.chrome.com/apps/identity">identity</a>, Google Cloud Messaging (<a href="https://developer.chrome.com/apps/gcm">GCM</a>) and <a href="https://developer.chrome.com/apps/notifications">rich notifications</a>, as well as an improved developer workflow and modern WebView capabilities extended to older versions of Android.<br /> <br /> The developer workflow for Chrome Apps for Mobile is now significantly faster and simpler with the new live deploy feature. With live deploy, you can instantly preview the Chrome App you’re editing, running right on your Android or iOS device. When you make a change to the code, you will be able to see it straight away. Live deploy is available in both <a href="https://github.com/dart-lang/chromedeveditor">Chrome Dev Editor</a> (CDE) and the <a href="https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/README.md#the-cca-command-line-tool">Chrome Apps for Mobile command line tool</a>.<br /> <br /> Chrome Apps are at their best when they leverage the powerful functionality and performance of the latest Chromium WebView. The introduction of an updated WebView into Android KitKat paved the way for advanced features such as WebRTC, WebAudio and Accelerated 2D Canvas, and we will continue to see improvements with each new Android release. However, now you have a way to leverage the latest Chromium WebView on any device running Android versions back to Ice Cream Sandwich by bundling your Chrome App with an embeddable Chromium WebView, provided by the <a href="https://crosswalk-project.org/">Crosswalk</a> open source project.<br /> <br /> To show Crosswalk in action, we have taken the <a href="http://www.polymer-project.org/apps/topeka/">Topeka Polymer Web App</a> released at I/O and packaged it as a Chrome App for Mobile, available for you to <a href="https://play.google.com/store/apps/details?id=com.chromecordova.Topeka">try out on Android</a>.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNjRpcl3_ZbIgoQONKfzy_1H3f1jdSg8MbJYlSooxsgls9KIU0P6oV8rZ98MNLsascNSdaTIiFR0MvHKeBZEohZRzXxGTGmdNWMiqAiPuKOYw8EE_t_sQzsRzANcS_sQAyFMyKLoNs_Y3V/s1600/topeka_framed_screenshots.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNjRpcl3_ZbIgoQONKfzy_1H3f1jdSg8MbJYlSooxsgls9KIU0P6oV8rZ98MNLsascNSdaTIiFR0MvHKeBZEohZRzXxGTGmdNWMiqAiPuKOYw8EE_t_sQzsRzANcS_sQAyFMyKLoNs_Y3V/s1600/topeka_framed_screenshots.png" width="320" /></a> </div> <br /> The Topeka Android app uses an embedded Crosswalk WebView to achieve smooth performance even on older versions of Android, enabling a full fidelity material design UI with fluid animations and no polyfills. Crosswalk is now readily available through the Chrome Apps for Mobile tooling and should be used with an understanding of its <a href="https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/docs/Crosswalk.md">advantages and tradeoffs</a>.<br /> <br /> Using Chrome Apps, you can now build performant and capable applications that target desktop, Android, and iOS devices. To get started, take a look at our <a href="https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/README.md">documentation</a>. As always, we welcome your feedback on <a href="http://stackoverflow.com/questions/tagged/google-chrome-app">Stack Overflow</a> and our <a href="https://plus.sandbox.google.com/+GoogleChromeDevelopers/posts">G+ Developers</a> page.<br /> <br /> Posted by Michal Mocny, Chrome Apps for Mobile Engineer and Mobile Magic Maker<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Chrome Apps for Mobile: Now with a faster dev workflow and a modern WebView&url=https://blog.chromium.org/2014/09/now-with-faster-dev-workflow-and-modern.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/09/now-with-faster-dev-workflow-and-modern.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/09/now-with-faster-dev-workflow-and-modern.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='8758681746506536228' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/09/responsive-web-design-with-devtools.html' itemprop='url' title='Responsive Web Design with DevTools' Device Mode'> Responsive Web Design with DevTools' Device Mode </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, September 8, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> We all develop websites on our desktop and laptop machines, so we tend to initially develop for the desktop experience. But that's increasingly out of sync with our users who, more and more, consume the web on mobile. To deliver a great experience for the web, we need to accurately experience it on mobile. Chrome DevTools has had <a href="http://blog.chromium.org/2013/12/chrome-devtools-for-mobile-emulate-and.html">mobile emulation features</a> for awhile, but it's still too disconnected from real device conditions and requires too much trial and error. Chrome 38 Beta includes a new Device Mode that puts you one click away from emulating mobile devices, inspecting media queries, and emulating flaky network conditions.<br /> <div> <br /></div> <img height="298" src="https://lh4.googleusercontent.com/4b3wtiPPA3gI047qFZhIvExz_wsx8jPCAOq76gdSaRPjneauDj0lSBAZYCHagY2KoWnm6LlERIiql4chkVp1Koa5RnX-s2iWwhJ7fZZJXah4fSaG4W980J_9j48k643_Og" width="400" /><br /> <div> <br /></div> <div> Now, you can turn on Device Mode right next to the "inspect element" icon. Once enabled, it automatically emulates a mobile viewport, along with complete emulation of touch events. You can test various viewport sizes easily with the large drag handles instead of resizing the whole browser window. You can select from popular device presets to automatically set viewport, touch, user agent and screen density settings in one fell swoop.<br /> <br /> <div style="text-align: left;"> <span id="docs-internal-guid-5a6c041e-5904-9083-ce9a-296943096464"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><img alt="2014-09-06 20_47_44.gif" height="298px;" src="https://lh6.googleusercontent.com/pPhQpB1Wi7qg1DUwFdQKfGzvERVY5FFC7LIFZUOTUtp1tgF0B-Fyx9S0OIcnEc0zIo9-4pxrb4GQ6SdW7BNPoOsLvvqRAOWJC_hZE2uXjFNHNJVfTPb2ESYRftRszmeITg" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="532px;" /></span></span></div> <br /></div> Every media query gets represented visually, so you can correlate your breakpoints with the viewport. Clicking one resizes the viewport, making it easier to iterate on your associated styles. If you want to edit the media queries themselves, right-click and jump to the line of CSS where it's defined.<br /> <br /> Lastly, device emulation needs to accurately represent the connectivity of your mobile users. For example, a 3G connection significantly limits the experience of your website compared to your speedy office WiFi. The DevTools can now help you emulate the network conditions (both throughput and latency) of connectivity like EDGE, 3G, 4G – and even go offline.<br /> <div> <br /> <div> <span id="docs-internal-guid-f3147fc5-56dc-1bb9-0c5b-da5e05d30f2d"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><img alt="Screen Shot 2014-08-22 at 3.44.13 PM.png" height="175px;" src="https://lh3.googleusercontent.com/F6N_eHcZjzyYU0zkSJ_xZrBblfd1v_HnFoE5hemUMcvnC7J2SvaLERmhWMuT3YJ1Y6flkavmTEly1vopBwsSlmuaVZdLw-gOaASRlADJdtEzgxnXGSNIK34m8fivijAjgg" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="305px;" /></span></span><br /> While typical system-wide network conditioning throttles everything, DevTools will only throttle the current tab. This enables you to take your app offline and try out AppCache and Service Worker scenarios, and meanwhile browse documentation in another tab.</div> <div> <div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"> <span id="docs-internal-guid-f3147fc5-56db-714f-1be3-be79ebc29f79"><br /></span> <span id="docs-internal-guid-f3147fc5-56db-714f-1be3-be79ebc29f79">Please try out Device Mode your development workflow and let us know what you think. And if you're hungry for more DevTools goodness, check out my <a href="https://www.youtube.com/watch?v=t1PxmN_QNFI">Google I/O 2014 talk: Developing Across Devices</a>.</span><br /> <br /></div> <div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"> <span id="docs-internal-guid-f3147fc5-56db-714f-1be3-be79ebc29f79">Posted by Paul Bakaus, Developer Advocate and Device Diviner</span></div> <span id="docs-internal-guid-f3147fc5-56db-714f-1be3-be79ebc29f79"> </span></div> </div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> We all develop websites on our desktop and laptop machines, so we tend to initially develop for the desktop experience. But that's increasingly out of sync with our users who, more and more, consume the web on mobile. To deliver a great experience for the web, we need to accurately experience it on mobile. Chrome DevTools has had <a href="http://blog.chromium.org/2013/12/chrome-devtools-for-mobile-emulate-and.html">mobile emulation features</a> for awhile, but it's still too disconnected from real device conditions and requires too much trial and error. Chrome 38 Beta includes a new Device Mode that puts you one click away from emulating mobile devices, inspecting media queries, and emulating flaky network conditions.<br /> <div> <br /></div> <img height="298" src="https://lh4.googleusercontent.com/4b3wtiPPA3gI047qFZhIvExz_wsx8jPCAOq76gdSaRPjneauDj0lSBAZYCHagY2KoWnm6LlERIiql4chkVp1Koa5RnX-s2iWwhJ7fZZJXah4fSaG4W980J_9j48k643_Og" width="400" /><br /> <div> <br /></div> <div> Now, you can turn on Device Mode right next to the "inspect element" icon. Once enabled, it automatically emulates a mobile viewport, along with complete emulation of touch events. You can test various viewport sizes easily with the large drag handles instead of resizing the whole browser window. You can select from popular device presets to automatically set viewport, touch, user agent and screen density settings in one fell swoop.<br /> <br /> <div style="text-align: left;"> <span id="docs-internal-guid-5a6c041e-5904-9083-ce9a-296943096464"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><img alt="2014-09-06 20_47_44.gif" height="298px;" src="https://lh6.googleusercontent.com/pPhQpB1Wi7qg1DUwFdQKfGzvERVY5FFC7LIFZUOTUtp1tgF0B-Fyx9S0OIcnEc0zIo9-4pxrb4GQ6SdW7BNPoOsLvvqRAOWJC_hZE2uXjFNHNJVfTPb2ESYRftRszmeITg" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="532px;" /></span></span></div> <br /></div> Every media query gets represented visually, so you can correlate your breakpoints with the viewport. Clicking one resizes the viewport, making it easier to iterate on your associated styles. If you want to edit the media queries themselves, right-click and jump to the line of CSS where it's defined.<br /> <br /> Lastly, device emulation needs to accurately represent the connectivity of your mobile users. For example, a 3G connection significantly limits the experience of your website compared to your speedy office WiFi. The DevTools can now help you emulate the network conditions (both throughput and latency) of connectivity like EDGE, 3G, 4G – and even go offline.<br /> <div> <br /> <div> <span id="docs-internal-guid-f3147fc5-56dc-1bb9-0c5b-da5e05d30f2d"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><img alt="Screen Shot 2014-08-22 at 3.44.13 PM.png" height="175px;" src="https://lh3.googleusercontent.com/F6N_eHcZjzyYU0zkSJ_xZrBblfd1v_HnFoE5hemUMcvnC7J2SvaLERmhWMuT3YJ1Y6flkavmTEly1vopBwsSlmuaVZdLw-gOaASRlADJdtEzgxnXGSNIK34m8fivijAjgg" style="-webkit-transform: rotate(0.00rad); border: none; transform: rotate(0.00rad);" width="305px;" /></span></span><br /> While typical system-wide network conditioning throttles everything, DevTools will only throttle the current tab. This enables you to take your app offline and try out AppCache and Service Worker scenarios, and meanwhile browse documentation in another tab.</div> <div> <div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"> <span id="docs-internal-guid-f3147fc5-56db-714f-1be3-be79ebc29f79"><br /></span> <span id="docs-internal-guid-f3147fc5-56db-714f-1be3-be79ebc29f79">Please try out Device Mode your development workflow and let us know what you think. And if you're hungry for more DevTools goodness, check out my <a href="https://www.youtube.com/watch?v=t1PxmN_QNFI">Google I/O 2014 talk: Developing Across Devices</a>.</span><br /> <br /></div> <div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;"> <span id="docs-internal-guid-f3147fc5-56db-714f-1be3-be79ebc29f79">Posted by Paul Bakaus, Developer Advocate and Device Diviner</span></div> <span id="docs-internal-guid-f3147fc5-56db-714f-1be3-be79ebc29f79"> </span></div> </div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Responsive Web Design with DevTools' Device Mode&url=https://blog.chromium.org/2014/09/responsive-web-design-with-devtools.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/09/responsive-web-design-with-devtools.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/09/responsive-web-design-with-devtools.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='7152958049509404537' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/09/gradually-sunsetting-sha-1.html' itemprop='url' title='Gradually Sunsetting SHA-1'> Gradually Sunsetting SHA-1 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Friday, September 5, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> The SHA-1 cryptographic hash algorithm has been known to be considerably weaker than it was designed to be <a href="https://www.schneier.com/blog/archives/2005/02/cryptanalysis_o.html">since at least 2005</a> — 9 years ago. <a href="https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html">Collision attacks against SHA-1 are too affordable</a> for us to consider it safe for the public web PKI. We can only expect that attacks will get cheaper.<br /> <br /> That’s why Chrome will start the process of sunsetting SHA-1 (as used in certificate signatures for HTTPS) with Chrome 39 in November. HTTPS sites whose certificate chains use SHA-1 and are valid past 1 January 2017 will no longer appear to be fully trustworthy in Chrome’s user interface.<br /> <br /> SHA-1's use on the Internet has been deprecated since 2011, when the CA/Browser Forum, an industry group of leading web browsers and certificate authorities (CAs) working together to establish basic security requirements for SSL certificates, published their <a href="https://cabforum.org/baseline-requirements-documents/">Baseline Requirements for SSL</a>. These Requirements recommended that all CAs transition away from SHA-1 as soon as possible, and followed similar events in other industries and sectors, such as <a href="http://www.nist.gov/">NIST</a> deprecating SHA-1 for government use in 2010.<br /> <br /> We have seen this type of weakness turn into a practical attack before, with the MD5 hash algorithm. We need to ensure that by the time an attack against SHA-1 is demonstrated publicly, the web has already moved away from it. Unfortunately, this can be quite challenging. For example, when Chrome disabled MD5, a number of enterprises, schools, and small businesses were affected when their proxy software — from <a href="https://code.google.com/p/chromium/issues/detail?id=120715">leading vendors</a> — continued to use the insecure algorithms, and were left <a href="https://code.google.com/p/chromium/issues/detail?id=107845">scrambling for updates</a>. Users who used personal firewall software were also affected.<br /> <br /> We plan to surface, in the HTTPS security indicator in Chrome, the fact that SHA-1 does not meet its design guarantee. We are taking a measured approach, gradually ratcheting down the security indicator and gradually moving the timetable up (keep in mind that we release stable versions of Chrome about 6 – 8 weeks after their branch point):<br /> <br /> <b>Chrome 39 (Branch point 26 September 2014)</b><br /> <b><br /></b> Sites with end-entity (“leaf”) certificates that expire on or after 1 January 2017, and which include a SHA-1-based signature as part of the certificate chain, will be treated as “secure, but with minor errors”.<br /> <br /> The current visual display for “secure, but with minor errors” is a lock with a yellow triangle, and is <a href="https://support.google.com/chrome/answer/95617?hl=en">used to highlight other deprecated and insecure practices</a>, such as passive mixed content.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY4xZlsUjvSb7DVgHiFnF0OlCaXuI3xLfdBK9hGcVMw25pJbw8KyqlpuonbVGIo8xiy7iOI-1qPcx5jkym_p6H81HUN-M8tjRP8ETWXXg0SGG2_g1U-z33-TROLy7_q1FtMaJnB5CFrJs_/s1600/yellow-triangle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY4xZlsUjvSb7DVgHiFnF0OlCaXuI3xLfdBK9hGcVMw25pJbw8KyqlpuonbVGIo8xiy7iOI-1qPcx5jkym_p6H81HUN-M8tjRP8ETWXXg0SGG2_g1U-z33-TROLy7_q1FtMaJnB5CFrJs_/s1600/yellow-triangle.png" /></a></div> <br /> <br /> <b>Chrome 40 (Branch point 7 November 2014; Stable after holiday season)</b><br /> <br /> Sites with end-entity certificates that expire between 1 June 2016 to 31 December 2016 (inclusive), and which include a SHA-1-based signature as part of the certificate chain, will be treated as “secure, but with minor errors”.<br /> <br /> Sites with end-entity certificates that expire on or after 1 January 2017, and which include a SHA-1-based signature as part of the certificate chain, will be treated as “neutral, lacking security”.<br /> <br /> The current visual display for “neutral, lacking security” is a blank page icon, and is used in other situations, such as HTTP.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL63wPKi7Pfv72n2IvZXDbOlHDBA8NPz8-YK-Y1SN1hkpKpS7R9ljeXhzaAcYu6-9KjFAtc3nQq99OGyUkP4VE7P0nhoVgvAOztlbgu6E84EOm9vmsRQyVRI75z4hDP7o4zs3rGs-iH8Mu/s1600/Screen+Shot+2014-09-05+at+12.05.52+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL63wPKi7Pfv72n2IvZXDbOlHDBA8NPz8-YK-Y1SN1hkpKpS7R9ljeXhzaAcYu6-9KjFAtc3nQq99OGyUkP4VE7P0nhoVgvAOztlbgu6E84EOm9vmsRQyVRI75z4hDP7o4zs3rGs-iH8Mu/s1600/Screen+Shot+2014-09-05+at+12.05.52+PM.png" /></a></div> <br /> <br /> <b>Chrome 41 (Branch point in Q1 2015)</b><br /> <br /> Sites with end-entity certificates that expire between 1 January 2016 and 31 December 2016 (inclusive), and which include a SHA-1-based signature as part of the certificate chain, will be treated as “secure, but with minor errors”.<br /> <br /> Sites with end-entity certificates that expire on or after 1 January 2017, and which include a SHA-1-based signature as part of the certificate chain, will be treated as “affirmatively insecure”. Subresources from such domain will be treated as “active mixed content”.<br /> <br /> The current visual display for “affirmatively insecure” is a lock with a red X, and a red strike-through text treatment in the URL scheme.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv-yJWfMzTaBa787MygXimwLXF-eYcWXmXjV_ExYTpEHEXfFW_fQH32F7hmYensIKaWF7OQkkQ5YwvAiTl0Kmltto7EkSNBSkymCEWspt3P1eV-HXn1jSF2_8cY9Fvdk8FVh9FwvHltMy-/s1600/Screen+Shot+2014-08-29+at+1.26.59+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv-yJWfMzTaBa787MygXimwLXF-eYcWXmXjV_ExYTpEHEXfFW_fQH32F7hmYensIKaWF7OQkkQ5YwvAiTl0Kmltto7EkSNBSkymCEWspt3P1eV-HXn1jSF2_8cY9Fvdk8FVh9FwvHltMy-/s1600/Screen+Shot+2014-08-29+at+1.26.59+PM.png" /></a></div> <br /> <i><br /></i> <i>Note: SHA-1-based signatures for trusted root certificates are not a problem because TLS clients trust them by their identity, rather than by the signature of their hash.</i><br /> <div> <br /></div> <div> Posted by Chris Palmer, Secure Socket Lover and Ryan Sleevi, Transport Layer Securer</div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> The SHA-1 cryptographic hash algorithm has been known to be considerably weaker than it was designed to be <a href="https://www.schneier.com/blog/archives/2005/02/cryptanalysis_o.html">since at least 2005</a> — 9 years ago. <a href="https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html">Collision attacks against SHA-1 are too affordable</a> for us to consider it safe for the public web PKI. We can only expect that attacks will get cheaper.<br /> <br /> That’s why Chrome will start the process of sunsetting SHA-1 (as used in certificate signatures for HTTPS) with Chrome 39 in November. HTTPS sites whose certificate chains use SHA-1 and are valid past 1 January 2017 will no longer appear to be fully trustworthy in Chrome’s user interface.<br /> <br /> SHA-1's use on the Internet has been deprecated since 2011, when the CA/Browser Forum, an industry group of leading web browsers and certificate authorities (CAs) working together to establish basic security requirements for SSL certificates, published their <a href="https://cabforum.org/baseline-requirements-documents/">Baseline Requirements for SSL</a>. These Requirements recommended that all CAs transition away from SHA-1 as soon as possible, and followed similar events in other industries and sectors, such as <a href="http://www.nist.gov/">NIST</a> deprecating SHA-1 for government use in 2010.<br /> <br /> We have seen this type of weakness turn into a practical attack before, with the MD5 hash algorithm. We need to ensure that by the time an attack against SHA-1 is demonstrated publicly, the web has already moved away from it. Unfortunately, this can be quite challenging. For example, when Chrome disabled MD5, a number of enterprises, schools, and small businesses were affected when their proxy software — from <a href="https://code.google.com/p/chromium/issues/detail?id=120715">leading vendors</a> — continued to use the insecure algorithms, and were left <a href="https://code.google.com/p/chromium/issues/detail?id=107845">scrambling for updates</a>. Users who used personal firewall software were also affected.<br /> <br /> We plan to surface, in the HTTPS security indicator in Chrome, the fact that SHA-1 does not meet its design guarantee. We are taking a measured approach, gradually ratcheting down the security indicator and gradually moving the timetable up (keep in mind that we release stable versions of Chrome about 6 – 8 weeks after their branch point):<br /> <br /> <b>Chrome 39 (Branch point 26 September 2014)</b><br /> <b><br /></b> Sites with end-entity (“leaf”) certificates that expire on or after 1 January 2017, and which include a SHA-1-based signature as part of the certificate chain, will be treated as “secure, but with minor errors”.<br /> <br /> The current visual display for “secure, but with minor errors” is a lock with a yellow triangle, and is <a href="https://support.google.com/chrome/answer/95617?hl=en">used to highlight other deprecated and insecure practices</a>, such as passive mixed content.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY4xZlsUjvSb7DVgHiFnF0OlCaXuI3xLfdBK9hGcVMw25pJbw8KyqlpuonbVGIo8xiy7iOI-1qPcx5jkym_p6H81HUN-M8tjRP8ETWXXg0SGG2_g1U-z33-TROLy7_q1FtMaJnB5CFrJs_/s1600/yellow-triangle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY4xZlsUjvSb7DVgHiFnF0OlCaXuI3xLfdBK9hGcVMw25pJbw8KyqlpuonbVGIo8xiy7iOI-1qPcx5jkym_p6H81HUN-M8tjRP8ETWXXg0SGG2_g1U-z33-TROLy7_q1FtMaJnB5CFrJs_/s1600/yellow-triangle.png" /></a></div> <br /> <br /> <b>Chrome 40 (Branch point 7 November 2014; Stable after holiday season)</b><br /> <br /> Sites with end-entity certificates that expire between 1 June 2016 to 31 December 2016 (inclusive), and which include a SHA-1-based signature as part of the certificate chain, will be treated as “secure, but with minor errors”.<br /> <br /> Sites with end-entity certificates that expire on or after 1 January 2017, and which include a SHA-1-based signature as part of the certificate chain, will be treated as “neutral, lacking security”.<br /> <br /> The current visual display for “neutral, lacking security” is a blank page icon, and is used in other situations, such as HTTP.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL63wPKi7Pfv72n2IvZXDbOlHDBA8NPz8-YK-Y1SN1hkpKpS7R9ljeXhzaAcYu6-9KjFAtc3nQq99OGyUkP4VE7P0nhoVgvAOztlbgu6E84EOm9vmsRQyVRI75z4hDP7o4zs3rGs-iH8Mu/s1600/Screen+Shot+2014-09-05+at+12.05.52+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL63wPKi7Pfv72n2IvZXDbOlHDBA8NPz8-YK-Y1SN1hkpKpS7R9ljeXhzaAcYu6-9KjFAtc3nQq99OGyUkP4VE7P0nhoVgvAOztlbgu6E84EOm9vmsRQyVRI75z4hDP7o4zs3rGs-iH8Mu/s1600/Screen+Shot+2014-09-05+at+12.05.52+PM.png" /></a></div> <br /> <br /> <b>Chrome 41 (Branch point in Q1 2015)</b><br /> <br /> Sites with end-entity certificates that expire between 1 January 2016 and 31 December 2016 (inclusive), and which include a SHA-1-based signature as part of the certificate chain, will be treated as “secure, but with minor errors”.<br /> <br /> Sites with end-entity certificates that expire on or after 1 January 2017, and which include a SHA-1-based signature as part of the certificate chain, will be treated as “affirmatively insecure”. Subresources from such domain will be treated as “active mixed content”.<br /> <br /> The current visual display for “affirmatively insecure” is a lock with a red X, and a red strike-through text treatment in the URL scheme.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv-yJWfMzTaBa787MygXimwLXF-eYcWXmXjV_ExYTpEHEXfFW_fQH32F7hmYensIKaWF7OQkkQ5YwvAiTl0Kmltto7EkSNBSkymCEWspt3P1eV-HXn1jSF2_8cY9Fvdk8FVh9FwvHltMy-/s1600/Screen+Shot+2014-08-29+at+1.26.59+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv-yJWfMzTaBa787MygXimwLXF-eYcWXmXjV_ExYTpEHEXfFW_fQH32F7hmYensIKaWF7OQkkQ5YwvAiTl0Kmltto7EkSNBSkymCEWspt3P1eV-HXn1jSF2_8cY9Fvdk8FVh9FwvHltMy-/s1600/Screen+Shot+2014-08-29+at+1.26.59+PM.png" /></a></div> <br /> <i><br /></i> <i>Note: SHA-1-based signatures for trusted root certificates are not a problem because TLS clients trust them by their identity, rather than by the signature of their hash.</i><br /> <div> <br /></div> <div> Posted by Chris Palmer, Secure Socket Lover and Ryan Sleevi, Transport Layer Securer</div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Gradually Sunsetting SHA-1&url=https://blog.chromium.org/2014/09/gradually-sunsetting-sha-1.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/09/gradually-sunsetting-sha-1.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/09/gradually-sunsetting-sha-1.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://blog.chromium.org/search/label/security' rel='tag'> security </a> </span> </div> </div> </div> <div class='post' data-id='718823995280986663' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/09/moving-towards-single-cloud-messaging.html' itemprop='url' title='Moving Towards a Single Cloud Messaging API'> Moving Towards a Single Cloud Messaging API </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, September 3, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> In April we released <a href="http://blog.chromium.org/2014/04/simplifying-cloud-messaging-for-app.html">chrome.gcm</a>, an API that allows Chrome apps and extensions to use the <a href="http://developer.android.com/google/gcm/index.html">Google Cloud Messaging</a> (GCM) service to interact with their server-side components via push messaging. Since the new API offers significant improvements and has been used for push messaging in Chrome apps and extensions since May 2014, we are now deprecating the legacy <a href="https://developer.chrome.com/extensions/pushMessaging">chrome.pushMessaging</a> API.<br /> <br /> Developers will start to see a deprecation message in the console if they use chrome.pushMessaging, and no new Chrome apps and extensions will be accepted to the Chrome Web Store if they use the deprecated API. Beginning in mid-January 2015, Chrome apps and extensions that continue to use chrome.pushMessaging will be delisted in the Chrome Web Store. When upgraded to use chrome.gcm, these apps will once again be discoverable via searching and browsing the Web Store. In early March, the chrome.pushMessaging API will be removed and all Chrome apps and extensions that continue to reference it will be automatically disabled. They can be enabled once again when upgraded to use chrome.gcm.<br /> <br /> For a high level overview of how an app or extension can leverage chrome.gcm, check out our <a href="https://www.youtube.com/watch?v=g_zkOOWsmco">Google I/O Bytes video</a>. Learn how to upgrade your Chrome apps and extensions by consulting the <a href="https://developer.chrome.com/apps/gcm">chrome.gcm API documentation</a> and following this <a href="https://developer.chrome.com/apps/cloudMessaging">tutorial</a>. Lastly, subscribe to the <a href="https://groups.google.com/forum/#!forum/gcm-for-chrome-feedback">GCM for Chrome Feedback</a> group to ask questions, get help, and learn more about the transition.<br /> <br /> Posted by Jake Leichtling and Filip Gorski, Product Manager and Software Engineer <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> In April we released <a href="http://blog.chromium.org/2014/04/simplifying-cloud-messaging-for-app.html">chrome.gcm</a>, an API that allows Chrome apps and extensions to use the <a href="http://developer.android.com/google/gcm/index.html">Google Cloud Messaging</a> (GCM) service to interact with their server-side components via push messaging. Since the new API offers significant improvements and has been used for push messaging in Chrome apps and extensions since May 2014, we are now deprecating the legacy <a href="https://developer.chrome.com/extensions/pushMessaging">chrome.pushMessaging</a> API.<br /> <br /> Developers will start to see a deprecation message in the console if they use chrome.pushMessaging, and no new Chrome apps and extensions will be accepted to the Chrome Web Store if they use the deprecated API. Beginning in mid-January 2015, Chrome apps and extensions that continue to use chrome.pushMessaging will be delisted in the Chrome Web Store. When upgraded to use chrome.gcm, these apps will once again be discoverable via searching and browsing the Web Store. In early March, the chrome.pushMessaging API will be removed and all Chrome apps and extensions that continue to reference it will be automatically disabled. They can be enabled once again when upgraded to use chrome.gcm.<br /> <br /> For a high level overview of how an app or extension can leverage chrome.gcm, check out our <a href="https://www.youtube.com/watch?v=g_zkOOWsmco">Google I/O Bytes video</a>. Learn how to upgrade your Chrome apps and extensions by consulting the <a href="https://developer.chrome.com/apps/gcm">chrome.gcm API documentation</a> and following this <a href="https://developer.chrome.com/apps/cloudMessaging">tutorial</a>. Lastly, subscribe to the <a href="https://groups.google.com/forum/#!forum/gcm-for-chrome-feedback">GCM for Chrome Feedback</a> group to ask questions, get help, and learn more about the transition.<br /> <br /> Posted by Jake Leichtling and Filip Gorski, Product Manager and Software Engineer <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Moving Towards a Single Cloud Messaging API&url=https://blog.chromium.org/2014/09/moving-towards-single-cloud-messaging.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/09/moving-towards-single-cloud-messaging.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/09/moving-towards-single-cloud-messaging.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='5172300056958057925' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/08/chrome-38-beta-new-primitives-for-next.html' itemprop='url' title='Chrome 38 Beta: New primitives for the next-generation web'> Chrome 38 Beta: New primitives for the next-generation web </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, August 28, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Today’s Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes a ton of new primitives and APIs to simplify development and give developers more control over their web applications. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>New HTML element: <picture></b><br /> <br /> This release adds support for the new <a href="https://developers.google.com/web/fundamentals/media/images/images-in-markup#art-direction-in-responsive-images-with-picture"><picture> element</a> thanks to the hard work of community contributor <a href="http://blog.yoav.ws/">Yoav Weiss</a>, who was able to dedicate his time to implementing this feature in multiple rendering engines because of a <a href="https://www.indiegogo.com/projects/picture-element-implementation-in-blink">successful crowdfunding campaign</a> that raised 50% more than its funding goal.<br /> <br /> The <picture> element takes the concept of <a href="http://www.html5rocks.com/en/mobile/responsivedesign/">responsive design</a>, previously solved by sending duplicate resources to the client, and bakes an elegant solution right into the web platform. It allows developers to list multiple versions of images that may be appropriate for the browser to display based on screen size, pixel density, or other factors.<br /> <div> <br /> <span style="color: #38761d;"><picture><br /> <source media="(min-width: 45em)" srcset="large.jpg"><br /> <source media="(min-width: 32em)" srcset="med.jpg"><br /> <img src="small.jpg" alt="The president giving an award."><br /></picture></span><br /> <br /> <b>New JavaScript features</b><br /> <br /> Chrome 38 also enables by default several new JavaScript language features from the draft <a href="http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts">ECMAScript 6 (ES6) specification</a>. Additions include:<br /> <ul> <li><a href="http://updates.html5rocks.com/2014/08/Collecting-and-Iterating-the-ES6-Way">Maps and sets</a>, two highly-requested data structures which make storing and interacting with data simpler and more rational.</li> <li>Iterators now provide an easy and extensible <a href="http://updates.html5rocks.com/2014/08/Collecting-and-Iterating-the-ES6-Way">way to iterate over sequenced data types</a> such as arrays and strings, as well as the new maps and sets.</li> <li><a href="http://www.chromestatus.com/feature/6042091272536064">Symbols</a>, which help prevent object properties from unintentionally interfering with each other.</li> <li>Math functions such as Math.sign and Math.log10, which prevents developers from having to re-implement these functions and provides the performance boost of built-in functions. Take a look at the <a href="http://www.chromestatus.com/feature/5920790725787648">full list of new functions</a>.</li> </ul> Future releases of Chrome will contain even more ES6 features as the specification matures. Stay posted!<br /> <br /> <b>Other updates in this release</b><br /> <ul> <li>The <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/network-information">Network Information ("NetInfo") API</a> is now enabled, giving web applications access to the current type of network on a device running Android, iOS, or Chrome OS. This could allow an app to only do data-intensive activities such as syncing when connected to a Wi-Fi connection.</li> <li>The addition of the <a href="http://www.chromestatus.com/feature/6191285283061760">Screen Orientation API</a> allows developers to not only detect whether a device is in portrait or landscape mode, but also lock the screen orientation while a user is within that app.</li> <li>The CSS value <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/image-rendering-pixelated">"image-rendering: pixelated"</a> is now supported, which allows scaled images to appear to be composed of very large pixels. Example use cases include high-performance display of zoomed photos in image editing software without large bandwidth or load time costs.</li> <li>The Encoding API enables the encoding and decoding of data from binary streams, such as <a href="http://updates.html5rocks.com/2014/08/Easier-ArrayBuffer---String-conversion-with-the-Encoding-API">converting between a raw ArrayBuffer and a string</a>.</li> <li>The new <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/file-constructor">File interface</a> allows developers to create and interact with File objects in the same way as Blob objects.</li> <li>SVG fonts are no longer supported, except on Windows systems older than Windows 7. Note that while the feature works on those systems, it is considered deprecated.</li> </ul> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates!<br /> <br /> <i>Update January 26th: "image-rendering: pixelated" has been delayed until Chrome 41.</i><br /> <br /> Posted by Andreas Rossberg, Senior Symbolic Software Engineer</div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Today’s Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes a ton of new primitives and APIs to simplify development and give developers more control over their web applications. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>New HTML element: <picture></b><br /> <br /> This release adds support for the new <a href="https://developers.google.com/web/fundamentals/media/images/images-in-markup#art-direction-in-responsive-images-with-picture"><picture> element</a> thanks to the hard work of community contributor <a href="http://blog.yoav.ws/">Yoav Weiss</a>, who was able to dedicate his time to implementing this feature in multiple rendering engines because of a <a href="https://www.indiegogo.com/projects/picture-element-implementation-in-blink">successful crowdfunding campaign</a> that raised 50% more than its funding goal.<br /> <br /> The <picture> element takes the concept of <a href="http://www.html5rocks.com/en/mobile/responsivedesign/">responsive design</a>, previously solved by sending duplicate resources to the client, and bakes an elegant solution right into the web platform. It allows developers to list multiple versions of images that may be appropriate for the browser to display based on screen size, pixel density, or other factors.<br /> <div> <br /> <span style="color: #38761d;"><picture><br /> <source media="(min-width: 45em)" srcset="large.jpg"><br /> <source media="(min-width: 32em)" srcset="med.jpg"><br /> <img src="small.jpg" alt="The president giving an award."><br /></picture></span><br /> <br /> <b>New JavaScript features</b><br /> <br /> Chrome 38 also enables by default several new JavaScript language features from the draft <a href="http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts">ECMAScript 6 (ES6) specification</a>. Additions include:<br /> <ul> <li><a href="http://updates.html5rocks.com/2014/08/Collecting-and-Iterating-the-ES6-Way">Maps and sets</a>, two highly-requested data structures which make storing and interacting with data simpler and more rational.</li> <li>Iterators now provide an easy and extensible <a href="http://updates.html5rocks.com/2014/08/Collecting-and-Iterating-the-ES6-Way">way to iterate over sequenced data types</a> such as arrays and strings, as well as the new maps and sets.</li> <li><a href="http://www.chromestatus.com/feature/6042091272536064">Symbols</a>, which help prevent object properties from unintentionally interfering with each other.</li> <li>Math functions such as Math.sign and Math.log10, which prevents developers from having to re-implement these functions and provides the performance boost of built-in functions. Take a look at the <a href="http://www.chromestatus.com/feature/5920790725787648">full list of new functions</a>.</li> </ul> Future releases of Chrome will contain even more ES6 features as the specification matures. Stay posted!<br /> <br /> <b>Other updates in this release</b><br /> <ul> <li>The <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/network-information">Network Information ("NetInfo") API</a> is now enabled, giving web applications access to the current type of network on a device running Android, iOS, or Chrome OS. This could allow an app to only do data-intensive activities such as syncing when connected to a Wi-Fi connection.</li> <li>The addition of the <a href="http://www.chromestatus.com/feature/6191285283061760">Screen Orientation API</a> allows developers to not only detect whether a device is in portrait or landscape mode, but also lock the screen orientation while a user is within that app.</li> <li>The CSS value <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/image-rendering-pixelated">"image-rendering: pixelated"</a> is now supported, which allows scaled images to appear to be composed of very large pixels. Example use cases include high-performance display of zoomed photos in image editing software without large bandwidth or load time costs.</li> <li>The Encoding API enables the encoding and decoding of data from binary streams, such as <a href="http://updates.html5rocks.com/2014/08/Easier-ArrayBuffer---String-conversion-with-the-Encoding-API">converting between a raw ArrayBuffer and a string</a>.</li> <li>The new <a href="https://github.com/GoogleChrome/samples/tree/gh-pages/file-constructor">File interface</a> allows developers to create and interact with File objects in the same way as Blob objects.</li> <li>SVG fonts are no longer supported, except on Windows systems older than Windows 7. Note that while the feature works on those systems, it is considered deprecated.</li> </ul> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates!<br /> <br /> <i>Update January 26th: "image-rendering: pixelated" has been delayed until Chrome 41.</i><br /> <br /> Posted by Andreas Rossberg, Senior Symbolic Software Engineer</div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Chrome 38 Beta: New primitives for the next-generation web&url=https://blog.chromium.org/2014/08/chrome-38-beta-new-primitives-for-next.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/08/chrome-38-beta-new-primitives-for-next.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/08/chrome-38-beta-new-primitives-for-next.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://blog.chromium.org/search/label/beta' rel='tag'> beta </a> </span> </div> </div> </div> <div class='post' data-id='8155951321583196012' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/08/mac-chrome-when-im-sixty-four-bits.html' itemprop='url' title='Mac Chrome: When I’m Sixty-Four (Bits)'> Mac Chrome: When I’m Sixty-Four (Bits) </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, August 28, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> On the heels of Tuesday’s release of <a href="http://blog.chromium.org/2014/08/64-bits-of-awesome-64-bit-windows_26.html">64-bit Chrome for Windows</a>, all Mac Chrome users on the <a href="https://www.google.com/chrome/browser/beta.html">beta channel</a> will be updated to a new 64-bit version of Chrome 38. Previously, Chrome was a 32-bit app on Macs. While doubling the number of bits won’t make things twice as good, it does allow us to make a number of speed and security improvements.<br /><br />64-bit Chrome has become faster as a result of having access to a superior instruction set, more registers, and a more efficient function calling convention. Improved opportunities for <a href="http://en.wikipedia.org/wiki/Address_space_layout_randomization">ASLR</a> enhance this version’s security. Another major benefit of this change comes from the fact that most programs on a modern Mac are already 64-bit apps. In cases where Chrome was the last remaining 32-bit app, there were launch-time and memory-footprint penalties as 32-bit copies of all of the system libraries needed to be loaded to support Chrome. Now that Chrome’s a 64-bit app too, we expect you’ll find that it launches more quickly and that overall system memory use decreases.<br /><br />Because of this change, Chrome for Mac will no longer support 32-bit <a href="https://developer.chrome.com/extensions/npapi">NPAPI</a> plugins, although their 64-bit counterparts are supported. Users shouldn’t notice any changes, because most major plugins are available in both 32-bit and 64-bit form, and many major websites have been switching from NPAPI towards more modern <a href="http://www.html5rocks.com/">HTML5 APIs</a>. This is also a good time to remind everyone that <a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html">NPAPI support will be removed from Chrome</a> later this year.<br /><br />Nearly every Mac user has a computer capable of running this 64-bit version, so we’re automatically updating all Mac Chrome beta channel users. Those few users with first-generation Intel Macs will miss out on the fun, but as we bid them farewell, we’ll remind them that they’ll still be able to run the latest version on the <a href="https://www.google.com/chrome/browser/">stable channel</a>, <a href="http://googlechromereleases.blogspot.com/2014/08/stable-channel-update_26.html">Chrome 37</a>.<br /><br />You can check to see if the Chrome you’re running is a 64-bit version by checking Chrome’s About page (chrome://help) and looking next to the version number. If it says “64-bit” there, that’s a sure sign that you’re running one of these new builds. We hope that this is the only visible difference that you’ll find between the old 32-bit and new 64-bit versions, but in case you find anything amiss during the beta period, please <a href="https://code.google.com/p/chromium/issues/entry?template=Defect%20on%20Mac%20OS&summary=Mac64%20Feedback&labels=OS-Mac,Arch-x86_64,mac64,Via-ChromiumBlog">let us know</a>.<br /><br />Posted by Mark Mentovai, Software Engineer and Register Doubler <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> On the heels of Tuesday’s release of <a href="http://blog.chromium.org/2014/08/64-bits-of-awesome-64-bit-windows_26.html">64-bit Chrome for Windows</a>, all Mac Chrome users on the <a href="https://www.google.com/chrome/browser/beta.html">beta channel</a> will be updated to a new 64-bit version of Chrome 38. Previously, Chrome was a 32-bit app on Macs. While doubling the number of bits won’t make things twice as good, it does allow us to make a number of speed and security improvements.<br /><br />64-bit Chrome has become faster as a result of having access to a superior instruction set, more registers, and a more efficient function calling convention. Improved opportunities for <a href="http://en.wikipedia.org/wiki/Address_space_layout_randomization">ASLR</a> enhance this version’s security. Another major benefit of this change comes from the fact that most programs on a modern Mac are already 64-bit apps. In cases where Chrome was the last remaining 32-bit app, there were launch-time and memory-footprint penalties as 32-bit copies of all of the system libraries needed to be loaded to support Chrome. Now that Chrome’s a 64-bit app too, we expect you’ll find that it launches more quickly and that overall system memory use decreases.<br /><br />Because of this change, Chrome for Mac will no longer support 32-bit <a href="https://developer.chrome.com/extensions/npapi">NPAPI</a> plugins, although their 64-bit counterparts are supported. Users shouldn’t notice any changes, because most major plugins are available in both 32-bit and 64-bit form, and many major websites have been switching from NPAPI towards more modern <a href="http://www.html5rocks.com/">HTML5 APIs</a>. This is also a good time to remind everyone that <a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html">NPAPI support will be removed from Chrome</a> later this year.<br /><br />Nearly every Mac user has a computer capable of running this 64-bit version, so we’re automatically updating all Mac Chrome beta channel users. Those few users with first-generation Intel Macs will miss out on the fun, but as we bid them farewell, we’ll remind them that they’ll still be able to run the latest version on the <a href="https://www.google.com/chrome/browser/">stable channel</a>, <a href="http://googlechromereleases.blogspot.com/2014/08/stable-channel-update_26.html">Chrome 37</a>.<br /><br />You can check to see if the Chrome you’re running is a 64-bit version by checking Chrome’s About page (chrome://help) and looking next to the version number. If it says “64-bit” there, that’s a sure sign that you’re running one of these new builds. We hope that this is the only visible difference that you’ll find between the old 32-bit and new 64-bit versions, but in case you find anything amiss during the beta period, please <a href="https://code.google.com/p/chromium/issues/entry?template=Defect%20on%20Mac%20OS&summary=Mac64%20Feedback&labels=OS-Mac,Arch-x86_64,mac64,Via-ChromiumBlog">let us know</a>.<br /><br />Posted by Mark Mentovai, Software Engineer and Register Doubler <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Mac Chrome: When I’m Sixty-Four (Bits)&url=https://blog.chromium.org/2014/08/mac-chrome-when-im-sixty-four-bits.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/08/mac-chrome-when-im-sixty-four-bits.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/08/mac-chrome-when-im-sixty-four-bits.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='4952546123381298765' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/08/64-bits-of-awesome-64-bit-windows_26.html' itemprop='url' title='64 bits of awesome: 64-bit Windows Support, now in Stable!'> 64 bits of awesome: 64-bit Windows Support, now in Stable! </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, August 26, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">Today, after a successful experiment with Chrome 64-bit Windows in our Dev and Canary channels in </span><a href="http://blog.chromium.org/2014/06/try-out-new-64-bit-windows-canary-and.html" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">June</span></a><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">, 64-bit Windows support is coming to Chrome Stable with the release of Chrome 37.</span><br /> <span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">64-bit Chrome offers many benefits for speed, stability and security. Our measurements have shown that the native 64-bit version of Chrome has improved speed on many of our graphics and media benchmarks. For example, the VP9 codec that’s used in High Definition YouTube videos shows a 15% improvement in decoding performance. Stability measurements from people opted into our Canary, Dev and Beta 64-bit channels confirm that 64-bit rendering engines are almost twice as stable as 32-bit engines when handling typical web content. Finally, on 64-bit, our </span><a href="http://www.chromium.org/chromium-os/chromiumos-design-docs/security-overview#TOC-Guiding-principles" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">defense in depth</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> security mitigations such as </span><a href="https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/wtf/PartitionAlloc.h&sq=package:chromium&type=cs&l=35" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Partition Alloc</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> are able to far more effectively defend against vulnerabilities that rely on controlling the memory layout of objects.</span><br /> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"><br /></span> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">At this point 64-bit will remain opt-in, so to take advantage of the improvements click on the new “Windows 64-bit” link on the Chrome </span><a href="https://www.google.com/chrome/browser/index.html" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">download page</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">. Currently, the only significant </span><a href="https://support.google.com/chrome/known-issues/15036" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">known issue</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> is the lack of 32-bit NPAPI plugin support. The 32-bit channel will remain fully supported for the foreseeable future and we will continue to support 32-bit plugins until NPAPI is </span><a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">removed</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> from Chrome.</span><br /> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"><br /></span> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">We encourage you to give 64-bit Chrome a try. We’re looking forward to hearing your </span><a href="https://code.google.com/p/chromium/issues/entry?labels=Arch-x86_64,Type-?,Pri-2,OS-Windows&summary=Win64:%20Feedback" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">feedback</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> so we can continue to make Chrome the fastest, most secure and stable browser.</span><br /> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"><br /></span> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">Posted by Will Harris, </span><span style="font-family: Arial; line-height: 1.15; white-space: pre-wrap;">Software Engineer and Embiggener of Bits</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;"> <span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">Today, after a successful experiment with Chrome 64-bit Windows in our Dev and Canary channels in </span><a href="http://blog.chromium.org/2014/06/try-out-new-64-bit-windows-canary-and.html" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">June</span></a><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">, 64-bit Windows support is coming to Chrome Stable with the release of Chrome 37.</span><br /> <span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">64-bit Chrome offers many benefits for speed, stability and security. Our measurements have shown that the native 64-bit version of Chrome has improved speed on many of our graphics and media benchmarks. For example, the VP9 codec that’s used in High Definition YouTube videos shows a 15% improvement in decoding performance. Stability measurements from people opted into our Canary, Dev and Beta 64-bit channels confirm that 64-bit rendering engines are almost twice as stable as 32-bit engines when handling typical web content. Finally, on 64-bit, our </span><a href="http://www.chromium.org/chromium-os/chromiumos-design-docs/security-overview#TOC-Guiding-principles" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">defense in depth</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> security mitigations such as </span><a href="https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/wtf/PartitionAlloc.h&sq=package:chromium&type=cs&l=35" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Partition Alloc</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> are able to far more effectively defend against vulnerabilities that rely on controlling the memory layout of objects.</span><br /> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"><br /></span> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">At this point 64-bit will remain opt-in, so to take advantage of the improvements click on the new “Windows 64-bit” link on the Chrome </span><a href="https://www.google.com/chrome/browser/index.html" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">download page</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">. Currently, the only significant </span><a href="https://support.google.com/chrome/known-issues/15036" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">known issue</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> is the lack of 32-bit NPAPI plugin support. The 32-bit channel will remain fully supported for the foreseeable future and we will continue to support 32-bit plugins until NPAPI is </span><a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">removed</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> from Chrome.</span><br /> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"><br /></span> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">We encourage you to give 64-bit Chrome a try. We’re looking forward to hearing your </span><a href="https://code.google.com/p/chromium/issues/entry?labels=Arch-x86_64,Type-?,Pri-2,OS-Windows&summary=Win64:%20Feedback" style="line-height: 1.15; text-decoration: none;"><span style="color: #1155cc; font-family: Arial; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">feedback</span></a><span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"> so we can continue to make Chrome the fastest, most secure and stable browser.</span><br /> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;"><br /></span> <span style="color: black; font-family: Arial; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">Posted by Will Harris, </span><span style="font-family: Arial; line-height: 1.15; white-space: pre-wrap;">Software Engineer and Embiggener of Bits</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:64 bits of awesome: 64-bit Windows Support, now in Stable!&url=https://blog.chromium.org/2014/08/64-bits-of-awesome-64-bit-windows_26.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/08/64-bits-of-awesome-64-bit-windows_26.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/08/64-bits-of-awesome-64-bit-windows_26.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='7713999958979253754' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/07/chrome-37-beta-directwrite-on-windows.html' itemprop='url' title='Chrome 37 Beta: DirectWrite on Windows and the <dialog> element'> Chrome 37 Beta: DirectWrite on Windows and the <dialog> element </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, July 17, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Today’s <a href="https://www.google.com/landing/chrome/beta/">Chrome Beta</a> channel release includes a slew of new developer features to help you make richer, faster and more compelling web content and apps, especially for mobile devices. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>DirectWrite on Windows</b><br /> <br /> Chrome 37 adds support for <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd368038(v=vs.85).aspx">DirectWrite</a>, an API on Windows for clear, high-quality text rendering even on high DPI displays. Before DirectWrite, Chrome used the Graphics Device Interface (GDI) to render text. GDI dates back to the mid-80's and reflects the engineering tradeoffs of that time, particularly for slower, lower-resolution machines. The switch to DirectWrite has been a <a href="http://crbug.com/25541">top user request for years</a>, and required extensive re-architecting and streamlining of Chrome's font rendering engine.<br /> <br /> Some users should begin seeing better-looking fonts and increased rendering performance as we roll out DirectWrite, with no changes required by web developers. Assuming everything goes smoothly, all users will experience the improvements by the Chrome 37 stable release.<br /> <br /> Compare the below screenshots, taken with and without DirectWrite enabled.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-G4pXHsYSFy41zjnA4viOO9BEHqnv7QNqci9spvg3OKy4iLnyE__u780FV1Hei3XjazH9E0rmtkMWq1q8rIEG7gVjEejwkTVVzwtnCa5ndfiW2N_VT7K138futUkugJHZJXKro2P-hTd3/s1600/directwrite-comparison.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJRqAiT8frHsVHDonz-VuzPm_uUfi51B5-MXsvLLEYV8WnlkDx1BdrE2sezJSFYCMJIp4qMMQbRnr65FmF4RcHC8NiYtUbMVZqews5ymtgE-hLK3MPjz37wi2p1Q0nwNgwKSYeL64iZ5xQ/s1600/Untitled-1.png" /></a><br /> <br /></div> <b>New HTML element: <dialog></b><br /> <br /> In this release we're also adding support for the <a href="http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#the-dialog-element"><dialog> HTML5 element</a>, which enables developers to create styled dialog boxes in their web applications and control them via a JavaScript API. For more details, <a href="http://demo.agektmr.com/dialog/">check out some code samples and see <dialog> in action</a>. The <dialog> element is a better-designed alternative to showModalDialog(), which is now disabled as we <a href="http://blog.chromium.org/2014/07/disabling-showmodaldialog.html">recently announced</a>.<br /> <br /> <b>Other updates in this release</b><br /> <br /> <ul> <li>The <a href="http://www.w3.org/TR/WebCryptoAPI/">Web Cryptography JavaScript API</a> is enabled by default starting in Chrome 37, allowing developers to perform cryptographic operations such as hashing, signature generation/verification, and encryption.</li> <li>Subpixel font scaling is now supported, which enables smooth animations of text between font sizes. </li> <li>TouchEvent co-ordinates are now doubles instead of longs, enabling higher-fidelity touch interactions on high-DPI displays.</li> <li>CSS cursor values <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/cursor">"zoom-in" and "zoom-out"</a> are now unprefixed.</li> <li>The number of cores on a physical machine can now be accessed by <a href="http://wiki.whatwg.org/wiki/Navigator_HW_Concurrency">navigator.hardwareConcurrency</a>.</li> <li>The user's preferred languages are now accessible by navigator.languages, and the languagechange event is fired when this is updated.</li> <li>The <a href="http://blogs.adobe.com/webplatform/2014/05/13/good-looking-shapes-gallery/">CSS Shapes Module</a> allows developers to define non-rectangular text wrapping boundaries around floated elements.</li> <li>NPAPI deprecation continues according to our <a href="http://blog.chromium.org/2014/05/update-on-npapi-deprecation.html">previously-announced plan</a> with a <a href="https://sites.google.com/a/chromium.org/dev/developers/npapi-deprecation">harder-to-bypass blocking UI</a>. </li> <li>The default monospace font on Windows is now Consolas instead of Courier New.</li> <li>Cross-origin fonts are now blocked unless the response includes the appropriate CORS headers.</li> </ul> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates!<br /> <br /> Posted by Emil A Eklund, Software Engineer and Senior Blog DirectWriter<br /> <br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-G4pXHsYSFy41zjnA4viOO9BEHqnv7QNqci9spvg3OKy4iLnyE__u780FV1Hei3XjazH9E0rmtkMWq1q8rIEG7gVjEejwkTVVzwtnCa5ndfiW2N_VT7K138futUkugJHZJXKro2P-hTd3/s1600/directwrite-comparison.png" imageanchor="1" style="display: none; margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-G4pXHsYSFy41zjnA4viOO9BEHqnv7QNqci9spvg3OKy4iLnyE__u780FV1Hei3XjazH9E0rmtkMWq1q8rIEG7gVjEejwkTVVzwtnCa5ndfiW2N_VT7K138futUkugJHZJXKro2P-hTd3/s1600/directwrite-comparison.png" /></a> <br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Today’s <a href="https://www.google.com/landing/chrome/beta/">Chrome Beta</a> channel release includes a slew of new developer features to help you make richer, faster and more compelling web content and apps, especially for mobile devices. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>DirectWrite on Windows</b><br /> <br /> Chrome 37 adds support for <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd368038(v=vs.85).aspx">DirectWrite</a>, an API on Windows for clear, high-quality text rendering even on high DPI displays. Before DirectWrite, Chrome used the Graphics Device Interface (GDI) to render text. GDI dates back to the mid-80's and reflects the engineering tradeoffs of that time, particularly for slower, lower-resolution machines. The switch to DirectWrite has been a <a href="http://crbug.com/25541">top user request for years</a>, and required extensive re-architecting and streamlining of Chrome's font rendering engine.<br /> <br /> Some users should begin seeing better-looking fonts and increased rendering performance as we roll out DirectWrite, with no changes required by web developers. Assuming everything goes smoothly, all users will experience the improvements by the Chrome 37 stable release.<br /> <br /> Compare the below screenshots, taken with and without DirectWrite enabled.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-G4pXHsYSFy41zjnA4viOO9BEHqnv7QNqci9spvg3OKy4iLnyE__u780FV1Hei3XjazH9E0rmtkMWq1q8rIEG7gVjEejwkTVVzwtnCa5ndfiW2N_VT7K138futUkugJHZJXKro2P-hTd3/s1600/directwrite-comparison.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJRqAiT8frHsVHDonz-VuzPm_uUfi51B5-MXsvLLEYV8WnlkDx1BdrE2sezJSFYCMJIp4qMMQbRnr65FmF4RcHC8NiYtUbMVZqews5ymtgE-hLK3MPjz37wi2p1Q0nwNgwKSYeL64iZ5xQ/s1600/Untitled-1.png" /></a><br /> <br /></div> <b>New HTML element: <dialog></b><br /> <br /> In this release we're also adding support for the <a href="http://www.w3.org/html/wg/drafts/html/master/interactive-elements.html#the-dialog-element"><dialog> HTML5 element</a>, which enables developers to create styled dialog boxes in their web applications and control them via a JavaScript API. For more details, <a href="http://demo.agektmr.com/dialog/">check out some code samples and see <dialog> in action</a>. The <dialog> element is a better-designed alternative to showModalDialog(), which is now disabled as we <a href="http://blog.chromium.org/2014/07/disabling-showmodaldialog.html">recently announced</a>.<br /> <br /> <b>Other updates in this release</b><br /> <br /> <ul> <li>The <a href="http://www.w3.org/TR/WebCryptoAPI/">Web Cryptography JavaScript API</a> is enabled by default starting in Chrome 37, allowing developers to perform cryptographic operations such as hashing, signature generation/verification, and encryption.</li> <li>Subpixel font scaling is now supported, which enables smooth animations of text between font sizes. </li> <li>TouchEvent co-ordinates are now doubles instead of longs, enabling higher-fidelity touch interactions on high-DPI displays.</li> <li>CSS cursor values <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/cursor">"zoom-in" and "zoom-out"</a> are now unprefixed.</li> <li>The number of cores on a physical machine can now be accessed by <a href="http://wiki.whatwg.org/wiki/Navigator_HW_Concurrency">navigator.hardwareConcurrency</a>.</li> <li>The user's preferred languages are now accessible by navigator.languages, and the languagechange event is fired when this is updated.</li> <li>The <a href="http://blogs.adobe.com/webplatform/2014/05/13/good-looking-shapes-gallery/">CSS Shapes Module</a> allows developers to define non-rectangular text wrapping boundaries around floated elements.</li> <li>NPAPI deprecation continues according to our <a href="http://blog.chromium.org/2014/05/update-on-npapi-deprecation.html">previously-announced plan</a> with a <a href="https://sites.google.com/a/chromium.org/dev/developers/npapi-deprecation">harder-to-bypass blocking UI</a>. </li> <li>The default monospace font on Windows is now Consolas instead of Courier New.</li> <li>Cross-origin fonts are now blocked unless the response includes the appropriate CORS headers.</li> </ul> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates!<br /> <br /> Posted by Emil A Eklund, Software Engineer and Senior Blog DirectWriter<br /> <br /> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-G4pXHsYSFy41zjnA4viOO9BEHqnv7QNqci9spvg3OKy4iLnyE__u780FV1Hei3XjazH9E0rmtkMWq1q8rIEG7gVjEejwkTVVzwtnCa5ndfiW2N_VT7K138futUkugJHZJXKro2P-hTd3/s1600/directwrite-comparison.png" imageanchor="1" style="display: none; margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-G4pXHsYSFy41zjnA4viOO9BEHqnv7QNqci9spvg3OKy4iLnyE__u780FV1Hei3XjazH9E0rmtkMWq1q8rIEG7gVjEejwkTVVzwtnCa5ndfiW2N_VT7K138futUkugJHZJXKro2P-hTd3/s1600/directwrite-comparison.png" /></a> <br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Chrome 37 Beta: DirectWrite on Windows and the <dialog> element&url=https://blog.chromium.org/2014/07/chrome-37-beta-directwrite-on-windows.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/07/chrome-37-beta-directwrite-on-windows.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/07/chrome-37-beta-directwrite-on-windows.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://blog.chromium.org/search/label/beta' rel='tag'> beta </a> </span> </div> </div> </div> <div class='post' data-id='3047122251022509171' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/07/disabling-showmodaldialog.html' itemprop='url' title='Disabling showModalDialog'> Disabling showModalDialog </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, July 16, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> The web platform has evolved organically over the past two decades, slowly growing new capabilities and APIs. Many features that are added are great ideas that enable web developers to make even better applications. But some APIs turn out, in retrospect, to be mistakes. Over time, the platform accretes more bad APIs, which makes it harder to add new browser features, confuses web developers, and even introduces security bugs. showModalDialog is a bad API that we <a href="http://blog.chromium.org/2014/04/chrome-35-beta-more-developer-control.html">deprecated earlier this year</a>, and in Chrome 37 we will disable support for it by default.<br /> <br /> showModalDialog was first introduced in Internet Explorer 4 and although it was never formally standardized, over time most other browsers added support for it. It allows applications to show a dialog of HTML content that freezes all other content while showing. showModalDialog is not a commonly used API: based on our usage counters, <a href="http://www.chromestatus.com/metrics/feature/timeline/popularity/195">less than 0.006% of pages use it</a>.<br /> <br /> Unfortunately, showModalDialog's unique ability to freeze content is <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/xh9fPX0ijqk/8oPryGUsGPMJ">now</a> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=933040">widely</a> <a href="http://dev.opera.com/blog/showmodaldialog/">regarded</a> as a mis-feature in terms of user experience, code complexity, and security. From a usability perspective, showModalDialog rudely demands that you interact with it by freezing all of your other tabs—even ones from other sites. showModalDialog also requires complex and hard-to-maintain code scattered throughout the codebase. This complexity complicates the behavior of new web features like Mutation Observers, Object.observe, and Promises. It also makes showModalDialog a source of a disproportionate number of bugs, including serious security vulnerabilities. It is for these reasons that we decided to turn off showModalDialog by default in the next version of Chrome.<br /> <br /> Although very few sites use showModalDialog, the small minority that do—disproportionately enterprise sites—have come to rely heavily on it. In order to give these sites more time to update, we have added a temporary <a href="http://www.chromium.org/administrators/policy-list-3#EnableDeprecatedWebPlatformFeatures">Enterprise Policy setting to re-enable showModalDialog</a>. In May 2015 this setting will be removed and showModalDialog will be completely removed from Chromium. Affected sites should begin work to update their sites as soon as possible.<br /> <br /> Although it can be difficult, sometimes the only way to <a href="http://glazkov.com/2014/04/24/going-forward-is-leaving-past-behind/">go forward is to leave the past behind</a>. Removing bad APIs will help us make the web a more consistent and capable platform for both developers and users.<br /> <br /> Posted by Adam Barth, Software Engineer <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> The web platform has evolved organically over the past two decades, slowly growing new capabilities and APIs. Many features that are added are great ideas that enable web developers to make even better applications. But some APIs turn out, in retrospect, to be mistakes. Over time, the platform accretes more bad APIs, which makes it harder to add new browser features, confuses web developers, and even introduces security bugs. showModalDialog is a bad API that we <a href="http://blog.chromium.org/2014/04/chrome-35-beta-more-developer-control.html">deprecated earlier this year</a>, and in Chrome 37 we will disable support for it by default.<br /> <br /> showModalDialog was first introduced in Internet Explorer 4 and although it was never formally standardized, over time most other browsers added support for it. It allows applications to show a dialog of HTML content that freezes all other content while showing. showModalDialog is not a commonly used API: based on our usage counters, <a href="http://www.chromestatus.com/metrics/feature/timeline/popularity/195">less than 0.006% of pages use it</a>.<br /> <br /> Unfortunately, showModalDialog's unique ability to freeze content is <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/xh9fPX0ijqk/8oPryGUsGPMJ">now</a> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=933040">widely</a> <a href="http://dev.opera.com/blog/showmodaldialog/">regarded</a> as a mis-feature in terms of user experience, code complexity, and security. From a usability perspective, showModalDialog rudely demands that you interact with it by freezing all of your other tabs—even ones from other sites. showModalDialog also requires complex and hard-to-maintain code scattered throughout the codebase. This complexity complicates the behavior of new web features like Mutation Observers, Object.observe, and Promises. It also makes showModalDialog a source of a disproportionate number of bugs, including serious security vulnerabilities. It is for these reasons that we decided to turn off showModalDialog by default in the next version of Chrome.<br /> <br /> Although very few sites use showModalDialog, the small minority that do—disproportionately enterprise sites—have come to rely heavily on it. In order to give these sites more time to update, we have added a temporary <a href="http://www.chromium.org/administrators/policy-list-3#EnableDeprecatedWebPlatformFeatures">Enterprise Policy setting to re-enable showModalDialog</a>. In May 2015 this setting will be removed and showModalDialog will be completely removed from Chromium. Affected sites should begin work to update their sites as soon as possible.<br /> <br /> Although it can be difficult, sometimes the only way to <a href="http://glazkov.com/2014/04/24/going-forward-is-leaving-past-behind/">go forward is to leave the past behind</a>. Removing bad APIs will help us make the web a more consistent and capable platform for both developers and users.<br /> <br /> Posted by Adam Barth, Software Engineer <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Disabling showModalDialog&url=https://blog.chromium.org/2014/07/disabling-showmodaldialog.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/07/disabling-showmodaldialog.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/07/disabling-showmodaldialog.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='4297662090780834503' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/06/migrate-your-legacy-packaged-apps-to.html' itemprop='url' title='Migrate Your Legacy Packaged Apps to Chrome Apps'> Migrate Your Legacy Packaged Apps to Chrome Apps </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, June 30, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> In 2010, we created <a href="https://developer.chrome.com/extensions/apps">packaged apps</a> to fill a missing link between <a href="https://developer.chrome.com/extensions/index">extensions</a> and <a href="https://developers.google.com/chrome/apps/docs/developers_guide">hosted apps</a>. They look the same as a hosted app to the user, but under the covers, they are more like traditional extensions. Over time, we realized that a clearer separation between the Chrome browser and apps was necessary, both for security reasons and to conform to user expectations. We <a href="http://chrome.blogspot.com/2013/09/a-new-breed-of-chrome-apps.html">launched</a> the next generation of Chrome Apps, a new version of packaged apps, last year to address those issues, and today we're announcing the deprecation of legacy packaged apps.<br /> <br /> Starting today, no new legacy packaged apps can be published in the Chrome Web Store. In December, all existing legacy packaged app listings will be removed from the Chrome Web Store’s search and browse functions. Existing legacy packaged apps can be updated until Chrome stops loading them in June of 2015. Nothing will change for hosted apps or new packaged apps.<br /> <br /> <i>Updated 04/09/2015: The legacy packaged app deprecation schedule has been revised. In August, all existing legacy packaged app listings will be removed from the Chrome Web Store’s search and browse functions. Existing legacy packaged apps can be updated until Chrome stops loading them in February of 2016.</i><br /> <br /> Developers are strongly encouraged to migrate their legacy packaged apps to either Chrome Apps or extensions. To get started, check out our <a href="https://developer.chrome.com/webstore/migrating">migration tutorial</a>, and contact us on the <a href="https://groups.google.com/a/chromium.org/group/chromium-apps">chromium-apps</a> forum or <a href="https://plus.google.com/+GoogleChromeDevelopers/">our G+ page</a> with any questions.<br /> <span style="background-color: white; font-family: "arial" , sans-serif; font-size: 12.8px;"><br /></span> <span style="background-color: white; font-family: "arial" , sans-serif; font-size: 12.8px;"><i>Updated 03/22/2016: The legacy packaged app deprecation schedule has been revised. Existing legacy packaged app listings will be removed from the Chrome Web Store's search and browse functions in late 2016. Chrome will stop loading these apps soon thereafter.</i></span><br /> <br /> Posted by Amanda Bishop, Product Manager<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> In 2010, we created <a href="https://developer.chrome.com/extensions/apps">packaged apps</a> to fill a missing link between <a href="https://developer.chrome.com/extensions/index">extensions</a> and <a href="https://developers.google.com/chrome/apps/docs/developers_guide">hosted apps</a>. They look the same as a hosted app to the user, but under the covers, they are more like traditional extensions. Over time, we realized that a clearer separation between the Chrome browser and apps was necessary, both for security reasons and to conform to user expectations. We <a href="http://chrome.blogspot.com/2013/09/a-new-breed-of-chrome-apps.html">launched</a> the next generation of Chrome Apps, a new version of packaged apps, last year to address those issues, and today we're announcing the deprecation of legacy packaged apps.<br /> <br /> Starting today, no new legacy packaged apps can be published in the Chrome Web Store. In December, all existing legacy packaged app listings will be removed from the Chrome Web Store’s search and browse functions. Existing legacy packaged apps can be updated until Chrome stops loading them in June of 2015. Nothing will change for hosted apps or new packaged apps.<br /> <br /> <i>Updated 04/09/2015: The legacy packaged app deprecation schedule has been revised. In August, all existing legacy packaged app listings will be removed from the Chrome Web Store’s search and browse functions. Existing legacy packaged apps can be updated until Chrome stops loading them in February of 2016.</i><br /> <br /> Developers are strongly encouraged to migrate their legacy packaged apps to either Chrome Apps or extensions. To get started, check out our <a href="https://developer.chrome.com/webstore/migrating">migration tutorial</a>, and contact us on the <a href="https://groups.google.com/a/chromium.org/group/chromium-apps">chromium-apps</a> forum or <a href="https://plus.google.com/+GoogleChromeDevelopers/">our G+ page</a> with any questions.<br /> <span style="background-color: white; font-family: "arial" , sans-serif; font-size: 12.8px;"><br /></span> <span style="background-color: white; font-family: "arial" , sans-serif; font-size: 12.8px;"><i>Updated 03/22/2016: The legacy packaged app deprecation schedule has been revised. Existing legacy packaged app listings will be removed from the Chrome Web Store's search and browse functions in late 2016. Chrome will stop loading these apps soon thereafter.</i></span><br /> <br /> Posted by Amanda Bishop, Product Manager<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Migrate Your Legacy Packaged Apps to Chrome Apps&url=https://blog.chromium.org/2014/06/migrate-your-legacy-packaged-apps-to.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/06/migrate-your-legacy-packaged-apps-to.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/06/migrate-your-legacy-packaged-apps-to.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='8907043288211181996' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/06/cast-away-with-android-tv-and-google.html' itemprop='url' title='Cast Away with Android TV and Google Cast'> Cast Away with Android TV and Google Cast </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, June 25, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <i>[Cross-posted from the <a href="http://googledevelopers.blogspot.com/2014/06/cast-away-with-android-tv-and-google.html">Google Developers Blog</a>]</i><br /> <div style="float: right; padding: 1.5em 0 2em 2em;"> <a href="https://www.google.com/events/io"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhf6Ucd3TIkrQLznJq-YkJ6umcYsFBLkMMq1rCpWfC338it10MaRTb1KmJo4infz-oGA1jiAtZz8FgEn3SeWXtbPyBgQWGIOpX4xmov7WoUAncOKfyq8LqL-u0gjJXIGfSlaDk9qBcuXtb/s1600/io1200px-01.png" style="width: 360px;" /></a> </div> <br /> Last summer, we launched Chromecast, a small, affordable device that lets you cast online video, music and anything from the web to your TV. Today at Google I/O, we announced Android TV, the newest form factor to the Android platform, and a way to extend the reach of Google Cast to more devices, like televisions, set-top boxes and consoles.<br /> <br /> Check out <a href="http://googleblog.blogspot.com/2014/06/google-io-2014-keynote.html">Coming to a Screen Near You</a> for some details on everything we’re doing to make your TV the place to be.<br /> <br /> For developers though--sorry, you don’t get to unwind in front of the TV. We need you to get to work and help us create the best possible TV experience, with all of the new features announced at I/O today.<br /> <h3 style="font-family: Roboto,sans-serif; font-size: 20px; font-weight: 400;"> <br />Get started with Android TV</h3> <br /> In addition to Google Cast apps that send content to the TV, you can now build immersive native apps and console-style games on Android TV devices. These native apps work with TV remotes and gamepads, even if you don’t have your phone handy. The Android L Developer Preview SDK includes the new Leanback support library that allows you to design smoother, simpler, living room apps. <br /> <br /> And this is just the beginning. In the fall, new APIs will allow you to cast directly to these apps, so users can control the app with the phone, the remote, or even their Android Wear watch. You’ll also start seeing Android TV set-top boxes, consoles and televisions from Sony, TP Vision, Sharp, Asus, Razer and more.<br /> <br /> <h3 style="font-family: Roboto,sans-serif; font-size: 20px; font-weight: 400;"> Help more users find your Google Cast app</h3> <br /> We want to help users more easily find your content, so we’ve improved the <a href="https://cast.google.com/publish/">Google Cast SDK developer console</a> to let you upload your app icon, app name, and app category for Android, iOS and Chrome. These changes will help your app get discovered on <a href="http://chromecast.com/apps">chromecast.com/apps</a> and on Google Play.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyX_ejE6Qszrcp7_GwwnxsaRyIb3ASSByBjkuRnzNGXLeGOOrq2O_Ni0El-KiB-kOj3ykFRxilhKD7MTsxLHKSoCGH0s-goTSQS-8Imix0XUfLgpE3NVnOxb0vUB6JgJzEFPK_1P9AAbAo/s1600/image00.png" imageanchor="1"><img border="0" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyX_ejE6Qszrcp7_GwwnxsaRyIb3ASSByBjkuRnzNGXLeGOOrq2O_Ni0El-KiB-kOj3ykFRxilhKD7MTsxLHKSoCGH0s-goTSQS-8Imix0XUfLgpE3NVnOxb0vUB6JgJzEFPK_1P9AAbAo/s1600/image00.png" width="400" /></a> </div> <br /> Additional capabilities have also been added to the Google Cast SDK. These include: Media Player Library enhancements, bringing easier integration with MPEG-DASH Smooth Streaming, and HLS. We’ve also added WebAudio & WebGL support, made the Cast Companion Library available, and added enhanced Closed Caption support. And coming soon, we will add support for queuing and ID delegation. <br /> <br /> Ready to get started? Visit <a href="http://developer.android.com/tv">developer.android.com/tv</a> and <a href="http://developers.google.com/cast">developers.google.com/cast</a> for the SDKs, style guides, tutorials, sample code, and the API references. You can also request an ADT-1 devkit to bootstrap your Android TV development.<br /> <br /> <em style="color: #444444; font-family: arial, sans-serif; font-size: 13px; line-height: 20.799999237060547px;">By Dave Burke and Majd Bakar, Engineering Directors and TV Junkies</em><br /> <div style="border-top: 1px solid #ddd; clear: both; margin-top: 2em; width: 100%;"> <style>.footer__link, .footer__text{ color: #8b8b8b !important; display: block; font-size: 12px; line-height: 1.33333; margin-bottom: 10px; text-decoration: none; } .hoverable .footer__link:hover { text-decoration: underline; } </style></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <i>[Cross-posted from the <a href="http://googledevelopers.blogspot.com/2014/06/cast-away-with-android-tv-and-google.html">Google Developers Blog</a>]</i><br /> <div style="float: right; padding: 1.5em 0 2em 2em;"> <a href="https://www.google.com/events/io"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhf6Ucd3TIkrQLznJq-YkJ6umcYsFBLkMMq1rCpWfC338it10MaRTb1KmJo4infz-oGA1jiAtZz8FgEn3SeWXtbPyBgQWGIOpX4xmov7WoUAncOKfyq8LqL-u0gjJXIGfSlaDk9qBcuXtb/s1600/io1200px-01.png" style="width: 360px;" /></a> </div> <br /> Last summer, we launched Chromecast, a small, affordable device that lets you cast online video, music and anything from the web to your TV. Today at Google I/O, we announced Android TV, the newest form factor to the Android platform, and a way to extend the reach of Google Cast to more devices, like televisions, set-top boxes and consoles.<br /> <br /> Check out <a href="http://googleblog.blogspot.com/2014/06/google-io-2014-keynote.html">Coming to a Screen Near You</a> for some details on everything we’re doing to make your TV the place to be.<br /> <br /> For developers though--sorry, you don’t get to unwind in front of the TV. We need you to get to work and help us create the best possible TV experience, with all of the new features announced at I/O today.<br /> <h3 style="font-family: Roboto,sans-serif; font-size: 20px; font-weight: 400;"> <br />Get started with Android TV</h3> <br /> In addition to Google Cast apps that send content to the TV, you can now build immersive native apps and console-style games on Android TV devices. These native apps work with TV remotes and gamepads, even if you don’t have your phone handy. The Android L Developer Preview SDK includes the new Leanback support library that allows you to design smoother, simpler, living room apps. <br /> <br /> And this is just the beginning. In the fall, new APIs will allow you to cast directly to these apps, so users can control the app with the phone, the remote, or even their Android Wear watch. You’ll also start seeing Android TV set-top boxes, consoles and televisions from Sony, TP Vision, Sharp, Asus, Razer and more.<br /> <br /> <h3 style="font-family: Roboto,sans-serif; font-size: 20px; font-weight: 400;"> Help more users find your Google Cast app</h3> <br /> We want to help users more easily find your content, so we’ve improved the <a href="https://cast.google.com/publish/">Google Cast SDK developer console</a> to let you upload your app icon, app name, and app category for Android, iOS and Chrome. These changes will help your app get discovered on <a href="http://chromecast.com/apps">chromecast.com/apps</a> and on Google Play.<br /> <br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyX_ejE6Qszrcp7_GwwnxsaRyIb3ASSByBjkuRnzNGXLeGOOrq2O_Ni0El-KiB-kOj3ykFRxilhKD7MTsxLHKSoCGH0s-goTSQS-8Imix0XUfLgpE3NVnOxb0vUB6JgJzEFPK_1P9AAbAo/s1600/image00.png" imageanchor="1"><img border="0" height="163" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyX_ejE6Qszrcp7_GwwnxsaRyIb3ASSByBjkuRnzNGXLeGOOrq2O_Ni0El-KiB-kOj3ykFRxilhKD7MTsxLHKSoCGH0s-goTSQS-8Imix0XUfLgpE3NVnOxb0vUB6JgJzEFPK_1P9AAbAo/s1600/image00.png" width="400" /></a> </div> <br /> Additional capabilities have also been added to the Google Cast SDK. These include: Media Player Library enhancements, bringing easier integration with MPEG-DASH Smooth Streaming, and HLS. We’ve also added WebAudio & WebGL support, made the Cast Companion Library available, and added enhanced Closed Caption support. And coming soon, we will add support for queuing and ID delegation. <br /> <br /> Ready to get started? Visit <a href="http://developer.android.com/tv">developer.android.com/tv</a> and <a href="http://developers.google.com/cast">developers.google.com/cast</a> for the SDKs, style guides, tutorials, sample code, and the API references. You can also request an ADT-1 devkit to bootstrap your Android TV development.<br /> <br /> <em style="color: #444444; font-family: arial, sans-serif; font-size: 13px; line-height: 20.799999237060547px;">By Dave Burke and Majd Bakar, Engineering Directors and TV Junkies</em><br /> <div style="border-top: 1px solid #ddd; clear: both; margin-top: 2em; width: 100%;"> <style>.footer__link, .footer__text{ color: #8b8b8b !important; display: block; font-size: 12px; line-height: 1.33333; margin-bottom: 10px; text-decoration: none; } .hoverable .footer__link:hover { text-decoration: underline; } </style></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Cast Away with Android TV and Google Cast&url=https://blog.chromium.org/2014/06/cast-away-with-android-tv-and-google.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/06/cast-away-with-android-tv-and-google.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/06/cast-away-with-android-tv-and-google.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='2643891281348915475' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/06/web-fundamentals-and-web-starter-kit.html' itemprop='url' title='Web Fundamentals and Web Starter Kit: Resources for Modern Web Development'> Web Fundamentals and Web Starter Kit: Resources for Modern Web Development </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, June 19, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> The web is a rich computing platform with unparalleled reach. In recent years, mobile devices have brought the web to billions of new users and introduced many new device capabilities, screen sizes, input methods, and more. To help developers navigate this brave new world, we built <a href="https://developers.google.com/web/fundamentals/">Web Fundamentals</a>, a curated source for modern best practices. Today, we’re making it even easier to build multi-device experiences with the Beta release of the <a href="http://developers.google.com/web/starter-kit/">Web Starter Kit</a>.<br /> <img border="0" height="355" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicxD6qJ_TkfNIfwUmPCV7qRNA2SRnoqeb9iQtycrhP66QF5fn60Mr-aSKqonjdshc0C5qEFIwkbr9x_iS4_LliqAR65AxDUCWopPIxnZcK71lZIqqrjXWFmLScSM4hfSxo2XrBZtXccmB8/s1600/web-fundamentals-preview-small.png" style="border: none; display: block; margin: auto;" width="400" /> Web Fundamentals' guidelines are intended to be <em>fundamental</em> to the platform: useful no matter which framework you choose or which browser your users run. We have articles about <a href="https://developers.google.com/web/fundamentals/layouts/">responsive layouts</a>, <a href="https://developers.google.com/web/fundamentals/input/form/">forms</a>, <a href="https://developers.google.com/web/fundamentals/input/touch/">touch</a>, <a href="https://developers.google.com/web/fundamentals/media/">media</a>, <a href="https://developers.google.com/web/fundamentals/performance/">performance</a>, <a href="http://developers.google.com/web/fundamentals/device-access/">device capabilities</a>, and <a href="http://developers.google.com/web/fundamentals/tools/">setting up </a><a href="http://developers.google.com/web/fundamentals/tools/">a </a><a href="http://developers.google.com/web/fundamentals/tools/">development workflow</a>. Articles cover both coding and design. For example, the <a href="https://developers.google.com/web/fundamentals/layouts/rwd-patterns/">article</a> on layout design patterns explains both the usability tradeoffs between different layout options and how to implement them. The <a href="https://developers.google.com/web/fundamentals/performance/">performance section</a> complements <a href="https://developers.google.com/speed/pagespeed/insights/?url=www.google.com">PageSpeed Insights</a>, an auditing tool that encourages instant (<1 second) mobile web sites.<br /> <br /> Designed to help you apply Web Fundamentals' best practices in new projects, <a href="http://developers.google.com/web/starter-kit/">Web Starter Kit</a> is a lightweight boilerplate with templates and tooling. Web Starter Kit gives you responsive layout, a visual style guide, and optional workflow features like performance optimization so you can keep your pages lean and fast.<br /> <br /> <img alt="Web Starter Kit preview animation" src="https://googledrive.com/host/0BzGgk26K1Cc-NkFQbnpqc184V1k/web-starter-kit.gif" style="border: none; display: block; margin: auto;" title="Web Starter Kit preview animation" width="500px" /><br /> Both Web Fundamentals and the Web Starter Kit are actively developed and curated by a team of developers from Google and several open-source <a href="https://github.com/google/web-starter-kit/graphs/contributors">contributors</a>. Our <a href="http://github.com/google/WebFundamentals">source</a> <a href="http://github.com/Google/web-starter-kit">code</a> is available on GitHub, and we welcome contributions and feedback. Looking ahead, we’ll be adding new content and working with the web development community to refine our advice. Please <a href="https://github.com/google/WebFundamentals/issues">file an issue</a> or <a href="https://github.com/google/WebFundamentals/pulls?direction=desc&page=1&sort=created&state=open">submit a</a><a href="https://github.com/google/WebFundamentals/pulls?direction=desc&page=1&sort=created&state=open"> pull request</a> to help us capture web development best practices.<br /> <br /> We look forward to a more modern, multi-device web!<br /> <br /> Posted by Paul Kinlan, Developer Advocate and Web Fundamentalist<br /> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> The web is a rich computing platform with unparalleled reach. In recent years, mobile devices have brought the web to billions of new users and introduced many new device capabilities, screen sizes, input methods, and more. To help developers navigate this brave new world, we built <a href="https://developers.google.com/web/fundamentals/">Web Fundamentals</a>, a curated source for modern best practices. Today, we’re making it even easier to build multi-device experiences with the Beta release of the <a href="http://developers.google.com/web/starter-kit/">Web Starter Kit</a>.<br /> <img border="0" height="355" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicxD6qJ_TkfNIfwUmPCV7qRNA2SRnoqeb9iQtycrhP66QF5fn60Mr-aSKqonjdshc0C5qEFIwkbr9x_iS4_LliqAR65AxDUCWopPIxnZcK71lZIqqrjXWFmLScSM4hfSxo2XrBZtXccmB8/s1600/web-fundamentals-preview-small.png" style="border: none; display: block; margin: auto;" width="400" /> Web Fundamentals' guidelines are intended to be <em>fundamental</em> to the platform: useful no matter which framework you choose or which browser your users run. We have articles about <a href="https://developers.google.com/web/fundamentals/layouts/">responsive layouts</a>, <a href="https://developers.google.com/web/fundamentals/input/form/">forms</a>, <a href="https://developers.google.com/web/fundamentals/input/touch/">touch</a>, <a href="https://developers.google.com/web/fundamentals/media/">media</a>, <a href="https://developers.google.com/web/fundamentals/performance/">performance</a>, <a href="http://developers.google.com/web/fundamentals/device-access/">device capabilities</a>, and <a href="http://developers.google.com/web/fundamentals/tools/">setting up </a><a href="http://developers.google.com/web/fundamentals/tools/">a </a><a href="http://developers.google.com/web/fundamentals/tools/">development workflow</a>. Articles cover both coding and design. For example, the <a href="https://developers.google.com/web/fundamentals/layouts/rwd-patterns/">article</a> on layout design patterns explains both the usability tradeoffs between different layout options and how to implement them. The <a href="https://developers.google.com/web/fundamentals/performance/">performance section</a> complements <a href="https://developers.google.com/speed/pagespeed/insights/?url=www.google.com">PageSpeed Insights</a>, an auditing tool that encourages instant (<1 second) mobile web sites.<br /> <br /> Designed to help you apply Web Fundamentals' best practices in new projects, <a href="http://developers.google.com/web/starter-kit/">Web Starter Kit</a> is a lightweight boilerplate with templates and tooling. Web Starter Kit gives you responsive layout, a visual style guide, and optional workflow features like performance optimization so you can keep your pages lean and fast.<br /> <br /> <img alt="Web Starter Kit preview animation" src="https://googledrive.com/host/0BzGgk26K1Cc-NkFQbnpqc184V1k/web-starter-kit.gif" style="border: none; display: block; margin: auto;" title="Web Starter Kit preview animation" width="500px" /><br /> Both Web Fundamentals and the Web Starter Kit are actively developed and curated by a team of developers from Google and several open-source <a href="https://github.com/google/web-starter-kit/graphs/contributors">contributors</a>. Our <a href="http://github.com/google/WebFundamentals">source</a> <a href="http://github.com/Google/web-starter-kit">code</a> is available on GitHub, and we welcome contributions and feedback. Looking ahead, we’ll be adding new content and working with the web development community to refine our advice. Please <a href="https://github.com/google/WebFundamentals/issues">file an issue</a> or <a href="https://github.com/google/WebFundamentals/pulls?direction=desc&page=1&sort=created&state=open">submit a</a><a href="https://github.com/google/WebFundamentals/pulls?direction=desc&page=1&sort=created&state=open"> pull request</a> to help us capture web development best practices.<br /> <br /> We look forward to a more modern, multi-device web!<br /> <br /> Posted by Paul Kinlan, Developer Advocate and Web Fundamentalist<br /> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Web Fundamentals and Web Starter Kit: Resources for Modern Web Development&url=https://blog.chromium.org/2014/06/web-fundamentals-and-web-starter-kit.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/06/web-fundamentals-and-web-starter-kit.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/06/web-fundamentals-and-web-starter-kit.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='4872520559318730450' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/06/see-what-your-apps-extensions-have-been.html' itemprop='url' title='See what your apps & extensions have been up to'> See what your apps & extensions have been up to </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, June 10, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Extensions are a great way to enhance the browsing experience. However, some extensions ask for broad permissions that allow access to sensitive data such as browser cookies or history. Last year, we <a href="http://blog.chromium.org/2013/11/introducing-new-chrome-apps-developer.html">introduced</a> the <a href="https://chrome.google.com/webstore/detail/chrome-apps-extensions-de/ohmmkhmmmpcnpikjeljgnaoabkaalbgc">Chrome Apps & Extensions Developer Tool</a>, which provides an improved developer experience for debugging apps and extensions. The newest version of the tool, available today, lets power users audit any app or extension and get visibility into the precise actions that it's performing.<br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb338WOjNp0Ovn0jdwwKusl3fyAVJKMXWaLwvfXRZBe-SxFptlI8x2r9E0EdflkCY3JU856-NijWev1_H4Y9XO4wL4uq0-4qDYOdpAv16YnSUCW29eeMFeZW5LyXSxMlDjCtnhvLSic-Ay/s1600/Screen+Shot+2014-06-09+at+4.06.07+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb338WOjNp0Ovn0jdwwKusl3fyAVJKMXWaLwvfXRZBe-SxFptlI8x2r9E0EdflkCY3JU856-NijWev1_H4Y9XO4wL4uq0-4qDYOdpAv16YnSUCW29eeMFeZW5LyXSxMlDjCtnhvLSic-Ay/s1600/Screen+Shot+2014-06-09+at+4.06.07+PM.png" width="400" /></a></div> <br /> Once you’ve installed the Chrome Apps & Extensions Developer Tool, it will start locally auditing your extensions and apps as you use them. For each app or extension, you can see historical activity over the past few days as well as real-time activity by clicking the “Behavior” link. The tool highlights activities that involve your information, such as reading website cookies or modifying web sites, in a privacy section. You can also search for URLs to see if an extension has modified any matching pages. If you’re debugging an app or extension, you can use the “Realtime” tab to watch the stream of API calls as an extension or app runs. This can help you track down glitches or identify unnecessary API calls.<br /> <br /> Whether you’re a Chrome power user or a developer testing an extension, the Chrome Apps & Extensions Developer Tool can give you the information you need to understand how apps and extensions affect your browsing.<br /> <br /> Posted by Adrienne Porter Felt, Software Engineer and Extension Tinkerer<br /> <br /> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Extensions are a great way to enhance the browsing experience. However, some extensions ask for broad permissions that allow access to sensitive data such as browser cookies or history. Last year, we <a href="http://blog.chromium.org/2013/11/introducing-new-chrome-apps-developer.html">introduced</a> the <a href="https://chrome.google.com/webstore/detail/chrome-apps-extensions-de/ohmmkhmmmpcnpikjeljgnaoabkaalbgc">Chrome Apps & Extensions Developer Tool</a>, which provides an improved developer experience for debugging apps and extensions. The newest version of the tool, available today, lets power users audit any app or extension and get visibility into the precise actions that it's performing.<br /> <div style="text-align: center;"> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb338WOjNp0Ovn0jdwwKusl3fyAVJKMXWaLwvfXRZBe-SxFptlI8x2r9E0EdflkCY3JU856-NijWev1_H4Y9XO4wL4uq0-4qDYOdpAv16YnSUCW29eeMFeZW5LyXSxMlDjCtnhvLSic-Ay/s1600/Screen+Shot+2014-06-09+at+4.06.07+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="321" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb338WOjNp0Ovn0jdwwKusl3fyAVJKMXWaLwvfXRZBe-SxFptlI8x2r9E0EdflkCY3JU856-NijWev1_H4Y9XO4wL4uq0-4qDYOdpAv16YnSUCW29eeMFeZW5LyXSxMlDjCtnhvLSic-Ay/s1600/Screen+Shot+2014-06-09+at+4.06.07+PM.png" width="400" /></a></div> <br /> Once you’ve installed the Chrome Apps & Extensions Developer Tool, it will start locally auditing your extensions and apps as you use them. For each app or extension, you can see historical activity over the past few days as well as real-time activity by clicking the “Behavior” link. The tool highlights activities that involve your information, such as reading website cookies or modifying web sites, in a privacy section. You can also search for URLs to see if an extension has modified any matching pages. If you’re debugging an app or extension, you can use the “Realtime” tab to watch the stream of API calls as an extension or app runs. This can help you track down glitches or identify unnecessary API calls.<br /> <br /> Whether you’re a Chrome power user or a developer testing an extension, the Chrome Apps & Extensions Developer Tool can give you the information you need to understand how apps and extensions affect your browsing.<br /> <br /> Posted by Adrienne Porter Felt, Software Engineer and Extension Tinkerer<br /> <br /> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:See what your apps & extensions have been up to&url=https://blog.chromium.org/2014/06/see-what-your-apps-extensions-have-been.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/06/see-what-your-apps-extensions-have-been.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/06/see-what-your-apps-extensions-have-been.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='4380323447485945911' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/06/try-out-new-64-bit-windows-canary-and.html' itemprop='url' title='Try out the new 64-bit Windows Canary and Dev channels'> Try out the new 64-bit Windows Canary and Dev channels </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, June 3, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Today we’re announcing the addition of 64-bit support to Chrome, with two brand new 64-bit Dev and Canary channels for Windows 7 and 8 users, giving a faster and more secure browsing experience. To try it out, download the 64-bit installer from our <a href="https://www.google.com/intl/en/chrome/browser/canary.html">Canary</a> or <a href="https://www.google.com/chrome/browser/index.html?extra=devchannel">Dev</a> download pages. The new version replaces the existing version while preserving all your settings and bookmarks, so there’s no need to uninstall a current installation of Chrome.<br /> <br /> The majority of our users on Windows 7 or higher now have systems capable of running 64-bit applications, and this version of Chrome can take full advantage of these newer capabilities. This includes several improvements that align perfectly with Chrome’s <a href="http://www.chromium.org/developers/core-principles">core principles</a> of speed, security and stability:<br /> <ul> <li><b>Speed</b>: 64-bit allows us to take advantage of the latest processor and compiler optimizations, a more modern instruction set, and a calling convention that allows more function parameters to be passed quickly by registers. As a result, speed is improved, especially in graphics and multimedia content, where we see an average 25% improvement in performance.</li> </ul> <ul> <li><b>Security</b>: With Chrome able to take advantage of the latest OS features such as <a href="http://blogs.technet.com/b/srd/archive/2013/12/11/software-defense-mitigating-common-exploitation-techniques.aspx">High Entropy ASLR</a> on Windows 8, security is improved on 64-bit platforms as well. Those extra bits also help us better defend against exploitation techniques such as JIT spraying, and improve the effectiveness of our existing security defense features like heap partitioning.</li> </ul> <ul> <li><b>Stability</b>: Finally, we’ve observed a marked increase in stability for 64-bit Chrome over 32-bit Chrome. In particular, crash rates for the the renderer process (i.e. web content process) are almost half that of 32-bit Chrome.</li> </ul> We encourage all our users, especially developers, to give the new 64-bit Chrome a spin, and we’re looking forward to hearing your <a href="https://code.google.com/p/chromium/issues/entry?labels=Arch-x86_64,Type-?,Pri-2,OS-Windows&summary=Win64:%20Feedback">feedback</a> so we can make 64-bit Chrome work great and bring its benefits to our Beta and Stable channel users.<br /> <br /> Posted by Will Harris, Software Engineer and Stretcher of Pointers<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Today we’re announcing the addition of 64-bit support to Chrome, with two brand new 64-bit Dev and Canary channels for Windows 7 and 8 users, giving a faster and more secure browsing experience. To try it out, download the 64-bit installer from our <a href="https://www.google.com/intl/en/chrome/browser/canary.html">Canary</a> or <a href="https://www.google.com/chrome/browser/index.html?extra=devchannel">Dev</a> download pages. The new version replaces the existing version while preserving all your settings and bookmarks, so there’s no need to uninstall a current installation of Chrome.<br /> <br /> The majority of our users on Windows 7 or higher now have systems capable of running 64-bit applications, and this version of Chrome can take full advantage of these newer capabilities. This includes several improvements that align perfectly with Chrome’s <a href="http://www.chromium.org/developers/core-principles">core principles</a> of speed, security and stability:<br /> <ul> <li><b>Speed</b>: 64-bit allows us to take advantage of the latest processor and compiler optimizations, a more modern instruction set, and a calling convention that allows more function parameters to be passed quickly by registers. As a result, speed is improved, especially in graphics and multimedia content, where we see an average 25% improvement in performance.</li> </ul> <ul> <li><b>Security</b>: With Chrome able to take advantage of the latest OS features such as <a href="http://blogs.technet.com/b/srd/archive/2013/12/11/software-defense-mitigating-common-exploitation-techniques.aspx">High Entropy ASLR</a> on Windows 8, security is improved on 64-bit platforms as well. Those extra bits also help us better defend against exploitation techniques such as JIT spraying, and improve the effectiveness of our existing security defense features like heap partitioning.</li> </ul> <ul> <li><b>Stability</b>: Finally, we’ve observed a marked increase in stability for 64-bit Chrome over 32-bit Chrome. In particular, crash rates for the the renderer process (i.e. web content process) are almost half that of 32-bit Chrome.</li> </ul> We encourage all our users, especially developers, to give the new 64-bit Chrome a spin, and we’re looking forward to hearing your <a href="https://code.google.com/p/chromium/issues/entry?labels=Arch-x86_64,Type-?,Pri-2,OS-Windows&summary=Win64:%20Feedback">feedback</a> so we can make 64-bit Chrome work great and bring its benefits to our Beta and Stable channel users.<br /> <br /> Posted by Will Harris, Software Engineer and Stretcher of Pointers<br /> <div> <br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Try out the new 64-bit Windows Canary and Dev channels&url=https://blog.chromium.org/2014/06/try-out-new-64-bit-windows-canary-and.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/06/try-out-new-64-bit-windows-canary-and.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/06/try-out-new-64-bit-windows-canary-and.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='6451029394144920441' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/05/update-on-npapi-deprecation.html' itemprop='url' title='Update on NPAPI Deprecation'> Update on NPAPI Deprecation </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, May 27, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>Last September, we <a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html">announced</a> 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:</p> <div style="text-align: center"> <p style="font-weight: bold;">Monthly Plug-In Launch Percentage</p> <table style="margin-left: auto; margin-right: auto; padding: 5px; text-align: right; border: 1px solid lightgray;"> <tr> <td></td> <td>Sept 2013</td> <td>May 2014 </td> </tr> <tr> <td>Silverlight</td> <td>15</td> <td>13.3</td> </tr> <tr> <td>Google Earth</td> <td>9.1</td> <td>0.1</td> </tr> <tr> <td>Unity</td> <td>9.1</td> <td>3.1</td> </tr> <tr> <td>Google Talk</td> <td>8.7</td> <td>8.7</td> </tr> <tr> <td>Java</td> <td>8.9</td> <td>7.2</td> </tr> <tr> <td>Facebook</td> <td>6</td> <td>4.2</td> </tr> </table> <p style="color: gray;"><em>We are actively helping still-popular NPAPI-based <br>services migrate to open-web-based alternatives.</em></p> </div> <p>Deprecation has proceeded as scheduled. As of September 23rd, 2013, the Chrome Web Store <a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html">no longer</a> accepts NPAPI-based Apps and Extensions. Webpage-instantiated NPAPI plug-ins have been blocked by default since January 2014 using <a href="https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/a/chromium.org/dev/developers/npapi-deprecation/Screen%20Shot%202013-12-03%20at%2010.10.16%20AM.png?attachauth=ANoY7crHJ6iRlPFgCmZltCKnogHwc5-8cmgro36BLTL0IqejXcLlIMaxMDtbjzB9MgJCA8LCrV7aLpbBqVf9hKCUiULJuka3iyEnsaVRdwUOx6K5z_vd5XRmNkJ82y6Hwf01VgTvYrRerDr6cD2UDdNhOgHzgLY2HcFOkSWWt6lWQaRRRsIqJgTZz2s8VgBpyr-yVxSSmdA2MQ5u42spDBsfVCoqwE9cXzlluK9Bzodqe_tKudW8XoIpuJxR1MC7Y3FemdCl0mDGHHfRjqgwp5F5HupEy5Nn2w%3D%3D&attredirects=0">the infobar UI</a>. NPAPI support was <a href="https://groups.google.com/a/chromium.org/d/msg/chromium-dev/xEbgvWE7wMk/D_07G2lftacJ">removed</a> from Linux in Chrome 35.</p> <p>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 <a href="https://sites.google.com/a/chromium.org/dev/developers/npapi-deprecation?pli=1">harder-to-bypass page-action blocking UI</a>.</p> <p>Most use cases that previously required NPAPI are <a href="http://www.chromium.org/developers/npapi-deprecation">now</a> supported by JavaScript-based open web technologies. For the few applications that need low-level APIs, threads, and machine-optimized code, <a href="http://www.gonacl.com/">Native Client</a> 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 <a href="https://codereview.chromium.org/212533007">MediaStreams API</a> enables low latency multimedia playback, and the <a href="https://codereview.chromium.org/270213004/">Hardware Decode API</a> enables efficient video decoding.</p> <p>For more information, please see the <a href="http://www.chromium.org/developers/npapi-deprecation">developer NPAPI deprecation guide</a>. We look forward to the transition to a safer, more mobile-friendly web.</p> <br> <span class="post-author">Posted by Justin Schuh, Software Engineer and Plug-in Retirement Planner</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>Last September, we <a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html">announced</a> 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:</p> <div style="text-align: center"> <p style="font-weight: bold;">Monthly Plug-In Launch Percentage</p> <table style="margin-left: auto; margin-right: auto; padding: 5px; text-align: right; border: 1px solid lightgray;"> <tr> <td></td> <td>Sept 2013</td> <td>May 2014 </td> </tr> <tr> <td>Silverlight</td> <td>15</td> <td>13.3</td> </tr> <tr> <td>Google Earth</td> <td>9.1</td> <td>0.1</td> </tr> <tr> <td>Unity</td> <td>9.1</td> <td>3.1</td> </tr> <tr> <td>Google Talk</td> <td>8.7</td> <td>8.7</td> </tr> <tr> <td>Java</td> <td>8.9</td> <td>7.2</td> </tr> <tr> <td>Facebook</td> <td>6</td> <td>4.2</td> </tr> </table> <p style="color: gray;"><em>We are actively helping still-popular NPAPI-based <br>services migrate to open-web-based alternatives.</em></p> </div> <p>Deprecation has proceeded as scheduled. As of September 23rd, 2013, the Chrome Web Store <a href="http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html">no longer</a> accepts NPAPI-based Apps and Extensions. Webpage-instantiated NPAPI plug-ins have been blocked by default since January 2014 using <a href="https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/a/chromium.org/dev/developers/npapi-deprecation/Screen%20Shot%202013-12-03%20at%2010.10.16%20AM.png?attachauth=ANoY7crHJ6iRlPFgCmZltCKnogHwc5-8cmgro36BLTL0IqejXcLlIMaxMDtbjzB9MgJCA8LCrV7aLpbBqVf9hKCUiULJuka3iyEnsaVRdwUOx6K5z_vd5XRmNkJ82y6Hwf01VgTvYrRerDr6cD2UDdNhOgHzgLY2HcFOkSWWt6lWQaRRRsIqJgTZz2s8VgBpyr-yVxSSmdA2MQ5u42spDBsfVCoqwE9cXzlluK9Bzodqe_tKudW8XoIpuJxR1MC7Y3FemdCl0mDGHHfRjqgwp5F5HupEy5Nn2w%3D%3D&attredirects=0">the infobar UI</a>. NPAPI support was <a href="https://groups.google.com/a/chromium.org/d/msg/chromium-dev/xEbgvWE7wMk/D_07G2lftacJ">removed</a> from Linux in Chrome 35.</p> <p>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 <a href="https://sites.google.com/a/chromium.org/dev/developers/npapi-deprecation?pli=1">harder-to-bypass page-action blocking UI</a>.</p> <p>Most use cases that previously required NPAPI are <a href="http://www.chromium.org/developers/npapi-deprecation">now</a> supported by JavaScript-based open web technologies. For the few applications that need low-level APIs, threads, and machine-optimized code, <a href="http://www.gonacl.com/">Native Client</a> 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 <a href="https://codereview.chromium.org/212533007">MediaStreams API</a> enables low latency multimedia playback, and the <a href="https://codereview.chromium.org/270213004/">Hardware Decode API</a> enables efficient video decoding.</p> <p>For more information, please see the <a href="http://www.chromium.org/developers/npapi-deprecation">developer NPAPI deprecation guide</a>. We look forward to the transition to a safer, more mobile-friendly web.</p> <br> <span class="post-author">Posted by Justin Schuh, Software Engineer and Plug-in Retirement Planner</span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Update on NPAPI Deprecation&url=https://blog.chromium.org/2014/05/update-on-npapi-deprecation.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/05/update-on-npapi-deprecation.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/05/update-on-npapi-deprecation.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='6893273357058799026' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/05/chrome-36-beta-elementanimate-html.html' itemprop='url' title='Chrome 36 Beta: element.animate(), HTML Imports, and Object.observe()'> Chrome 36 Beta: element.animate(), HTML Imports, and Object.observe() </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, May 22, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Today’s Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes several new developer features to help you make richer, more compelling web content and apps, especially for mobile devices. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <strong>element.animate()</strong><br /> <br /> The forthcoming <a href="http://updates.html5rocks.com/2014/05/Web-Animations---element-animate-is-now-in-Chrome-36">Web Animations JavaScript API</a> lets you animate web content from script. The element.animate() function included in today’s Beta is the first part of the API to ship in Chrome: it makes it possible to create simple CSS Animations using JavaScript. This means that animations can be dynamically generated without paying <a href="http://www.html5rocks.com/en/tutorials/speed/high-performance-animations/">a CSS style recalculation cost</a>. Animations created in this way are also cancelable and provide guaranteed end events (in contrast, CSS Transitions only generate events if they cause a style change). Here's an example of how you'd use it:<br /> <pre><code>elem.animate([ {transform: 'translateX(0px)'}, {transform: 'translateX(100px)'} ], 3000);</code></pre> <strong><br /></strong> <strong>HTML Imports</strong><br /> <br /> <a href="http://www.html5rocks.com/en/tutorials/webcomponents/imports/">HTML Imports</a>, part of the <a href="http://www.w3.org/TR/components-intro/#introduction">Web Components standards umbrella</a>, offer a way to include HTML documents in other HTML documents using <code><link rel="import"></code>:<br /> <pre><code><head> <link rel="import" href="/path/to/imports/stuff.html"> </head></code></pre> An HTML Import can contain CSS, JavaScript, HTML, or anything else an .html file can include. This means they provide a convention for bundling related HTML/CSS/JS (even other HTML Imports) into a single package, making them a fantastic tool for delivering Web Components to users.<br /> <strong><br /></strong> <strong>Data-binding with Object.observe()</strong><br /> <br /> <a href="http://www.html5rocks.com/en/tutorials/es7/observe/">Object.observe()</a> lets you observe changes to JavaScript objects. You can define a callback that observes multiple objects and will receive all changes to any objects in a single asynchronous call. This is especially useful for <a href="http://www.polymer-project.org/">framework authors implementing data-binding</a>.<br /> <pre><code>// 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); }); });</code></pre> <strong><br /></strong> <strong>Other updates in this release</strong><br /> <ul> <li>Chrome <a href="http://updates.html5rocks.com/2014/05/A-More-Compatible-Smoother-Touch">no longer sends touchcancel on touch scroll</a>, improving compatibility with other browsers and making it possible to add touch UI effects like pull-to-refresh without re-implementing scrolling and fling physics in JavaScript.</li> <li>Some CSS properties such as scrollTop and offsetHeight will <a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/_Q7A4AQBFKY">now</a> return fractional values in browser-zoom situations.</li> <li>The new <a href="https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/j27Ou4RtvQI/discussion">WOFF 2.0</a> Web Font compression format offers a 30% average gain over WOFF 1.0 (up to 50%+ in some cases).</li> <li><a href="https://plus.google.com/+RickByers/posts/CBCmhVttj5C">DevTools now faithfully emulates touch with mouse</a>, allowing you to test touch interactions on Chrome for Android using the mobile emulation feature of DevTools.</li> <li><a href="https://code.google.com/p/chromium/issues/detail?id=154772">Unprefixed CSS Transforms</a> enables rich web content by allowing elements to be transformed in two-dimensional or three-dimensional space.</li> <li>The <a href="http://dev.opera.com/articles/css-will-change-property/">will-change</a> property allows developers to give a hint about which properties are about to change, which can help reduce delays at the beginning of animations in some cases.</li> </ul> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates!<br /> Posted by Shane Stephens and Doug Stockwell, Animated Software Engineers <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Today’s Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes several new developer features to help you make richer, more compelling web content and apps, especially for mobile devices. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <strong>element.animate()</strong><br /> <br /> The forthcoming <a href="http://updates.html5rocks.com/2014/05/Web-Animations---element-animate-is-now-in-Chrome-36">Web Animations JavaScript API</a> lets you animate web content from script. The element.animate() function included in today’s Beta is the first part of the API to ship in Chrome: it makes it possible to create simple CSS Animations using JavaScript. This means that animations can be dynamically generated without paying <a href="http://www.html5rocks.com/en/tutorials/speed/high-performance-animations/">a CSS style recalculation cost</a>. Animations created in this way are also cancelable and provide guaranteed end events (in contrast, CSS Transitions only generate events if they cause a style change). Here's an example of how you'd use it:<br /> <pre><code>elem.animate([ {transform: 'translateX(0px)'}, {transform: 'translateX(100px)'} ], 3000);</code></pre> <strong><br /></strong> <strong>HTML Imports</strong><br /> <br /> <a href="http://www.html5rocks.com/en/tutorials/webcomponents/imports/">HTML Imports</a>, part of the <a href="http://www.w3.org/TR/components-intro/#introduction">Web Components standards umbrella</a>, offer a way to include HTML documents in other HTML documents using <code><link rel="import"></code>:<br /> <pre><code><head> <link rel="import" href="/path/to/imports/stuff.html"> </head></code></pre> An HTML Import can contain CSS, JavaScript, HTML, or anything else an .html file can include. This means they provide a convention for bundling related HTML/CSS/JS (even other HTML Imports) into a single package, making them a fantastic tool for delivering Web Components to users.<br /> <strong><br /></strong> <strong>Data-binding with Object.observe()</strong><br /> <br /> <a href="http://www.html5rocks.com/en/tutorials/es7/observe/">Object.observe()</a> lets you observe changes to JavaScript objects. You can define a callback that observes multiple objects and will receive all changes to any objects in a single asynchronous call. This is especially useful for <a href="http://www.polymer-project.org/">framework authors implementing data-binding</a>.<br /> <pre><code>// 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); }); });</code></pre> <strong><br /></strong> <strong>Other updates in this release</strong><br /> <ul> <li>Chrome <a href="http://updates.html5rocks.com/2014/05/A-More-Compatible-Smoother-Touch">no longer sends touchcancel on touch scroll</a>, improving compatibility with other browsers and making it possible to add touch UI effects like pull-to-refresh without re-implementing scrolling and fling physics in JavaScript.</li> <li>Some CSS properties such as scrollTop and offsetHeight will <a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/_Q7A4AQBFKY">now</a> return fractional values in browser-zoom situations.</li> <li>The new <a href="https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/j27Ou4RtvQI/discussion">WOFF 2.0</a> Web Font compression format offers a 30% average gain over WOFF 1.0 (up to 50%+ in some cases).</li> <li><a href="https://plus.google.com/+RickByers/posts/CBCmhVttj5C">DevTools now faithfully emulates touch with mouse</a>, allowing you to test touch interactions on Chrome for Android using the mobile emulation feature of DevTools.</li> <li><a href="https://code.google.com/p/chromium/issues/detail?id=154772">Unprefixed CSS Transforms</a> enables rich web content by allowing elements to be transformed in two-dimensional or three-dimensional space.</li> <li>The <a href="http://dev.opera.com/articles/css-will-change-property/">will-change</a> property allows developers to give a hint about which properties are about to change, which can help reduce delays at the beginning of animations in some cases.</li> </ul> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates!<br /> Posted by Shane Stephens and Doug Stockwell, Animated Software Engineers <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Chrome 36 Beta: element.animate(), HTML Imports, and Object.observe()&url=https://blog.chromium.org/2014/05/chrome-36-beta-elementanimate-html.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/05/chrome-36-beta-elementanimate-html.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/05/chrome-36-beta-elementanimate-html.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://blog.chromium.org/search/label/beta' rel='tag'> beta </a> </span> </div> </div> </div> <div class='post' data-id='6804681613820812567' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/04/testing-chromium-threadsanitizer-v2.html' itemprop='url' title='Testing Chromium: ThreadSanitizer v2, a next-gen data race detector'> Testing Chromium: ThreadSanitizer v2, a next-gen data race detector </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, April 21, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> In 2009, we developed <a href="http://static.googleusercontent.com/media/research.google.com/en/us/pubs/archive/35604.pdf">ThreadSanitizer</a> (aka TSan), a runtime <a href="http://en.wikipedia.org/wiki/Data_race">data race</a> detector based on <a href="http://en.wikipedia.org/wiki/Binary_translation">binary translation</a>. The tool helped find thousands of threading errors in various projects, including <a href="https://code.google.com/p/chromium/issues/list?can=1&q=Stability%3DThreadSanitizer+race+-v2+-status%3Dduplicate&sort=opened+modified&colspec=ID+Pri+M+Iteration+ReleaseBlock+Cr+Status+Owner+Summary+OS+Modified+Opened&x=m&y=releaseblock&cells=tiles">almost 180</a> bugs in Chromium. In 2010, we started experimenting with compiler-based instrumentation instead of binary translation, and once the approach had proven itself, our team redesigned ThreadSanitizer from scratch, focusing on compile-time instrumentation for greater speed and accuracy. <br /> <br /> The new tool, <a href="https://code.google.com/p/thread-sanitizer/">ThreadSanitizer v2</a>, is now part of both <a href="http://llvm.org/">LLVM</a> and <a href="http://gcc.gnu.org/">GCC</a>. Not only is it able to detect data races in C++ and <a href="http://golang.org/">Go</a> code, but it is also able to report synchronization issues like deadlocks, unjoined threads, destroying locked mutexes, use of async-signal unsafe code in signal handlers, and others. <br /> <br /> ThreadSanitizer v2 recognizes atomic operations, so it produces far more accurate reports and can also find bugs in lock-free algorithms, which are hard to detect otherwise. For example, it has helped us find <a href="http://crbug.com/82122">incorrect synchronization in LazyInstance</a>, <a href="http://crbug.com/249750">incorrect lock-free queue implementation</a>, and <a href="http://crbug.com/330528">issues with concurrent sweeping in V8</a>. <br /> <br /> The new version is up to 20 times faster than the old ThreadSanitizer, which makes it possible to use it for heavyweight browser tests. Thanks to this, we’ve found several bugs in code that wasn’t covered by smaller unit tests, like <a href="http://crbug.com/223955">races</a> <a href="http://crbug.com/351292">on the WebKit strings</a>, <a href="http://crbug.com/347559">garbage collection in Blink</a>, <a href="http://crbug.com/265889">a use-after-free in Blink</a>, <a href="https://code.google.com/p/chromium/issues/list?can=1&q=Stability%3DThreadSanitizer++Cr%3DBlink-WebRTC+&colspec=ID+Pri+M+Iteration+ReleaseBlock+Cr+Status+Owner+Summary+OS+Modified&x=m&y=releaseblock&cells=tiles">a handful of reports in WebRTC</a> and many more. This has also improved bug reproducibility: the more times the test is repeated, the higher the chance to reproduce a flaky bug. <br /> <br /> Over the last half-year almost 100 bugs were detected by the new tool, and we’re actively working on more. Our future plans include extensive use of TSan on <a href="http://blog.chromium.org/2012/04/fuzzing-for-security.html">ClusterFuzz</a> and adding regular testing for various Chromium subprojects to catch new regressions quickly. <br /> <br /> The <a href="https://code.google.com/p/thread-sanitizer/wiki/CppManual">ThreadSanitizer page</a> contains all of the information necessary to start using the tool in your project. The tool is easy to use and can be integrated with any buildsystem: just add a single compile-time flag and run the program to see the error reports. For Chromium developers there’s a special <a href="http://dev.chromium.org/developers/testing/threadsanitizer-tsan-v2">page</a> with instructions on <a href="http://dev.chromium.org/">dev.chromium.org</a>. <br /> <br /> Posted by Alexander Potapenko, Software Engineer and Synchronization Lookout <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> In 2009, we developed <a href="http://static.googleusercontent.com/media/research.google.com/en/us/pubs/archive/35604.pdf">ThreadSanitizer</a> (aka TSan), a runtime <a href="http://en.wikipedia.org/wiki/Data_race">data race</a> detector based on <a href="http://en.wikipedia.org/wiki/Binary_translation">binary translation</a>. The tool helped find thousands of threading errors in various projects, including <a href="https://code.google.com/p/chromium/issues/list?can=1&q=Stability%3DThreadSanitizer+race+-v2+-status%3Dduplicate&sort=opened+modified&colspec=ID+Pri+M+Iteration+ReleaseBlock+Cr+Status+Owner+Summary+OS+Modified+Opened&x=m&y=releaseblock&cells=tiles">almost 180</a> bugs in Chromium. In 2010, we started experimenting with compiler-based instrumentation instead of binary translation, and once the approach had proven itself, our team redesigned ThreadSanitizer from scratch, focusing on compile-time instrumentation for greater speed and accuracy. <br /> <br /> The new tool, <a href="https://code.google.com/p/thread-sanitizer/">ThreadSanitizer v2</a>, is now part of both <a href="http://llvm.org/">LLVM</a> and <a href="http://gcc.gnu.org/">GCC</a>. Not only is it able to detect data races in C++ and <a href="http://golang.org/">Go</a> code, but it is also able to report synchronization issues like deadlocks, unjoined threads, destroying locked mutexes, use of async-signal unsafe code in signal handlers, and others. <br /> <br /> ThreadSanitizer v2 recognizes atomic operations, so it produces far more accurate reports and can also find bugs in lock-free algorithms, which are hard to detect otherwise. For example, it has helped us find <a href="http://crbug.com/82122">incorrect synchronization in LazyInstance</a>, <a href="http://crbug.com/249750">incorrect lock-free queue implementation</a>, and <a href="http://crbug.com/330528">issues with concurrent sweeping in V8</a>. <br /> <br /> The new version is up to 20 times faster than the old ThreadSanitizer, which makes it possible to use it for heavyweight browser tests. Thanks to this, we’ve found several bugs in code that wasn’t covered by smaller unit tests, like <a href="http://crbug.com/223955">races</a> <a href="http://crbug.com/351292">on the WebKit strings</a>, <a href="http://crbug.com/347559">garbage collection in Blink</a>, <a href="http://crbug.com/265889">a use-after-free in Blink</a>, <a href="https://code.google.com/p/chromium/issues/list?can=1&q=Stability%3DThreadSanitizer++Cr%3DBlink-WebRTC+&colspec=ID+Pri+M+Iteration+ReleaseBlock+Cr+Status+Owner+Summary+OS+Modified&x=m&y=releaseblock&cells=tiles">a handful of reports in WebRTC</a> and many more. This has also improved bug reproducibility: the more times the test is repeated, the higher the chance to reproduce a flaky bug. <br /> <br /> Over the last half-year almost 100 bugs were detected by the new tool, and we’re actively working on more. Our future plans include extensive use of TSan on <a href="http://blog.chromium.org/2012/04/fuzzing-for-security.html">ClusterFuzz</a> and adding regular testing for various Chromium subprojects to catch new regressions quickly. <br /> <br /> The <a href="https://code.google.com/p/thread-sanitizer/wiki/CppManual">ThreadSanitizer page</a> contains all of the information necessary to start using the tool in your project. The tool is easy to use and can be integrated with any buildsystem: just add a single compile-time flag and run the program to see the error reports. For Chromium developers there’s a special <a href="http://dev.chromium.org/developers/testing/threadsanitizer-tsan-v2">page</a> with instructions on <a href="http://dev.chromium.org/">dev.chromium.org</a>. <br /> <br /> Posted by Alexander Potapenko, Software Engineer and Synchronization Lookout <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Testing Chromium: ThreadSanitizer v2, a next-gen data race detector&url=https://blog.chromium.org/2014/04/testing-chromium-threadsanitizer-v2.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/04/testing-chromium-threadsanitizer-v2.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/04/testing-chromium-threadsanitizer-v2.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> </div> </div> </div> <div class='post' data-id='5543782418628976310' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2014/04/chrome-35-beta-more-developer-control.html' itemprop='url' title='Chrome 35 Beta: More developer control over touch input, new JavaScript features, and unprefixed Shadow DOM'> Chrome 35 Beta: More developer control over touch input, new JavaScript features, and unprefixed Shadow DOM </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, April 10, 2014 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Today’s Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes a slew of new developer features to help you make richer, more compelling web content and apps, especially for mobile devices. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>More developer control over touch and zoom input</b><br /> <br /> The <a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/sc5lHnlcLvM">touch-action CSS property</a> offers developers a declarative mechanism to selectively disable touch scrolling, pinch-zooming, or double-tap-zooming on parts of their web content. Use cases include precise control over the dreaded <a href="http://updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away">300ms click delay on mobile</a>, reliable side-swipe UIs, and high-fidelity <a href="http://www.polymer-project.org/platform/pointer-events.html">polyfills of Pointer Events</a>. It’s also a prerequisite for future optimizations to enable scrolling and zooming that never block on <a href="http://dev.chromium.org/developers/design-documents/compositor-thread-architecture">the main thread</a>. Update May 20th: touch-action has been <a href="http://code.google.com/p/chromium/issues/detail?id=258459">delayed</a> until Chrome 36.<br /> <br /> Also new in this release, web content on desktop computers will now receive <a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/BW4hshtMsmo">mouse scroll wheel events with the ctrlKey modifier set</a>. There are many sites that want to do something more appropriate for the user than trigger browser zoom. For example, when a user holds control and scrolls over a map in Google Maps, they almost certainly want to zoom in on the map, not invoke browser zoom to zoom the page. This change will enable such a use case.<br /> <br /> <b>New JavaScript functionality</b><br /> <br /> Chrome 35 includes support for a number of new JavaScript features defined in the <a href="https://wiki.mozilla.org/ES6_plans">ECMAScript 6 standard</a>. Together, they will help JavaScript developers write application logic that is easier to read, more powerful, and more memory efficient. <br /> <br /> A <a href="http://www.html5rocks.com/en/tutorials/es6/promises/#toc-async">Promise</a> represents a value that may not be available yet but will be known at some point in future. With Promises, you can write cleaner asynchronous code. <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap">WeakMaps</a> and <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet">WeakSets</a> allow you to create efficient, garbage-collected data structures. In both, references to objects are held weakly: if there is no other reference to an object stored in the WeakSet, it can be garbage collected. This helps avoid memory leaks.<br /> <br /> <a href="http://updates.html5rocks.com/2012/11/Respond-to-change-with-Object-observe">Object.observe</a> lets you observe changes to JavaScript objects. Your callback can observe multiple objects and will receive all changes to any objects in a single asynchronous call. This is especially useful for <a href="http://www.polymer-project.org/">framework authors implementing data-binding</a>.<br /> <br /> Update April 29th: Object.observe has been pushed back to Chrome 36.<br /> <br /> <b>Unprefixed Shadow DOM</b><br /> <br /> Shadow DOM is one of several new API primitives landing under the <a href="http://w3c.github.io/webcomponents/explainer/">Web Components</a> umbrella. It brings reliable composition of user interface elements to the web platform and allow developers to:<br /> <ol> <li> Scope their HTML markup, CSS, hiding the implementation details of complex components. </li> <li> Build their own first-class elements and APIs just like the <video> or <audio>, when combined with <a href="http://www.html5rocks.com/en/tutorials/webcomponents/customelements/">Custom Elements</a> </li> </ol> With Shadow DOM, web frameworks can stop worrying about their widgets inadvertently breaking pages by using conflicting CSS selectors, class or id names, and start relying on DOM as the interoperable way of building components.<br /> <br /> Numerous improvements and changes have been made to the specification since the days of the prefixed implementation of Shadow DOM <a href="http://blog.chromium.org/2013/01/content-security-policy-and-shadow-dom.html">made available in Chrome 25</a>, so if you were already using the prefixed Shadow DOM API please take a look at the latest documentation as well as the up-to-date <a href="http://www.html5rocks.com/en/tutorials/?page=1">HTML5 Rocks articles</a> and look for deprecation warnings.<br /> <br /> <b>Other new features in this release</b><br /> <ul> <li> <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/kWkdUACnPn4/G_ZLiuQcwFoJ">CSS Font Loading</a> can be used to dynamically load font resources. It gives developers more control over the user experience on pages that use Web Fonts. For instance, you can ask Chrome to start downloading the web fonts you'll need on demand and be notified when they become available. </li> <li> The SVG <a href="http://crbug.com/343496">'paint-order' property</a> offers a way to control the order in which fill, stroke and markers are painted. </li> <li> The unprefixed version of the <a href="http://www.html5rocks.com/en/tutorials/webaudio/intro/">Web Audio API</a>. </li> </ul> <b>Removed features</b><br /> <br /> Web platform feature deprecation and removal are important for the health of the web. Removing features allows browser vendors like Chromium to simplify our codebases, minimize security attack surfaces, and, most importantly, evolve the web API surface to address the needs of today’s users and developers.<br /> <br /> Features removed in this release include <a href="https://groups.google.com/a/chromium.org/d/msg/blink-dev/Bxe7DnDVRZ0/5K61HQPrNK4J">HTMLVideoElement-specific prefixed fullscreen API</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/R34xpMQGtXU/XwXsi85Y7acJ">TextTrackCue constructor</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/14q_I06gwg8/0a3JI0kjbC0J"><isindex></a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/8vqyfHa8_dw/4W2v9QTAinYJ">Legacy Web Notifications</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/8p-gwWL4ypc/RJaJYAu6_ccJ">document.createAttributeNS</a>, <a href="https://groups.google.com/a/chromium.org/d/topic/chromium-dev/xEbgvWE7wMk">support for NPAPI on Linux</a>, and <a href="https://groups.google.com/a/chromium.org/d/msg/blink-dev/ai6_ySyVITg/Zff4AYrxQ-4J">Attr.isId, ownerElement, prefix setter</a>. If you’d like to hear more about these changes or participant in discussions, please chime in our <a href="https://groups.google.com/a/chromium.org/d/forum/blink-dev">mailing list</a> and look for "Intent to Remove" or “Intent to Deprecate” threads.<br /> <br /> <b>Recently deprecated features</b><br /> <br /> The most prominent recently deprecated feature is <a href="https://groups.google.com/a/chromium.org/d/msg/blink-dev/xh9fPX0ijqk/ixHZCOH6GLgJ">window.showModalDialog</a>, which will be removed in our next release, Chrome 36. Please read <a href="http://dev.opera.com/articles/view/showmodaldialog/">Opera’s explanation of the change</a> to learn more. Other deprecated features include <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/jS7iCEmoWfQ/bbHtaV54iBkJ">Element.setAttributeNodeNS</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/yBr6Aw3UokU/MPSHNg-H068J">overflowchanged Event</a>, <a href="https://groups.google.com/a/chromium.org/d/msg/blink-dev/L5h6KP5nmbE/CGlSWugrFl0J">HTMLSourceElement.media,</a> <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/C3h1LApSVx8/G2s2OV5azvgJ">MediaError.MEDIA_ERR_ENCRYPTED</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/6CEtU6nhcS4/2fzhpRi8d98J">Prefixed media source extensions</a>, and <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/nNsZDn_utUc/dUtD3ulsFMkJ">webkitRequestAnimationFrame</a>. Support for these features will be completely removed from Chrome in a future release.<br /> <br /> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates!<br /> <br /> Posted by <a href="http://plus.google.com/+RickByers">Rick Byers</a>, Software Engineer and Touch API Tamer <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Today’s Chrome <a href="https://www.google.com/landing/chrome/beta/">Beta</a> channel release includes a slew of new developer features to help you make richer, more compelling web content and apps, especially for mobile devices. Unless otherwise noted, changes described below apply to Chrome for Android, Windows, Mac, Linux, and Chrome OS.<br /> <br /> <b>More developer control over touch and zoom input</b><br /> <br /> The <a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/sc5lHnlcLvM">touch-action CSS property</a> offers developers a declarative mechanism to selectively disable touch scrolling, pinch-zooming, or double-tap-zooming on parts of their web content. Use cases include precise control over the dreaded <a href="http://updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away">300ms click delay on mobile</a>, reliable side-swipe UIs, and high-fidelity <a href="http://www.polymer-project.org/platform/pointer-events.html">polyfills of Pointer Events</a>. It’s also a prerequisite for future optimizations to enable scrolling and zooming that never block on <a href="http://dev.chromium.org/developers/design-documents/compositor-thread-architecture">the main thread</a>. Update May 20th: touch-action has been <a href="http://code.google.com/p/chromium/issues/detail?id=258459">delayed</a> until Chrome 36.<br /> <br /> Also new in this release, web content on desktop computers will now receive <a href="https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/BW4hshtMsmo">mouse scroll wheel events with the ctrlKey modifier set</a>. There are many sites that want to do something more appropriate for the user than trigger browser zoom. For example, when a user holds control and scrolls over a map in Google Maps, they almost certainly want to zoom in on the map, not invoke browser zoom to zoom the page. This change will enable such a use case.<br /> <br /> <b>New JavaScript functionality</b><br /> <br /> Chrome 35 includes support for a number of new JavaScript features defined in the <a href="https://wiki.mozilla.org/ES6_plans">ECMAScript 6 standard</a>. Together, they will help JavaScript developers write application logic that is easier to read, more powerful, and more memory efficient. <br /> <br /> A <a href="http://www.html5rocks.com/en/tutorials/es6/promises/#toc-async">Promise</a> represents a value that may not be available yet but will be known at some point in future. With Promises, you can write cleaner asynchronous code. <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap">WeakMaps</a> and <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet">WeakSets</a> allow you to create efficient, garbage-collected data structures. In both, references to objects are held weakly: if there is no other reference to an object stored in the WeakSet, it can be garbage collected. This helps avoid memory leaks.<br /> <br /> <a href="http://updates.html5rocks.com/2012/11/Respond-to-change-with-Object-observe">Object.observe</a> lets you observe changes to JavaScript objects. Your callback can observe multiple objects and will receive all changes to any objects in a single asynchronous call. This is especially useful for <a href="http://www.polymer-project.org/">framework authors implementing data-binding</a>.<br /> <br /> Update April 29th: Object.observe has been pushed back to Chrome 36.<br /> <br /> <b>Unprefixed Shadow DOM</b><br /> <br /> Shadow DOM is one of several new API primitives landing under the <a href="http://w3c.github.io/webcomponents/explainer/">Web Components</a> umbrella. It brings reliable composition of user interface elements to the web platform and allow developers to:<br /> <ol> <li> Scope their HTML markup, CSS, hiding the implementation details of complex components. </li> <li> Build their own first-class elements and APIs just like the <video> or <audio>, when combined with <a href="http://www.html5rocks.com/en/tutorials/webcomponents/customelements/">Custom Elements</a> </li> </ol> With Shadow DOM, web frameworks can stop worrying about their widgets inadvertently breaking pages by using conflicting CSS selectors, class or id names, and start relying on DOM as the interoperable way of building components.<br /> <br /> Numerous improvements and changes have been made to the specification since the days of the prefixed implementation of Shadow DOM <a href="http://blog.chromium.org/2013/01/content-security-policy-and-shadow-dom.html">made available in Chrome 25</a>, so if you were already using the prefixed Shadow DOM API please take a look at the latest documentation as well as the up-to-date <a href="http://www.html5rocks.com/en/tutorials/?page=1">HTML5 Rocks articles</a> and look for deprecation warnings.<br /> <br /> <b>Other new features in this release</b><br /> <ul> <li> <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/kWkdUACnPn4/G_ZLiuQcwFoJ">CSS Font Loading</a> can be used to dynamically load font resources. It gives developers more control over the user experience on pages that use Web Fonts. For instance, you can ask Chrome to start downloading the web fonts you'll need on demand and be notified when they become available. </li> <li> The SVG <a href="http://crbug.com/343496">'paint-order' property</a> offers a way to control the order in which fill, stroke and markers are painted. </li> <li> The unprefixed version of the <a href="http://www.html5rocks.com/en/tutorials/webaudio/intro/">Web Audio API</a>. </li> </ul> <b>Removed features</b><br /> <br /> Web platform feature deprecation and removal are important for the health of the web. Removing features allows browser vendors like Chromium to simplify our codebases, minimize security attack surfaces, and, most importantly, evolve the web API surface to address the needs of today’s users and developers.<br /> <br /> Features removed in this release include <a href="https://groups.google.com/a/chromium.org/d/msg/blink-dev/Bxe7DnDVRZ0/5K61HQPrNK4J">HTMLVideoElement-specific prefixed fullscreen API</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/R34xpMQGtXU/XwXsi85Y7acJ">TextTrackCue constructor</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/14q_I06gwg8/0a3JI0kjbC0J"><isindex></a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/8vqyfHa8_dw/4W2v9QTAinYJ">Legacy Web Notifications</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/8p-gwWL4ypc/RJaJYAu6_ccJ">document.createAttributeNS</a>, <a href="https://groups.google.com/a/chromium.org/d/topic/chromium-dev/xEbgvWE7wMk">support for NPAPI on Linux</a>, and <a href="https://groups.google.com/a/chromium.org/d/msg/blink-dev/ai6_ySyVITg/Zff4AYrxQ-4J">Attr.isId, ownerElement, prefix setter</a>. If you’d like to hear more about these changes or participant in discussions, please chime in our <a href="https://groups.google.com/a/chromium.org/d/forum/blink-dev">mailing list</a> and look for "Intent to Remove" or “Intent to Deprecate” threads.<br /> <br /> <b>Recently deprecated features</b><br /> <br /> The most prominent recently deprecated feature is <a href="https://groups.google.com/a/chromium.org/d/msg/blink-dev/xh9fPX0ijqk/ixHZCOH6GLgJ">window.showModalDialog</a>, which will be removed in our next release, Chrome 36. Please read <a href="http://dev.opera.com/articles/view/showmodaldialog/">Opera’s explanation of the change</a> to learn more. Other deprecated features include <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/jS7iCEmoWfQ/bbHtaV54iBkJ">Element.setAttributeNodeNS</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/yBr6Aw3UokU/MPSHNg-H068J">overflowchanged Event</a>, <a href="https://groups.google.com/a/chromium.org/d/msg/blink-dev/L5h6KP5nmbE/CGlSWugrFl0J">HTMLSourceElement.media,</a> <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/C3h1LApSVx8/G2s2OV5azvgJ">MediaError.MEDIA_ERR_ENCRYPTED</a>, <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/6CEtU6nhcS4/2fzhpRi8d98J">Prefixed media source extensions</a>, and <a href="https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/nNsZDn_utUc/dUtD3ulsFMkJ">webkitRequestAnimationFrame</a>. Support for these features will be completely removed from Chrome in a future release.<br /> <br /> As always, visit <a href="http://chromestatus.com/features">chromestatus.com/features</a> for a complete overview of Chrome’s developer features, and circle <a href="https://plus.google.com/+GoogleChromeDevelopers">+Google Chrome Developers</a> for more frequent updates!<br /> <br /> Posted by <a href="http://plus.google.com/+RickByers">Rick Byers</a>, Software Engineer and Touch API Tamer <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </noscript> </div> </div> <div class='share'> <span class='twitter-custom social-wrapper' data-href='http://twitter.com/share?text=Chromium Blog:Chrome 35 Beta: More developer control over touch input, new JavaScript features, and unprefixed Shadow DOM&url=https://blog.chromium.org/2014/04/chrome-35-beta-more-developer-control.html&via=ChromiumDev'> <img alt='Share on Twitter' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_twitter_black_24dp.png' width='24'/> </span> <span class='fb-custom social-wrapper' data-href='https://www.facebook.com/sharer.php?u=https://blog.chromium.org/2014/04/chrome-35-beta-more-developer-control.html'> <img alt='Share on Facebook' height='24' src='https://www.gstatic.com/images/icons/material/system/2x/post_facebook_black_24dp.png' width='24'/> </span> </div> <div class='post-footer'> <div class='cmt_iframe_holder' data-href='https://blog.chromium.org/2014/04/chrome-35-beta-more-developer-control.html' data-viewtype='FILTERED_POSTMOD'></div> <a href='https://plus.google.com/112374322230920073195' rel='author' style='display:none;'> Google </a> <div class='label-footer'> <span class='labels-caption'> Labels: </span> <span class='labels'> <a class='label' href='https://blog.chromium.org/search/label/beta' rel='tag'> beta </a> </span> </div> </div> </div> <div class='blog-pager' id='blog-pager'> <a class='home-link' href='https://blog.chromium.org/'> <i class='material-icons'>  </i> </a> <span id='blog-pager-newer-link'> <a class='blog-pager-newer-link' href='https://blog.chromium.org/search?updated-max=2015-04-16T09:57:00-07:00&max-results=7&reverse-paginate=true' id='Blog1_blog-pager-newer-link' title='Newer Posts'> <i class='material-icons'>  </i> </a> </span> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href='https://blog.chromium.org/search?updated-max=2014-04-10T09:54:00-07:00&max-results=7' id='Blog1_blog-pager-older-link' title='Older Posts'> <i class='material-icons'>  </i> </a> </span> </div> <div class='clear'></div> </div></div> </div> </div> <div class='col-right'> <div class='section' id='sidebar-top'><div class='widget HTML' data-version='1' id='HTML8'> <div class='widget-content'> <div class='searchBox'> <input type='text' title='Search This Blog' placeholder='Search blog ...' /> </div> </div> <div class='clear'></div> </div></div> <div id='aside'> <div class='section' id='sidebar'><div class='widget Label' data-version='1' id='Label1'> <div class='tab'> <img class='sidebar-icon' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYpJREFUeNrs2aFuwzAQBmAvKRkMKRjZA4QMDJaWFgyMjuzFRg37DIUlA3uFkoGQSaWzJU+tpri5O9+l/zSfdFJlpe59yTmyVedq1PjfcZMZ70NuQnaF8w8htyE/rABtpviXkLcK88c5HhLkMBfgVan43zfFBNGMjHVGT/s55KP2pAvidbGHd+nzKt1RKSLG3rKF1iPFv6UWiPke8i7kEqGdGsI1O+LYVdqJAjgirwkKYD0ytkJBUNbAMvX8V3q9PhUsYvU1sWD8SO/sQvx2ahxOiNoJCSBCoAHYCEQAC4EKICOQASQEOmAS8RcAFxFN5hiIiugpgC3wk9hQAHH/70EBHXUN7IER5EWMiBgo2+nzOKQv9SCAeEM/OQAkhE/ncccFICB87qzQMia5FsJfOui0zMnmRvipU1ormHQuxGTxUsAcCFLxJQBLBLn4UoAFglW8BkATwS5eC6CBEBWvCShBiIvXBkgQRcVbADiI4uKtABSESvGWgB9EzHt3+tNwyO0qa9SoIYtvAQYAqDJhaWWeMecAAAAASUVORK5CYII='/> <h2> Labels </h2> <i class='material-icons arrow'>  </i> </div> <div class='widget-content list-label-widget-content'> <ul> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/%24200K'> $200K </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/10th%20birthday'> 10th birthday </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/abusive%20ads'> abusive ads </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/abusive%20notifications'> abusive notifications </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/accessibility'> accessibility </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/ad%20blockers'> ad blockers </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/ad%20blocking'> ad blocking </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/advanced%20capabilities'> advanced capabilities </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/android'> android </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/anti%20abuse'> anti abuse </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/anti-deception'> anti-deception </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/background%20periodic%20sync'> background periodic sync </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/badging'> badging </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/benchmarks'> benchmarks </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/beta'> beta </a> <span dir='ltr'> 83 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/better%20ads%20standards'> better ads standards </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/billing'> billing </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/birthday'> birthday </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/blink'> blink </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/browser'> browser </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/browser%20interoperability'> browser interoperability </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/bundles'> bundles </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/capabilities'> capabilities </a> <span dir='ltr'> 6 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/capable%20web'> capable web </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/cds'> cds </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/cds18'> cds18 </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/cds2018'> cds2018 </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome'> chrome </a> <span dir='ltr'> 35 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%2081'> chrome 81 </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%2083'> chrome 83 </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%2084'> chrome 84 </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20ads'> chrome ads </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20apps'> chrome apps </a> <span dir='ltr'> 5 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Chrome%20dev'> Chrome dev </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20dev%20summit'> chrome dev summit </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20dev%20summit%202018'> chrome dev summit 2018 </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20dev%20summit%202019'> chrome dev summit 2019 </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20developer'> chrome developer </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Chrome%20Developer%20Center'> Chrome Developer Center </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20developer%20summit'> chrome developer summit </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20devtools'> chrome devtools </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Chrome%20extension'> Chrome extension </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20extensions'> chrome extensions </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Chrome%20Frame'> Chrome Frame </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Chrome%20lite'> Chrome lite </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Chrome%20on%20Android'> Chrome on Android </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20on%20ios'> chrome on ios </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Chrome%20on%20Mac'> Chrome on Mac </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Chrome%20OS'> Chrome OS </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20privacy'> chrome privacy </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20releases'> chrome releases </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20security'> chrome security </a> <span dir='ltr'> 10 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chrome%20web%20store'> chrome web store </a> <span dir='ltr'> 32 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chromedevtools'> chromedevtools </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chromeframe'> chromeframe </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chromeos'> chromeos </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chromeos.dev'> chromeos.dev </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/chromium'> chromium </a> <span dir='ltr'> 9 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/cloud%20print'> cloud print </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/coalition'> coalition </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/coalition%20for%20better%20ads'> coalition for better ads </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/contact%20picker'> contact picker </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/content%20indexing'> content indexing </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/cookies'> cookies </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/core%20web%20vitals'> core web vitals </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/csrf'> csrf </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/css'> css </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/cumulative%20layout%20shift'> cumulative layout shift </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/custom%20tabs'> custom tabs </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/dart'> dart </a> <span dir='ltr'> 8 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/dashboard'> dashboard </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Data%20Saver'> Data Saver </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Data%20saver%20desktop%20extension'> Data saver desktop extension </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/day%202'> day 2 </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/deceptive%20installation'> deceptive installation </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/declarative%20net%20request%20api'> declarative net request api </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/design'> design </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/developer%20dashboard'> developer dashboard </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Developer%20Program%20Policy'> Developer Program Policy </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/developer%20website'> developer website </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/devtools'> devtools </a> <span dir='ltr'> 13 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/digital%20event'> digital event </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/discoverability'> discoverability </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/DNS-over-HTTPS'> DNS-over-HTTPS </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/DoH'> DoH </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/emoji'> emoji </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/emscriptem'> emscriptem </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/enterprise'> enterprise </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/extensions'> extensions </a> <span dir='ltr'> 27 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Fast%20badging'> Fast badging </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/faster%20web'> faster web </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/features'> features </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/feedback'> feedback </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/field%20data'> field data </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/first%20input%20delay'> first input delay </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Follow'> Follow </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/fonts'> fonts </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/form%20controls'> form controls </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/frameworks'> frameworks </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/fugu'> fugu </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/fund'> fund </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/funding'> funding </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/gdd'> gdd </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/google%20earth'> google earth </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/google%20event'> google event </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/google%20io%202019'> google io 2019 </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/google%20web%20developer'> google web developer </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/googlechrome'> googlechrome </a> <span dir='ltr'> 12 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/harmful%20ads'> harmful ads </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/html5'> html5 </a> <span dir='ltr'> 11 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/HTTP%2F3'> HTTP/3 </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/HTTPS'> HTTPS </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/iframes'> iframes </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/images'> images </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/incognito'> incognito </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/insecure%20forms'> insecure forms </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/intent%20to%20explain'> intent to explain </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/ios'> ios </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/ios%20Chrome'> ios Chrome </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/issue%20tracker'> issue tracker </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/jank'> jank </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/javascript'> javascript </a> <span dir='ltr'> 5 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/lab%20data'> lab data </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/labelling'> labelling </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/largest%20contentful%20paint'> largest contentful paint </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/launch'> launch </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/lazy-loading'> lazy-loading </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/lighthouse'> lighthouse </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/linux'> linux </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Lite%20Mode'> Lite Mode </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Lite%20pages'> Lite pages </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/loading%20interventions'> loading interventions </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/loading%20optimizations'> loading optimizations </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/lock%20icon'> lock icon </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/long-tail'> long-tail </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/mac'> mac </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/manifest%20v3'> manifest v3 </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/metrics'> metrics </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/microsoft%20edge'> microsoft edge </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/mixed%20forms'> mixed forms </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/mobile'> mobile </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/na'> na </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/native%20client'> native client </a> <span dir='ltr'> 8 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/native%20file%20system'> native file system </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/New%20Features'> New Features </a> <span dir='ltr'> 5 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/notifications'> notifications </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/octane'> octane </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/open%20web'> open web </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/origin%20trials'> origin trials </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/pagespeed%20insights'> pagespeed insights </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/pagespeedinsights'> pagespeedinsights </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/passwords'> passwords </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/payment%20handler'> payment handler </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/payment%20request'> payment request </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/payments'> payments </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/performance'> performance </a> <span dir='ltr'> 20 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/performance%20tools'> performance tools </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/permission%20UI'> permission UI </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/permissions'> permissions </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/play%20store'> play store </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/portals'> portals </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/prefetching'> prefetching </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/privacy'> privacy </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/privacy%20sandbox'> privacy sandbox </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/private%20prefetch%20proxy'> private prefetch proxy </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/profile%20guided%20optimization'> profile guided optimization </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/progressive%20web%20apps'> progressive web apps </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Project%20Strobe'> Project Strobe </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/protection'> protection </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/pwa'> pwa </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/QUIC'> QUIC </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/quieter%20permissions'> quieter permissions </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/releases'> releases </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/removals'> removals </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/rlz'> rlz </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/root%20program'> root program </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/safe%20browsing'> safe browsing </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/Secure%20DNS'> Secure DNS </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/security'> security </a> <span dir='ltr'> 36 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/site%20isolation'> site isolation </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/slow%20loading'> slow loading </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/sms%20receiver'> sms receiver </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/spam%20policy'> spam policy </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/spdy'> spdy </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/spectre'> spectre </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/speed'> speed </a> <span dir='ltr'> 4 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/ssl'> ssl </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/store%20listing'> store listing </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/strobe'> strobe </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/subscription%20pages'> subscription pages </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/suspicious%20site%20reporter%20extension'> suspicious site reporter extension </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/TCP'> TCP </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/the%20fast%20and%20the%20curious'> the fast and the curious </a> <span dir='ltr'> 23 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/TLS'> TLS </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/tools'> tools </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/tracing'> tracing </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/transparency'> transparency </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/trusted%20web%20activities'> trusted web activities </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/twa'> twa </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/user%20agent%20string'> user agent string </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/user%20data%20policy'> user data policy </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/v8'> v8 </a> <span dir='ltr'> 6 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/video'> video </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/wasm'> wasm </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web'> web </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web%20apps'> web apps </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web%20assembly'> web assembly </a> <span dir='ltr'> 2 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web%20developers'> web developers </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web%20intents'> web intents </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web%20packaging'> web packaging </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web%20payments'> web payments </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web%20platform'> web platform </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web%20request%20api'> web request api </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web%20vitals'> web vitals </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web.dev'> web.dev </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/web.dev%20live'> web.dev live </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/webapi'> webapi </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/webassembly'> webassembly </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/webaudio'> webaudio </a> <span dir='ltr'> 3 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/webgl'> webgl </a> <span dir='ltr'> 7 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/webkit'> webkit </a> <span dir='ltr'> 5 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/WebM'> WebM </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/webmaster'> webmaster </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/webp'> webp </a> <span dir='ltr'> 5 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/webrtc'> webrtc </a> <span dir='ltr'> 6 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/websockets'> websockets </a> <span dir='ltr'> 5 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/webtiming'> webtiming </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/writable-files'> writable-files </a> <span dir='ltr'> 1 </span> </li> <li> <a dir='ltr' href='https://blog.chromium.org/search/label/yerba%20beuna%20center%20for%20the%20arts'> yerba beuna center for the arts </a> <span dir='ltr'> 1 </span> </li> </ul> <div class='clear'></div> </div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <div class='tab'> <i class='material-icons icon'>  </i> <h2> Archive </h2> <i class='material-icons arrow'>  </i> </div> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2024/'> 2024 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2024/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2024/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2024/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2024/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2024/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2024/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2023/'> 2023 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2023/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2023/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2023/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2023/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2023/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2023/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2023/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2023/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2022/'> 2022 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2022/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2022/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2022/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2022/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2022/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2022/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2022/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2022/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2022/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2021/'> 2021 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2021/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2020/'> 2020 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2020/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2019/'> 2019 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2019/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2018/'> 2018 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2018/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2017/'> 2017 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2017/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2016/'> 2016 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2016/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2015/'> 2015 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2015/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate expanded'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy toggle-open'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2014/'> 2014 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate expanded'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2014/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2013/'> 2013 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2013/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2012/'> 2012 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2012/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2011/'> 2011 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2011/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2010/'> 2010 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2010/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2009/'> 2009 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/08/'> Aug </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/07/'> Jul </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/06/'> Jun </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/05/'> May </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/04/'> Apr </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/03/'> Mar </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/02/'> Feb </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2009/01/'> Jan </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'>  </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'>  </i>   </span> </a> <a class='post-count-link' href='https://blog.chromium.org/2008/'> 2008 </a> </div> <div class='items'> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2008/12/'> Dec </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2008/11/'> Nov </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2008/10/'> Oct </a> </div> <div class='items'> </div> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <div class=''> <a class='post-count-link' href='https://blog.chromium.org/2008/09/'> Sep </a> </div> <div class='items'> </div> </li> </ul> </div> </li> </ul> </div> </div> <div class='clear'></div> </div> </div><div class='widget HTML' data-version='1' id='HTML6'> <div class='widget-content'> <a href="http://blog.chromium.org/atom.xml"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAihJREFUeNrsWa9Pw0AU7viRMDFRBAkzJDMIBIhJJhCzk7NILIqMv4AEhdz+BCY3OYssAlGBoAJREpZwAlHEBO8lr8nSvNeVbu1dyX3JlzTrXfa+u/e9d7c5joWFhYVO1Fa8PwH2gK6m+BRwAvSlAdsrgr8E1jUuMH73GTAEzrkBWymTewZlihhLmgDXIAFuHgGVQOUF7OSYM1p6PgTuA1vAZlUEvAnPdapcMY0VICECekQ0XRfYrqoHsAGNgXfAoMomRiFDEhOZkkL3S88hMaB2LwXp0bj+ps2edpToZpjfoIDQtBeU+xjoDzP2G/gCPKZ5f8WsCAFJoJgOCcFdWSTeL9YQMSvTA1h9BkI5jaiXhLpSCL/8mVZY0UpyJ9ZdOkniu1dmJ96BpzQu9w6s28gcOq9j6pwLdR8/36NK5CQKwJSMrb2MhhSglBpt4UjsrdsnNu0B3J0HCozbCc4TjyY2srEgos/4RQljCzNxl4ireQD8FOq+T+W0mTB2g7njhlR+Sy2jsXFvU658U8YTbeaGpdIu7mWkEAq5ZtIjIhFZdtfX7QHckSvB2B6zC3VdAkZk0kAQwaXTk/CzTXK3wjIExCs6ZJpTnE4uY1KV+KzFzA3KTiFPENHJkOPcsfpLhwe4btoSuvUqAR+6TOxlCE6ZfKUsJLgsqGW8OpqAGx2X+sLxrwUog+JUeQRMDBIwyXOcnlPtPnL0/UsT/8LnOxYWFhZG4leAAQAAQHEaYuzHbAAAAABJRU5ErkJggg==" class="sidebar-icon" /> <h2>Feed</h2> </a> </div> <div class='clear'></div> </div></div> <div class='section' id='sidebar-bottom'><div class='widget HTML' data-version='1' id='HTML4'> <div class='widget-content'> <div class="share followgooglewrapper"> <button data-href="https://twitter.com/intent/follow?original_referer=http://blog.chromium.org/&screen_name=ChromiumDev" onclick='sharingPopup(this);' id='twitter-share'><span class="twitter-follow">Follow @ChromiumDev</span></button> <script> function sharingPopup (button) { var url = button.getAttribute("data-href"); window.open( url,'popUpWindow','height=500,width=500,left=10,top=10,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'); } </script> </div> </div> <div class='clear'></div> </div><div class='widget HTML' data-version='1' id='HTML1'> <div class='widget-content'> Give us feedback in our <a href="http://support.google.com/bin/static.py?hl=en&page=portal_groups.cs">Product Forums</a>. </div> <div class='clear'></div> </div></div> </div> </div> <div style='clear:both;'></div> </div> <!-- Footer --> <div class='google-footer-outer loading'> <div id='google-footer'> <a href='//www.google.com/'> <img class='google-logo-dark' height='36' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABICAYAAABFoT/eAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACLVJREFUeNrsXd+L20YQ3vOprdLqiMXFXE2qB7dcwEcTSB7ykIc+9A/PQx/yEMq1TWhNuYIpJriNr7XpmZ5IxFEvmW2EKs3Ornb1w50PxIFP0kiz387OzM6uhGAwGAxGP3Ho+f7x7ri1O7LdccPqZjSNA4dEHsLfaHcEFedJom93x9Xu2OyOFTcBo6sED3fHZHeMEELrkAHJF0B8Rr+gDFsZ5n0luLTQ95AXs4W06D/tjpR50xtM4CjD0y48YGB4rnyZxNOzyA7zBHr+nLnDaJLg0mo/ALekCasg3Z4XbM0ZdTEgnDPeHY8bIne+Qz2GvwyGNwsuyT218KWvIIBMcwGpLiipcolecjMxfBDchNyS1EvxLiOSIecp31q6IJ/C3yrIrMqMm4jhg+AxkdwbIO3aUO4KjqqMjCT3uaazMBhWBJfuxH3CtRfiXf66DhSRZWbmlMnNaILgZxrXJQO/eO3wORZwvwm4JUxuhheCjzVBYAbW1ces45YDSoZrFNOEE835M8FT6oyeEnws8Fz3QnBxFKPHBMem4GU+m6fPGb0leCTwWcM5B36MPgeZI01gudyDdw3hPeXfo8L/rmCUWnuMMdqUL2WqWeRbhf+twfVsO7YagZGNC79fw7OthEVtkiJ4jJzTd3KPwf3CRqhhiTu23AP5sl0/0xiwISQXpNwLIJK87mHF+U8ddzzdmgKlGzlPYjyxGJQouIhNT4k9AqWEFkqfguIvagTWbcq3KW1WE3xS3m8NtA9WS451xofwjKT5kkDoK/b6mDk5FfXr1lWDL4BofZEv2/SRsK/EHGlGdBdu8QNRb8HMCFwt7Yy3DDI/QP7fx5z3VLhdlJEIs4rKNuXXJXdxZPdB7kfCzWqwCO4V1LHgLjInX3tQ1KzCR52Cz+vDj1dydeRuS74rcvs2Pi6fT5H8OaaUQPQPYcWwRSGXyhhscn5dpAnEFMkuEZetbfkTAnlSuH4DxisE+aMGeJAQ3lFl7C4LJE6QWCaCd583ORQ1jYAwjFctal7nOs2ZZvicwvlZx+RHGrcoAwKUVX8uwcc/9TT65INeDOr5shL9LDRB6QTeIy3zwfdh3WOi6axLCEhSjXU7F3h6LqggUtvyJxpynwu8tDkD98fXApOxRj8zoZ9MnGveYVIVZKaGrkBXCY65BCYNN9NkjpKOyQ81Q79JgdxS+Jn3SDTEXRI7SWzaiSTB32oI3nU3BvMfM0urhOVYgwKhuiAfc4tM07wXwm1ZRoQYSl2NUwiu01fEAHVcpixd745FvVz4dzUUc0o8rwoLy8ZSwU6CyFx1RP5II9+1bFPEFs9HWbNLiimDXE+vCm7u1CS47cofzD3aEhVY57mxRo5zlqdt+RFC1JUH2S7bcVXg4liTMakaBZZVxiTICRoivcn1sEUBlk24JmaC6kxUbYmWoqvyfck2xZGGnDFYa9MMzkYQ1ijkCX6qidybrgePiQ0QIQqoi6qRLeqQfIoRsEHaQJLBdHOnLGetSdm/IPcymJuS1PAnbQPH0MOw/39C1vL11DiLOqIsbDI8QcHvGiLnySi2qUXBicaqUSxN5LEB0g7Jt3ENXJLPJ5S1tnaZBoWbpRqrmjRE7qHmpSmNHdQcYrEUadoh+TbBnc9ri7iycI1kzPeNcLDIvbiqXpez9Tmdq6zGREPuzECBoxrPMiI2WtvyNwhJba2wy3JZ6ky5dD1lSvmZS3e4SPA1wcf1VTFHKX+cGwZzdUYcqpvUtvwrD/InDttVlyZeAKlNN5MKbAiurHhKIPlUuJvlTCCiDjSKSCsUmCFWbGLZwCESfK07JB8LvMYWVtw0D00JEHV8Mq2HkqPbE0oHLvvK2g0o8ETg+4cfwTlZDT9JDoWygu4uQQE/ivIvtcnfPkaCqhiupz7jWOAzqL/vjtcdkv9G4MVMt+EaylfuImiPAXEUjRF3pjjaHiPPZ6If9TGGAO4ZY0am6jOCb+DQ+ZCqLkIpOIPrdNfIjnFPY6nyFut7TS/fanrziOBOKMupKw94WaLMtuVnSFt9CPrWWdJE6PeltCX432DEBoh+5Dv8RRhdis8YAv9uyq4/JAwtlEApgBe9Cw9xDD3tdk4Jn0MDfiHwPHcRPxBePCMER3GuIx7kGlv9fkZ4V9lolx2Uv4X7hEj7qJ3LDoAMGbTRMRibu4L2xQ8bgt8AyU+Q+x7nYrvDnH4iuO5LxKsYwPVbkPMvKF9Zky9wXzRfVWizi62r9X5VHf55h+WHhDjGBZ4WRhyTr6z5SlCoLMxLSpBZFsQ9F80uQFbF/6aFWi+Ev51vzzsuX+msyzuQXXjUz8zEBy+zpq9yweXAoxJW4JbYrDS6gYDqGHxPl+TKeiBfxj9/EBIElPYeOA4y8/qRQfknjvSzgRgtq0Pw/M1eQeMdOSb2Bnrhr6Led+1vcp2x7oTFHMnedFW+Ivlty062BUt74oHgSj+vHepnhunn0JJAMtBZgDI/qmGtMujRv8DDpo47zBJ8UtPOuAR/7rKn8t9AJ0tBdmBAmJ/Fu71yxp4I3qh+DhyRqbi5Y1ShVPlSb8X7bRNcfgZFl+WRGYo7uecrWq1r8X5bhmzP5OdlDwsGRm1suSxkg5rYm7ConyGQ3Zl+DgSD8V/kPwrWBMG9YcBtyShBnTLdTiHgttw7qAW7cqh/ZnmPKr/6ignOaKsdyxbsToT5UkPsW00bJjijDXficcX/JsLs6w2BwGtherdckH3w/kNXRPVI0OqJQoHX42/66IMfMj/2huRjxIidgKV/W0JS+bsstDoTeAHcrI8E5zTh/sDkqxL5rZup55/3USlswfcHf4IrQplVDgW9XFlOqnwr6pVPMMEZTuC60EttvdzbLbaZ4PsFVa3nohhO+vW+yn/ZB2fUhpysmQrzBcTSai9EszuZMcEZ1lCFVrp9zGXhm69iLyY4oxFIa178lPe12I/P2DAYDAaDwWAwGAwGg8FgMBgMBoPBYDD2Cf8IMADDRGoQTe+E9AAAAABJRU5ErkJggg==' style='margin-top: -16px;' width='92'/> </a> <ul> <li> <a href='//www.google.com/'> Google </a> </li> <li> <a href='//www.google.com/policies/privacy/'> Privacy </a> </li> <li> <a href='//www.google.com/policies/terms/'> Terms </a> </li> </ul> </div> </div> <script type='text/javascript'> //<![CDATA[ // Social sharing popups. var postEl = document.getElementsByClassName('social-wrapper'); var postCount = postEl.length; for(i=0; i<postCount;i++){ postEl[i].addEventListener("click", function(event){ var postUrl = this.getAttribute("data-href"); window.open( postUrl,'popUpWindow','height=500,width=500,left=10,top=10,resizable=yes,scrollbars=yes,toolbar=yes,menubar=no,location=no,directories=no,status=yes'); });} //]]> </script> <script type='text/javascript'> //<![CDATA[ var BreakpointHandler = function() { this.initted = false; this.isHomePage = false; this.isMobile = false; }; BreakpointHandler.prototype.finalizeSummary = function(summaryHtml, lastNode) { // Use $.trim for IE8 compatibility summaryHtml = $.trim(summaryHtml).replace(/(<br>|\s)+$/,''); if (lastNode.nodeType == 3) { var lastChar = summaryHtml.slice(-1); if (!lastChar.match(/[.”"?]/)) { if (!lastChar.match(/[A-Za-z]/)) { summaryHtml = summaryHtml.slice(0, -1); } summaryHtml += ' ...'; } } else if (lastNode.nodeType == 1 && (lastNode.nodeName == 'I' || lastNode.nodeName == 'A')) { summaryHtml += ' ...'; } return summaryHtml; }; BreakpointHandler.prototype.generateSummaryFromContent = function(content, numWords) { var seenWords = 0; var summaryHtml = ''; for (var i=0; i < content.childNodes.length; i++) { var node = content.childNodes[i]; var nodeText; if (node.nodeType == 1) { if (node.hasAttribute('data-about-pullquote')) { continue; } nodeText = node.textContent; if (nodeText === undefined) { // innerText for IE8 nodeText = node.innerText; } if (node.nodeName == 'DIV' || node.nodeName == 'B') { // Don't end early if we haven't seen enough words. if (seenWords < 10) { continue; } if (i > 0) { summaryHtml = this.finalizeSummary(summaryHtml, content.childNodes[i-1]); } break; } summaryHtml += node.outerHTML; } else if (node.nodeType == 3) { nodeText = node.nodeValue; summaryHtml += nodeText + ' '; } var words = nodeText.match(/\S+\s*/g); if (!words) { continue; } var remain = numWords - seenWords; if (words.length >= remain) { summaryHtml = this.finalizeSummary(summaryHtml, node); break; } seenWords += words.length; } return summaryHtml; }; BreakpointHandler.prototype.detect = function() { var match, pl = /\+/g, search = /([^&=]+)=?([^&]*)/g, decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); }, query = window.location.search.substring(1); var urlParams = {}; while (match = search.exec(query)) urlParams[decode(match[1])] = decode(match[2]); this.isListPage = $('html').hasClass('list-page'); this.isMobile = urlParams['m'] === '1'; this.isHomePage = window.location.pathname == '/'; }; BreakpointHandler.prototype.initContent = function() { var self = this; $('.post').each(function(index) { var body = $(this).children('.post-body')[0]; var content = $(body).children('.post-content')[0]; $(content).addClass('post-original'); var data = $(content).children('script').html(); data = self.rewriteForSSL(data); // If exists, extract specified editor's preview. var match = data.match(/([\s\S]+?)<div data-is-preview.+?>([\s\S]+)<\/div>/m); if (match) { data = match[1]; } // Prevent big images from loading when they aren't needed. // This must be done as a pre-injection step, since image loading can't be // canceled once embedded into the DOM. if (self.isListPage && self.isMobile) { data = data.replace(/<(img|iframe) .+?>/g, ''); } // Insert template to be rendered as nodes. content.innerHTML = data; if (self.isListPage) { var summary = document.createElement('div'); $(summary).addClass('post-content'); $(summary).addClass('post-summary'); body.insertBefore(summary, content); if (match) { // Use provided summary. summary.innerHTML = match[2]; } else { // Generate a summary. // Summary generation relies on DOM, so it must occur after content is // inserted into the page. summary.innerHTML = self.generateSummaryFromContent(content, 30); } // Add read more link to summary. var titleAnchor = $(this).find('.title a')[0]; var link = titleAnchor.cloneNode(true); link.innerHTML = 'Read More'; $(link).addClass('read-more'); summary.appendChild(link); } }); // Firefox does not allow for proper styling of BR. if (navigator.userAgent.indexOf('Firefox') > -1) { $('.post-content br').replaceWith('<span class="space"></span>'); } $('.loading').removeClass('loading'); }; BreakpointHandler.prototype.process = function() { if (!this.initted) { var makeInsecureImageRegex = function(hosts) { var whitelist = hosts.join('|').replace(/\./g,'\\.'); // Normal image tags, plus input images (yes, this is possible!) return new RegExp('(<(img|input)[^>]+?src=("|\'))http:\/\/(' + whitelist +')', 'g'); }; this.sslImageRegex = makeInsecureImageRegex(BreakpointHandler.KNOWN_HTTPS_HOSTS); this.sslImageCurrentDomainRegex = makeInsecureImageRegex([window.location.hostname]); this.detect(); this.initContent(); this.initted = true; } }; BreakpointHandler.KNOWN_HTTPS_HOSTS = [ "www.google.org", "www.google.com", "services.google.com", "blogger.com", "draft.blogger.com", "www.blogger.com", "photos1.blogger.com", "photos2.blogger.com", "photos3.blogger.com", "blogblog.com", "img1.blogblog.com", "img2.blogblog.com", "www.blogblog.com", "www1.blogblog.com", "www2.blogblog.com", "0.bp.blogspot.com", "1.bp.blogspot.com", "2.bp.blogspot.com", "3.bp.blogspot.com", "4.bp.blogspot.com", "lh3.googleusercontent.com", "lh4.googleusercontent.com", "lh5.googleusercontent.com", "lh6.googleusercontent.com", "themes.googleusercontent.com", ]; BreakpointHandler.prototype.rewriteForSSL = function(html) { // Handle HTTP -> HTTPS source replacement of images, movies, and other embedded content. return html.replace(this.sslImageRegex, '$1https://$4') .replace(this.sslImageCurrentDomainRegex, '$1//$4') .replace(/(<(embed|iframe)[^>]+?src=("|'))http:\/\/([^"']*?(youtube|picasaweb\.google)\.com)/g, '$1https://$4') // Slideshow SWF takes a image host, so we need to rewrite that parameter. .replace(/(<embed[^>]+?feed=http(?=[^s]))/g, '$1s'); }; $(document).ready(function() { var handler = new BreakpointHandler(); handler.process(); // Top-level navigation. $(".BlogArchive .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); $(".Label .tab").click(function(ev) { ev.preventDefault(); $(this).parent().toggleClass('active'); $(this).siblings().slideToggle(300); }); // Blog archive year expansion. $('.BlogArchive .intervalToggle').click(function(ev) { ev.preventDefault(); if ($(this).parent().hasClass('collapsed')) { $(this).parent().removeClass('collapsed'); $(this).parent().addClass('expanded'); } else { $(this).parent().removeClass('expanded'); $(this).parent().addClass('collapsed'); } }); // Reverse order of months. $('.BlogArchive .intervalToggle + div').each(function(_, items) { var year = $(this); year.children().each(function(_, month) { year.prepend(month); }); }); // Set anchors to open in new tab. $('.post-content img').parent().each(function(_, node) { if (node.nodeName == 'A') { $(this).attr('target', '_blank'); } }); // Process search requests. $('.searchBox input').on("keypress", function(ev) { if (ev.which == 13) { window.location.href = 'https://www.google.com/search?q=site%3A' + window.location.hostname + '%20' + encodeURIComponent ($(this).val()); } }); }); //]]> </script> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/984859869-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY4wfiu70BxG7LpBtcvWZYZ54OAqsQ:1732381814969';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d2471378914199150966','//blog.chromium.org/2014/','2471378914199150966'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '2471378914199150966', 'title': 'Chromium Blog', 'url': 'https://blog.chromium.org/2014/', 'canonicalUrl': 'https://blog.chromium.org/2014/', 'homepageUrl': 'https://blog.chromium.org/', 'searchUrl': 'https://blog.chromium.org/search', 'canonicalHomepageUrl': 'https://blog.chromium.org/', 'blogspotFaviconUrl': 'https://blog.chromium.org/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': true, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'UA-37592578-1', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Chromium Blog - Atom\x22 href\x3d\x22https://blog.chromium.org/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Chromium Blog - RSS\x22 href\x3d\x22https://blog.chromium.org/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Chromium Blog - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/2471378914199150966/posts/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/d78375fb222d99b3', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'archive', 'pageName': '2014', 'pageTitle': 'Chromium Blog: 2014'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Chromium Blog', 'description': 'News and developments from the open source browser project', 'url': 'https://blog.chromium.org/2014/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': true, 'isLabelSearch': false, 'archive': {'year': 2014, 'rangeMessage': 'Showing posts from 2014'}}}]); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML8', 'sidebar-top', document.getElementById('HTML8'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LabelView', new _WidgetInfo('Label1', 'sidebar', document.getElementById('Label1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML6', 'sidebar', document.getElementById('HTML6'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML4', 'sidebar-bottom', document.getElementById('HTML4'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML1', 'sidebar-bottom', document.getElementById('HTML1'), {}, 'displayModeFull')); </script> </body> </html>