CINXE.COM

Chromium Blog: 2020

<!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: 2020 </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/2020/' 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/2020/' 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/2020/' 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&amp;zx=1e9da898-4807-4374-942f-3d02c74bbdb1' media='none' onload='if(media!=&#39;all&#39;)media=&#39;all&#39;' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=2471378914199150966&amp;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='74670333259948481' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/12/chrome-dev-summit-2020-wrap-up.html' itemprop='url' title='Chrome Dev Summit 2020: Building an open web for our users and developers'> Chrome Dev Summit 2020: Building an open web for our users and developers </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, December 9, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <section style="font-family: Roboto;line-height: 1.25em;"> <p> We all benefit from an open web that is secure, powerful, and fast. Over the past year, we&#8217;ve focused our efforts on strengthening the web in three areas: </p> <ol> <li>Rethinking how we can deliver a safe and secure web</li> <li>Adding the capabilities you need to build powerful, rich, and diverse applications</li> <li>Optimizing for performance, for users and developers alike</li> </ol> <p> This post is a synopsis of the updates we shared during today&#8217;s keynote at Chrome Dev Summit. </p> <h2>Rethinking privacy from the ground up</h2> <p> We&#8217;ve continued work on the <a href="https://www.blog.google/products/chrome/building-a-more-private-web/">Privacy Sandbox</a> and we are committed to developing an open set of standards that fundamentally enhance privacy on the web. Together with the web community, we're building new privacy-preserving alternatives to third-party cookies or other cross-site tracking mechanisms. With the <a href="https://web.dev/user-agent-client-hints/">Client Hints API</a>, we&#8217;re reducing the fingerprinting surface of Chrome, and we have two solutions for you to experiment with via our <a href="https://blog.chromium.org/2020/10/progress-on-privacy-sandbox-and.html">Chrome origin trials</a>. The <a href="https://web.dev/conversion-measurement/">Click Conversion Measurement API</a> measures ad conversions without using cross-site identifiers, and the <a href="https://web.dev/trust-tokens/">Trust Token APIs</a> help convey trust from one context to another without passive tracking. </p> <figure style="border:1px solid #ccc; width:100%;margin-left:0;margin-right:0;" > <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo_xNza3D4aLYXhnrwQCsvEFmioInavORPj1HyipYt1NzWWqhBqhIuClX0-b38yQEoNR-nwsaJmT5MKaR84HGv_x_2pPOggqiecOvGp7JMNEtZEoSX2trnOUj4bdSQiFE8jHmiNa4ow7T3/s16000/img1-cropped.jpg" style="width:100%" /> <figcaption style="background-color: #ccc; text-align: center;padding:2em;"> Available as Origin Trials<br> More info at <a href="https://web.dev/trust-tokens/">web.dev/trust-tokens/</a> </figcaption> </figure> <p> Similarly, the security and privacy of extensions has become of utmost importance with hundreds of millions of people using over 250,000 items in the Chrome Web Store. We believe extensions must be trustworthy by default and it&#8217;s why we announced a <a href="https://blog.chromium.org/2018/10/trustworthy-chrome-extensions-by-default.html"> draft proposal for a number of changes to our extension platform</a>. After incorporating a number of different suggestions from extension developers, we're ready to launch the stable release of <a href="https://blog.chromium.org/2020/12/manifest-v3-now-available-on-m88-beta.html"> Manifest V3</a> with the goal of increased security, more control and privacy for users, and improved performance. </p> <p> With Manifest V3, remote hosted code is no longer permissible to prevent malicious extensions that abuse user privacy and security. Additionally, the new extensions model allows users to withhold sensitive permissions at install time. Lastly, a new approach to background logic with the introduction of service workers for background pages and a new declarative model for extension APIs provides users more consistent performance guarantees. Manifest V3 is now available to experiment with on Chrome 88 beta, with the Chrome Web Store accepting Manifest V3 extensions mid-January when Chrome 88 reaches stable. </p> <h2>Bringing powerful capabilities for advanced apps</h2> <p> Great examples are coming to life from developers who are building new experiences on the web. <a href="https://www.designer.io/en/">Gravit Designer</a> makes it easy for users to read and write files with <a href="https://web.dev/file-system-access/"> File System Access APIs</a> and allows the use of specialized fonts installed locally with the new <a href="https://web.dev/local-fonts/">Local Font Access API</a>. Adobe has made it easy for users to create stunning visual stories and beautifully designed content with their <a href="https://spark.adobe.com/">Spark web app</a>. </p> <img src="https://lh4.googleusercontent.com/v_MguUaSG69tyfkZznl92awUPrtyLo9_n5i09iCwhgN50FpyVwe9texU0fznPOKikhZ9HRnejiCUs7e4DZLN1zlI_jLLLmRWvcUa7bvK9cmFMzcEu2urOEhRxNV5W_3GRhas_6z3QlabaUnWNv-Jwt9vON0QYRoy4OMB2Klo6_IzihmW" style="width:100%" /> <p> Today, we are adding new capabilities for Progress Web Apps (PWAs) to increase their <a href="https://blog.chromium.org/2020/12/pwa-play-billing-support.html"> discoverability by being listed in the Google Play Store</a>. In Chrome 86 we gave you the ability to list your PWA in the Play Store using a <a href="https://developers.google.com/web/android/trusted-web-activity">Trusted Web Activity</a>. We&#8217;ve now made it possible for you to start accepting payments using the new <a href="https://www.chromestatus.com/feature/5339955595313152"> Digital Goods API</a> in Chrome 88. </p> <a href="https://storage.googleapis.com/web-dev-assets/chromium-blog/cros-nugget3.jpg"> <img src="https://storage.googleapis.com/web-dev-assets/chromium-blog/cros-nugget3.jpg" style="width: 100%;" /> </a> <h2>Optimizing for performance</h2> <p> Chrome&#8217;s performance&#8212;speed and usage of resources like power, memory, or CPU&#8212;has always been top of mind so you can deliver the best experience for all our users. </p> <p> Earlier this year, we made some key improvements to speed with <a href="https://blog.chromium.org/2020/08/chrome-just-got-faster-with-profile.html"> Profile Guided Optimization & Tab throttling</a> and today, we announced a significant reduction of V8&#8217;s memory footprint. Apart from making great strides in memory savings through <a href="https://v8.dev/blog/pointer-compression">V8 pointer compression</a>, we&#8217;ve eliminated parsing pauses entirely by loading a webpage&#8217;s JavaScript files in parallel, so scripts can be parsed and compiled and ready to execute as soon as they&#8217;re needed by the page. </p> <p> Since we announced our <a href="https://web.dev/vitals/">Web Vitals initiative</a>, they are being increasingly used to measure web page performance. Google Search <a href="https://developers.google.com/search/blog/2020/11/timing-for-page-experience">announced</a> new signals to search ranking will include <a href="https://web.dev/vitals/#core-web-vitals"> Core Web Vitals</a> starting in May 2021. In addition to the <a href="https://developers.google.com/web/tools/chrome-user-experience-report">Chrome User Experience Report</a>, Search Console&#8217;s <a href="https://support.google.com/webmasters/answer/9205520">Core Web Vitals report</a>, and <a href="https://web.dev/vitals-tools/">many other Google tools</a>, other providers like <a href="https://blog.cloudflare.com/start-measuring-web-vitals-with-browser-insights/">Cloudflare</a> are surfacing Core Web Vitals as web page performance metrics. </p> <p> Last summer, we released the <a href="https://github.com/GoogleChrome/web-vitals">web-vitals Javascript library</a> for those sites using Google Analytics. Today we announced the <a href="http://goo.gle/web-vitals-report">Web Vitals Report</a>, an open source website and tool that lets you query and visualize your Web Vitals metrics data in Google Analytics, enabling you to easily compare performance data across segments. </p> <img src="https://lh3.googleusercontent.com/_XAbFN3Q9M174KK02avLKknUTCnFD8nt-k7jc00ktT-CVws9x7wOeICtebXXbjS9eqzsvmbCBgQ6mkdBy9BTMibBNgO7qqGnjTQT884Icn4F_IUS0fLMdrouriTEU5sNIFXR_SYkDYoge7MZl21lscjwThYjBV1LIDNn-I1njTuZ42NP" style="width: 100%;" /> <p> Finally, we&#8217;ve been listening to your feedback and hearing about your difficulties in building web interfaces. We&#8217;ve been working to improve the web&#8217;s styling capabilities and shipped <a href="https://web.dev/content-visibility/">content-visibility</a>, a CSS feature that significantly improves rendering performance. Look for more updates and tools to improve UI styling, including the announcement of <a href="http://Houdini.how">Houdini.how</a>, a set of APIs that makes it easier for you to extend CSS. </p> <h2>A virtual gathering experiment</h2> <p> Chrome Dev Summit has always been about connecting with the community. Although we weren&#8217;t able to convene together in person, the Chrome team launched a PWA to bring the best parts of a physical conference -- serendipitous conversations, discovering new things, and collecting swag -- to life with <a href="https://developer.chrome.com/devsummit/adventure/">Chrome Dev Summit Adventure</a>. We can&#8217;t wait to hear what you think of this experiment and look forward to chatting with you in real-time. </p> <video controls autoplay loop muted> <source src="https://storage.googleapis.com/web-dev-assets/chromium-blog/cds-a.webm" type="video/webm; codecs=vp8" /> <source src="https://storage.googleapis.com/web-dev-assets/chromium-blog/cds-a.mp4" type="video/mp4; codecs=h264" /> </video> <h2>Learn more</h2> <p> Become part of the community and join a <a href="https://developers.google.com/community/gdg">Google Developer Group</a> around the world. Check out the full list of <a href="https://developer.chrome.com/devsummit/schedule/#extended">CDS Extended events</a> that brings together regional developer communities to recap the highlights from Chrome Dev Summit 2020 along with live interactive sessions. </p> <p> <a href="http://goo.gle/cds20-sessions">Watch the sessions</a> any time on our YouTube channel and for all the latest updates on the web, <a href="https://web.dev/newsletter/">sign up for the web.dev newsletter</a>. </p> <p> See you next year! </p> <p>Posted by Ben Galbraith &amp; Dion Almaer</p> </section> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <section style="font-family: Roboto;line-height: 1.25em;"> <p> We all benefit from an open web that is secure, powerful, and fast. Over the past year, we&#8217;ve focused our efforts on strengthening the web in three areas: </p> <ol> <li>Rethinking how we can deliver a safe and secure web</li> <li>Adding the capabilities you need to build powerful, rich, and diverse applications</li> <li>Optimizing for performance, for users and developers alike</li> </ol> <p> This post is a synopsis of the updates we shared during today&#8217;s keynote at Chrome Dev Summit. </p> <h2>Rethinking privacy from the ground up</h2> <p> We&#8217;ve continued work on the <a href="https://www.blog.google/products/chrome/building-a-more-private-web/">Privacy Sandbox</a> and we are committed to developing an open set of standards that fundamentally enhance privacy on the web. Together with the web community, we're building new privacy-preserving alternatives to third-party cookies or other cross-site tracking mechanisms. With the <a href="https://web.dev/user-agent-client-hints/">Client Hints API</a>, we&#8217;re reducing the fingerprinting surface of Chrome, and we have two solutions for you to experiment with via our <a href="https://blog.chromium.org/2020/10/progress-on-privacy-sandbox-and.html">Chrome origin trials</a>. The <a href="https://web.dev/conversion-measurement/">Click Conversion Measurement API</a> measures ad conversions without using cross-site identifiers, and the <a href="https://web.dev/trust-tokens/">Trust Token APIs</a> help convey trust from one context to another without passive tracking. </p> <figure style="border:1px solid #ccc; width:100%;margin-left:0;margin-right:0;" > <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo_xNza3D4aLYXhnrwQCsvEFmioInavORPj1HyipYt1NzWWqhBqhIuClX0-b38yQEoNR-nwsaJmT5MKaR84HGv_x_2pPOggqiecOvGp7JMNEtZEoSX2trnOUj4bdSQiFE8jHmiNa4ow7T3/s16000/img1-cropped.jpg" style="width:100%" /> <figcaption style="background-color: #ccc; text-align: center;padding:2em;"> Available as Origin Trials<br> More info at <a href="https://web.dev/trust-tokens/">web.dev/trust-tokens/</a> </figcaption> </figure> <p> Similarly, the security and privacy of extensions has become of utmost importance with hundreds of millions of people using over 250,000 items in the Chrome Web Store. We believe extensions must be trustworthy by default and it&#8217;s why we announced a <a href="https://blog.chromium.org/2018/10/trustworthy-chrome-extensions-by-default.html"> draft proposal for a number of changes to our extension platform</a>. After incorporating a number of different suggestions from extension developers, we're ready to launch the stable release of <a href="https://blog.chromium.org/2020/12/manifest-v3-now-available-on-m88-beta.html"> Manifest V3</a> with the goal of increased security, more control and privacy for users, and improved performance. </p> <p> With Manifest V3, remote hosted code is no longer permissible to prevent malicious extensions that abuse user privacy and security. Additionally, the new extensions model allows users to withhold sensitive permissions at install time. Lastly, a new approach to background logic with the introduction of service workers for background pages and a new declarative model for extension APIs provides users more consistent performance guarantees. Manifest V3 is now available to experiment with on Chrome 88 beta, with the Chrome Web Store accepting Manifest V3 extensions mid-January when Chrome 88 reaches stable. </p> <h2>Bringing powerful capabilities for advanced apps</h2> <p> Great examples are coming to life from developers who are building new experiences on the web. <a href="https://www.designer.io/en/">Gravit Designer</a> makes it easy for users to read and write files with <a href="https://web.dev/file-system-access/"> File System Access APIs</a> and allows the use of specialized fonts installed locally with the new <a href="https://web.dev/local-fonts/">Local Font Access API</a>. Adobe has made it easy for users to create stunning visual stories and beautifully designed content with their <a href="https://spark.adobe.com/">Spark web app</a>. </p> <img src="https://lh4.googleusercontent.com/v_MguUaSG69tyfkZznl92awUPrtyLo9_n5i09iCwhgN50FpyVwe9texU0fznPOKikhZ9HRnejiCUs7e4DZLN1zlI_jLLLmRWvcUa7bvK9cmFMzcEu2urOEhRxNV5W_3GRhas_6z3QlabaUnWNv-Jwt9vON0QYRoy4OMB2Klo6_IzihmW" style="width:100%" /> <p> Today, we are adding new capabilities for Progress Web Apps (PWAs) to increase their <a href="https://blog.chromium.org/2020/12/pwa-play-billing-support.html"> discoverability by being listed in the Google Play Store</a>. In Chrome 86 we gave you the ability to list your PWA in the Play Store using a <a href="https://developers.google.com/web/android/trusted-web-activity">Trusted Web Activity</a>. We&#8217;ve now made it possible for you to start accepting payments using the new <a href="https://www.chromestatus.com/feature/5339955595313152"> Digital Goods API</a> in Chrome 88. </p> <a href="https://storage.googleapis.com/web-dev-assets/chromium-blog/cros-nugget3.jpg"> <img src="https://storage.googleapis.com/web-dev-assets/chromium-blog/cros-nugget3.jpg" style="width: 100%;" /> </a> <h2>Optimizing for performance</h2> <p> Chrome&#8217;s performance&#8212;speed and usage of resources like power, memory, or CPU&#8212;has always been top of mind so you can deliver the best experience for all our users. </p> <p> Earlier this year, we made some key improvements to speed with <a href="https://blog.chromium.org/2020/08/chrome-just-got-faster-with-profile.html"> Profile Guided Optimization & Tab throttling</a> and today, we announced a significant reduction of V8&#8217;s memory footprint. Apart from making great strides in memory savings through <a href="https://v8.dev/blog/pointer-compression">V8 pointer compression</a>, we&#8217;ve eliminated parsing pauses entirely by loading a webpage&#8217;s JavaScript files in parallel, so scripts can be parsed and compiled and ready to execute as soon as they&#8217;re needed by the page. </p> <p> Since we announced our <a href="https://web.dev/vitals/">Web Vitals initiative</a>, they are being increasingly used to measure web page performance. Google Search <a href="https://developers.google.com/search/blog/2020/11/timing-for-page-experience">announced</a> new signals to search ranking will include <a href="https://web.dev/vitals/#core-web-vitals"> Core Web Vitals</a> starting in May 2021. In addition to the <a href="https://developers.google.com/web/tools/chrome-user-experience-report">Chrome User Experience Report</a>, Search Console&#8217;s <a href="https://support.google.com/webmasters/answer/9205520">Core Web Vitals report</a>, and <a href="https://web.dev/vitals-tools/">many other Google tools</a>, other providers like <a href="https://blog.cloudflare.com/start-measuring-web-vitals-with-browser-insights/">Cloudflare</a> are surfacing Core Web Vitals as web page performance metrics. </p> <p> Last summer, we released the <a href="https://github.com/GoogleChrome/web-vitals">web-vitals Javascript library</a> for those sites using Google Analytics. Today we announced the <a href="http://goo.gle/web-vitals-report">Web Vitals Report</a>, an open source website and tool that lets you query and visualize your Web Vitals metrics data in Google Analytics, enabling you to easily compare performance data across segments. </p> <img src="https://lh3.googleusercontent.com/_XAbFN3Q9M174KK02avLKknUTCnFD8nt-k7jc00ktT-CVws9x7wOeICtebXXbjS9eqzsvmbCBgQ6mkdBy9BTMibBNgO7qqGnjTQT884Icn4F_IUS0fLMdrouriTEU5sNIFXR_SYkDYoge7MZl21lscjwThYjBV1LIDNn-I1njTuZ42NP" style="width: 100%;" /> <p> Finally, we&#8217;ve been listening to your feedback and hearing about your difficulties in building web interfaces. We&#8217;ve been working to improve the web&#8217;s styling capabilities and shipped <a href="https://web.dev/content-visibility/">content-visibility</a>, a CSS feature that significantly improves rendering performance. Look for more updates and tools to improve UI styling, including the announcement of <a href="http://Houdini.how">Houdini.how</a>, a set of APIs that makes it easier for you to extend CSS. </p> <h2>A virtual gathering experiment</h2> <p> Chrome Dev Summit has always been about connecting with the community. Although we weren&#8217;t able to convene together in person, the Chrome team launched a PWA to bring the best parts of a physical conference -- serendipitous conversations, discovering new things, and collecting swag -- to life with <a href="https://developer.chrome.com/devsummit/adventure/">Chrome Dev Summit Adventure</a>. We can&#8217;t wait to hear what you think of this experiment and look forward to chatting with you in real-time. </p> <video controls autoplay loop muted> <source src="https://storage.googleapis.com/web-dev-assets/chromium-blog/cds-a.webm" type="video/webm; codecs=vp8" /> <source src="https://storage.googleapis.com/web-dev-assets/chromium-blog/cds-a.mp4" type="video/mp4; codecs=h264" /> </video> <h2>Learn more</h2> <p> Become part of the community and join a <a href="https://developers.google.com/community/gdg">Google Developer Group</a> around the world. Check out the full list of <a href="https://developer.chrome.com/devsummit/schedule/#extended">CDS Extended events</a> that brings together regional developer communities to recap the highlights from Chrome Dev Summit 2020 along with live interactive sessions. </p> <p> <a href="http://goo.gle/cds20-sessions">Watch the sessions</a> any time on our YouTube channel and for all the latest updates on the web, <a href="https://web.dev/newsletter/">sign up for the web.dev newsletter</a>. </p> <p> See you next year! </p> <p>Posted by Ben Galbraith &amp; Dion Almaer</p> </section> <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 Dev Summit 2020: Building an open web for our users and developers&url=https://blog.chromium.org/2020/12/chrome-dev-summit-2020-wrap-up.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/2020/12/chrome-dev-summit-2020-wrap-up.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/2020/12/chrome-dev-summit-2020-wrap-up.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='5488655620074743160' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/12/manifest-v3-now-available-on-m88-beta.html' itemprop='url' title='Manifest V3 now available on M88 Beta'> Manifest V3 now available on M88 Beta </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, December 9, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <section style="font-family: Roboto; line-height: 1.25em;"> <p> With hundreds of millions of people using over 250,000 items in the Chrome Web Store, extensions have become essential to how many of us experience the web and get work done online. We believe extensions must be trustworthy by default, which is why we&#8217;ve spent this year <a href="https://blog.google/products/chrome/making-chrome-extensions-more-private-and-secure/" target="_blank"> making extensions safer for everyone</a>. </p> <p> Today we&#8217;re officially announcing the planned rollout of Manifest V3 for Chrome Extensions, a new version of the extensions platform that makes extensions more secure, performant, and private-respecting by default. </p> <h2>Security</h2> <p> With the introduction of Manifest V3, we will disallow remotely hosted code. This mechanism is used as an attack vector by bad actors to circumvent Google&#8217;s malware detection tools and poses a significant risk to user privacy and security. </p> <p> The removal of remotely hosted code will also allow us to more thoroughly and quickly review submissions to the Chrome Web Store. Developers will then be able to release updates to their users more quickly. </p> <p> On the extensions team, we believe that a trustworthy Chrome and a trustworthy extensions experience is not only great for users but is also essential for developers. In the long run, Manifest V3 will help the extension ecosystem continue to be a place that people can trust. </p> <h2>Performance</h2> <p> We know that performance is key to a great user experience, and as we began work on the third iteration of our extension platform, performance was a foundational consideration. Two areas where this has manifested are our approach to background logic and API design. </p> <p> First, we are introducing <a href="https://developers.google.com/web/fundamentals/primers/service-workers" target="_blank">service workers</a> as a replacement for background pages. Unlike persistent background pages, which remain active in the background and consume system resources regardless of whether the extension is actively using them, service workers are ephemeral. This ephemerality allows Chrome to lower overall system resource utilization since the browser can start up and tear down service workers as needed. </p> <p> Second, we are moving to a more declarative model for extension APIs in general. In addition to security benefits, <a href="https://blog.chromium.org/2019/06/web-request-and-declarative-net-request.html" target="_blank"> this provides a more reliable end-user performance guarantee</a> across the board by eliminating the need for serialization and inter-process communication. The end result is better overall performance and improved privacy guarantees for the vast majority of extension users. </p> <h2>Privacy</h2> <p> To give users greater visibility and control over how extensions use and share their data, we&#8217;re moving to an extensions model that makes more permissions optional and allows users to withhold sensitive permissions at install time. Long-term, extension developers should expect users to opt in or out of permissions at any time. </p> <p> For extensions that currently require passive access to web activity, we&#8217;re introducing and continuing to iterate on new functionality that allows developers to deliver these use cases while preserving user privacy. For example, our new declarativeNetRequest API is designed to be a privacy-preserving method for extensions to block network requests without needing access to sensitive data. </p> <p> The <code>declarativeNetRequest</code> API is an example of how Chrome is working to enable extensions, including ad blockers, to continue delivering their core functionality without requiring the extension to have access to potentially sensitive user data. This will allow many of the powerful extensions in our ecosystem to continue to provide a seamless user experience while still respecting user privacy. </p> <h2>Availability &amp; Continued Iteration</h2> <p> When the Manifest V3 draft proposal was initially shared with the Chromium developer community, we received an abundance of helpful feedback &#8212; thank you! We have been working closely with the developers of many extensions &#8212; including ad blockers, shopping extensions, productivity enhancements, developer tools, and more &#8212; to evolve the platform. </p> <p> We've used this feedback to improve the functionality and usability of the API surfaces associated with Manifest V3. For example, we have added support to <code>declarativeNetRequest</code> for multiple static rulesets, regular expressions within rules, declarative header modification, and more. </p> <blockquote style="border-left: 4px solid rgb(66, 133, 244); font-size: larger; line-height: 1.25em; padding: 8px 0px 8px 2em;"> &#8220;We&#8217;ve been very pleased with the close collaboration established between Google&#8217;s Chrome Extensions Team and our own engineering team to ensure that ad-blocking extensions will still be available after Manifest V3 takes effect." <br /><br /> &#8212; Sofia Lindberg, Tech Lead, eyeo (Adblock Plus) </blockquote> <p> Even after Manifest V3 launches, expect more functionality and iteration as we continue to incorporate feedback and add new features to make V3 even more powerful for developers while preserving user privacy. If you are interested in contributing to the conversation, please comment and discuss on the <a href="https://groups.google.com/a/chromium.org/g/chromium-extensions" target="_blank">chromium-extensions Google Group</a>. </p> <p> Manifest V3 is now available to experiment with on Chrome 88 Beta, with additional exciting features to follow in upcoming releases. The Chrome Web Store will start accepting Manifest V3 extensions January, shortly after Chrome 88 reaches stable. While there is not an exact date for removing support for Manifest V2 extensions, developers can expect the migration period to last at least a year from when Manifest V3 lands in the stable channel. We will continue to provide more details about this timeline in the coming months. </p> <p> Posted by David Li - Product Manager, Chrome &amp; Simeon Vincent - Developer Advocate, Chrome </p> </section> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <section style="font-family: Roboto; line-height: 1.25em;"> <p> With hundreds of millions of people using over 250,000 items in the Chrome Web Store, extensions have become essential to how many of us experience the web and get work done online. We believe extensions must be trustworthy by default, which is why we&#8217;ve spent this year <a href="https://blog.google/products/chrome/making-chrome-extensions-more-private-and-secure/" target="_blank"> making extensions safer for everyone</a>. </p> <p> Today we&#8217;re officially announcing the planned rollout of Manifest V3 for Chrome Extensions, a new version of the extensions platform that makes extensions more secure, performant, and private-respecting by default. </p> <h2>Security</h2> <p> With the introduction of Manifest V3, we will disallow remotely hosted code. This mechanism is used as an attack vector by bad actors to circumvent Google&#8217;s malware detection tools and poses a significant risk to user privacy and security. </p> <p> The removal of remotely hosted code will also allow us to more thoroughly and quickly review submissions to the Chrome Web Store. Developers will then be able to release updates to their users more quickly. </p> <p> On the extensions team, we believe that a trustworthy Chrome and a trustworthy extensions experience is not only great for users but is also essential for developers. In the long run, Manifest V3 will help the extension ecosystem continue to be a place that people can trust. </p> <h2>Performance</h2> <p> We know that performance is key to a great user experience, and as we began work on the third iteration of our extension platform, performance was a foundational consideration. Two areas where this has manifested are our approach to background logic and API design. </p> <p> First, we are introducing <a href="https://developers.google.com/web/fundamentals/primers/service-workers" target="_blank">service workers</a> as a replacement for background pages. Unlike persistent background pages, which remain active in the background and consume system resources regardless of whether the extension is actively using them, service workers are ephemeral. This ephemerality allows Chrome to lower overall system resource utilization since the browser can start up and tear down service workers as needed. </p> <p> Second, we are moving to a more declarative model for extension APIs in general. In addition to security benefits, <a href="https://blog.chromium.org/2019/06/web-request-and-declarative-net-request.html" target="_blank"> this provides a more reliable end-user performance guarantee</a> across the board by eliminating the need for serialization and inter-process communication. The end result is better overall performance and improved privacy guarantees for the vast majority of extension users. </p> <h2>Privacy</h2> <p> To give users greater visibility and control over how extensions use and share their data, we&#8217;re moving to an extensions model that makes more permissions optional and allows users to withhold sensitive permissions at install time. Long-term, extension developers should expect users to opt in or out of permissions at any time. </p> <p> For extensions that currently require passive access to web activity, we&#8217;re introducing and continuing to iterate on new functionality that allows developers to deliver these use cases while preserving user privacy. For example, our new declarativeNetRequest API is designed to be a privacy-preserving method for extensions to block network requests without needing access to sensitive data. </p> <p> The <code>declarativeNetRequest</code> API is an example of how Chrome is working to enable extensions, including ad blockers, to continue delivering their core functionality without requiring the extension to have access to potentially sensitive user data. This will allow many of the powerful extensions in our ecosystem to continue to provide a seamless user experience while still respecting user privacy. </p> <h2>Availability &amp; Continued Iteration</h2> <p> When the Manifest V3 draft proposal was initially shared with the Chromium developer community, we received an abundance of helpful feedback &#8212; thank you! We have been working closely with the developers of many extensions &#8212; including ad blockers, shopping extensions, productivity enhancements, developer tools, and more &#8212; to evolve the platform. </p> <p> We've used this feedback to improve the functionality and usability of the API surfaces associated with Manifest V3. For example, we have added support to <code>declarativeNetRequest</code> for multiple static rulesets, regular expressions within rules, declarative header modification, and more. </p> <blockquote style="border-left: 4px solid rgb(66, 133, 244); font-size: larger; line-height: 1.25em; padding: 8px 0px 8px 2em;"> &#8220;We&#8217;ve been very pleased with the close collaboration established between Google&#8217;s Chrome Extensions Team and our own engineering team to ensure that ad-blocking extensions will still be available after Manifest V3 takes effect." <br /><br /> &#8212; Sofia Lindberg, Tech Lead, eyeo (Adblock Plus) </blockquote> <p> Even after Manifest V3 launches, expect more functionality and iteration as we continue to incorporate feedback and add new features to make V3 even more powerful for developers while preserving user privacy. If you are interested in contributing to the conversation, please comment and discuss on the <a href="https://groups.google.com/a/chromium.org/g/chromium-extensions" target="_blank">chromium-extensions Google Group</a>. </p> <p> Manifest V3 is now available to experiment with on Chrome 88 Beta, with additional exciting features to follow in upcoming releases. The Chrome Web Store will start accepting Manifest V3 extensions January, shortly after Chrome 88 reaches stable. While there is not an exact date for removing support for Manifest V2 extensions, developers can expect the migration period to last at least a year from when Manifest V3 lands in the stable channel. We will continue to provide more details about this timeline in the coming months. </p> <p> Posted by David Li - Product Manager, Chrome &amp; Simeon Vincent - Developer Advocate, Chrome </p> </section> <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:Manifest V3 now available on M88 Beta&url=https://blog.chromium.org/2020/12/manifest-v3-now-available-on-m88-beta.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/2020/12/manifest-v3-now-available-on-m88-beta.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/2020/12/manifest-v3-now-available-on-m88-beta.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/chrome%20extensions' rel='tag'> chrome extensions </a> , <a class='label' href='https://blog.chromium.org/search/label/manifest%20v3' rel='tag'> manifest v3 </a> </span> </div> </div> </div> <div class='post' data-id='8738771126642336930' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/12/pwa-play-billing-support.html' itemprop='url' title='Easy to build, monetize, and discover: List your web app on Google Play'> Easy to build, monetize, and discover: List your web app on Google Play </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, December 9, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <section style="font-family: Roboto; line-height: 1.25em;"> <p> App developers should be able to make money from their creations, whether via ads, purchases, or subscriptions. The first step to successfully monetizing is getting your app discovered. </p> <p> Now that Progressive Web Apps (PWAs) can be listed in Google Play, we&#8217;re excited to announce that web developers can use Google Play payments in their PWA on Chromebooks and Android devices. This makes it even easier to get your PWA in front of more users and start accepting simple, secure payments by listing in Google Play. </p> <h2>A new way to connect with Chromebook users</h2> <p> Since their release, <a href="https://chromeos.dev/en">Chromebooks and Chrome OS</a> have proven that a device built around the web can make computing easier, faster, and more secure. Last year, we expanded high-quality app experiences beyond mobile by <a href="https://www.youtube.com/watch?v=2KhRmFHLuhE">adding support for PWAs on Chrome OS</a>. And that&#8217;s clearly resonated with users &#8212; in the past year, Chromebook unit sales have grown 85% year over year (YOY)<sup>1</sup>, and PWA installs more than doubled<sup>2</sup>. </p> <img src="https://lh6.googleusercontent.com/8hqOdps0LbcWBnP9CYJwsXnrsLmiYVniJGRejSkiK1ENxI231iPVEhP7yI6Z7qRHUSSJCVBjNgM-JC8UCKT5ONU0igLeTQ1U0XcVcSQeopMvlSK5011mr3hBcFoqW8eez6uBVKbR" style="width: 100%;" /> <p> With all the new capabilities being added to web apps &#8212; from saving to the local file system to device communication &#8212; we saw an opportunity to highlight the best experiences for Chromebook users. </p> <p> Search continues to be a quick and easy way to discover new web apps, but many people are also turning to app stores to find the best software for their device in one place. That&#8217;s why we gave developers the ability to list their PWA in Google Play on Chrome OS using <a href="https://developers.google.com/web/android/trusted-web-activity"> Trusted Web Activity</a>. Now, users can discover web apps by browsing through collections and curated recommendations in the Play Store. And once they install it, they&#8217;ll be able to enjoy the full-screen app experience they love, powered by Chrome. </p> <p> Brands like <a href="https://www.kapwing.com/">Kapwing</a>, an online image, video, and GIF editing platform, have already seen impressive results after launching their PWA: </p> <blockquote style="border-left: 4px solid rgb(66, 133, 244); font-size: larger; line-height: 1.25em; padding: 8px 0px 8px 2em;"> "In the first five weeks of launching our PWA-ified website, the number of people creating videos through the PWA <b>grew 36%</b>. This <b>growth in usage</b> outpaced overall growth on the website, indicating <b>higher retention</b> among creators who <b>installed the PWA</b>." <br /><br /> - <b>Julia Enthoven</b>, CEO of Kapwing </blockquote> <h2>Streamlined secure payments</h2> <p> If your app accepts payments, you can simplify the process by <a href="https://developer.android.com/google/play/billing">using the Digital Goods API with Google Play</a>. This feature is ready to start testing behind a flag in Chrome OS 88 and will launch with Chrome OS 89 in March 2021. </p> <p> These APIs allow you to offer in-app payments and subscriptions with a single click, and users see the same, familiar Google Play billing flow with the ability to save credits or payment information. </p> <img src="https://lh4.googleusercontent.com/CwhjMGvNAh62FvBAvzPMKK6TUyiPODH7SnlrN2otmsupHj7r5Otx0FtqITuyrBZuJfDTWTwiOxlZLRIvxnJOufDE5l2XDAB8fsLYp0LvdZVRVRDRE9PzRGLlJqp4zlDLNRh3Yuvd" style="width: 100%;" /> <h2>More amazing apps coming to Chrome OS</h2> <p> We&#8217;ve already seen <a href="https://blog.google/products/chromebooks/whats-new-chrome-os/dec2020/"> great responses to PWAs on Chromebooks </a> &#8212; users enjoying the advanced graphics on <a href="https://spark.adobe.com/">Adobe Spark</a> and <a href="http://web.dev/gravit-designer">Corel&#8217;s Gravit Designer</a>, sharper video editing with <a href="http://web.dev/clipchamp">Clipchamp</a>, and more powerful viewing experiences on <a href="https://tv.youtube.com/">YouTube TV</a>. We&#8217;re excited to share that all of these experiences will arrive in the Play Store as soon as the Digital Goods API arrives in Chrome OS 89. </p> <p> It&#8217;s incredible to see the journey of developers as they build their web apps for larger screens. We can&#8217;t wait to showcase amazing web apps like these on Google Play &#8212; and we hope to see yours there soon! </p> <p> Posted by PJ McLachlan &amp; Tom Buckley </p> <p> <small> Sources: <br /> <sup>1</sup> The NPD Group, Inc., U.S. Retail Tracking Service, Notebook Computers, based on unit sales, Jan.&#8211;Aug. 2020.<br /> <sup>2</sup> Chrome usage metrics, Dec. 2019&#8211;Dec. 2020.<br /> </small> </p> </section> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <section style="font-family: Roboto; line-height: 1.25em;"> <p> App developers should be able to make money from their creations, whether via ads, purchases, or subscriptions. The first step to successfully monetizing is getting your app discovered. </p> <p> Now that Progressive Web Apps (PWAs) can be listed in Google Play, we&#8217;re excited to announce that web developers can use Google Play payments in their PWA on Chromebooks and Android devices. This makes it even easier to get your PWA in front of more users and start accepting simple, secure payments by listing in Google Play. </p> <h2>A new way to connect with Chromebook users</h2> <p> Since their release, <a href="https://chromeos.dev/en">Chromebooks and Chrome OS</a> have proven that a device built around the web can make computing easier, faster, and more secure. Last year, we expanded high-quality app experiences beyond mobile by <a href="https://www.youtube.com/watch?v=2KhRmFHLuhE">adding support for PWAs on Chrome OS</a>. And that&#8217;s clearly resonated with users &#8212; in the past year, Chromebook unit sales have grown 85% year over year (YOY)<sup>1</sup>, and PWA installs more than doubled<sup>2</sup>. </p> <img src="https://lh6.googleusercontent.com/8hqOdps0LbcWBnP9CYJwsXnrsLmiYVniJGRejSkiK1ENxI231iPVEhP7yI6Z7qRHUSSJCVBjNgM-JC8UCKT5ONU0igLeTQ1U0XcVcSQeopMvlSK5011mr3hBcFoqW8eez6uBVKbR" style="width: 100%;" /> <p> With all the new capabilities being added to web apps &#8212; from saving to the local file system to device communication &#8212; we saw an opportunity to highlight the best experiences for Chromebook users. </p> <p> Search continues to be a quick and easy way to discover new web apps, but many people are also turning to app stores to find the best software for their device in one place. That&#8217;s why we gave developers the ability to list their PWA in Google Play on Chrome OS using <a href="https://developers.google.com/web/android/trusted-web-activity"> Trusted Web Activity</a>. Now, users can discover web apps by browsing through collections and curated recommendations in the Play Store. And once they install it, they&#8217;ll be able to enjoy the full-screen app experience they love, powered by Chrome. </p> <p> Brands like <a href="https://www.kapwing.com/">Kapwing</a>, an online image, video, and GIF editing platform, have already seen impressive results after launching their PWA: </p> <blockquote style="border-left: 4px solid rgb(66, 133, 244); font-size: larger; line-height: 1.25em; padding: 8px 0px 8px 2em;"> "In the first five weeks of launching our PWA-ified website, the number of people creating videos through the PWA <b>grew 36%</b>. This <b>growth in usage</b> outpaced overall growth on the website, indicating <b>higher retention</b> among creators who <b>installed the PWA</b>." <br /><br /> - <b>Julia Enthoven</b>, CEO of Kapwing </blockquote> <h2>Streamlined secure payments</h2> <p> If your app accepts payments, you can simplify the process by <a href="https://developer.android.com/google/play/billing">using the Digital Goods API with Google Play</a>. This feature is ready to start testing behind a flag in Chrome OS 88 and will launch with Chrome OS 89 in March 2021. </p> <p> These APIs allow you to offer in-app payments and subscriptions with a single click, and users see the same, familiar Google Play billing flow with the ability to save credits or payment information. </p> <img src="https://lh4.googleusercontent.com/CwhjMGvNAh62FvBAvzPMKK6TUyiPODH7SnlrN2otmsupHj7r5Otx0FtqITuyrBZuJfDTWTwiOxlZLRIvxnJOufDE5l2XDAB8fsLYp0LvdZVRVRDRE9PzRGLlJqp4zlDLNRh3Yuvd" style="width: 100%;" /> <h2>More amazing apps coming to Chrome OS</h2> <p> We&#8217;ve already seen <a href="https://blog.google/products/chromebooks/whats-new-chrome-os/dec2020/"> great responses to PWAs on Chromebooks </a> &#8212; users enjoying the advanced graphics on <a href="https://spark.adobe.com/">Adobe Spark</a> and <a href="http://web.dev/gravit-designer">Corel&#8217;s Gravit Designer</a>, sharper video editing with <a href="http://web.dev/clipchamp">Clipchamp</a>, and more powerful viewing experiences on <a href="https://tv.youtube.com/">YouTube TV</a>. We&#8217;re excited to share that all of these experiences will arrive in the Play Store as soon as the Digital Goods API arrives in Chrome OS 89. </p> <p> It&#8217;s incredible to see the journey of developers as they build their web apps for larger screens. We can&#8217;t wait to showcase amazing web apps like these on Google Play &#8212; and we hope to see yours there soon! </p> <p> Posted by PJ McLachlan &amp; Tom Buckley </p> <p> <small> Sources: <br /> <sup>1</sup> The NPD Group, Inc., U.S. Retail Tracking Service, Notebook Computers, based on unit sales, Jan.&#8211;Aug. 2020.<br /> <sup>2</sup> Chrome usage metrics, Dec. 2019&#8211;Dec. 2020.<br /> </small> </p> </section> <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:Easy to build, monetize, and discover: List your web app on Google Play&url=https://blog.chromium.org/2020/12/pwa-play-billing-support.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/2020/12/pwa-play-billing-support.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/2020/12/pwa-play-billing-support.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='4172168849420064184' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/12/seamless-payments-and-password.html' itemprop='url' title='Seamless payments and password management in Chrome'> Seamless payments and password management in Chrome </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, December 8, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Many people choose to save their payment information and passwords for their favorite websites to their <a href="https://myaccount.google.com/" target="_blank">Google Account</a> for easy access. Until recently, it was not always easy to access them in Chrome. For example: in that moment where you (finally!) found the perfect holiday gift, and started the checkout, Chrome couldn't help you access the login credentials you had saved in <a href="https://passwords.google.com/" target="_blank">Password Manager</a>, or the payment methods you had added to <a href="https://myaccount.google.com/" target="_blank">your account</a>, unless you had Chrome sync turned on for that device.<div><br /><a href="https://blog.chromium.org/2019/07/easier-payments-with-chrome.html" target="_blank">This changed last year</a>, when we made it easier to access the payment methods in your Google Account. Since then, we've been working hard to bring the same signed-in experience to more features and users -- making it simpler and more intuitive to access your Google Account info in Chrome. We're happy to announce that over the coming weeks and months, seamless payments and password management will become available to all signed-in users, syncing or not.<br /><br /><h3 style="text-align: left;">More convenient sign in on Android</h3></div><div>To help you get the most out of your Google Account, Chrome on Android will soon let you sign in with a single tap, even when not using sync. When you sign in to a Google service like Gmail, you can now choose to sign in to Chrome with one of your Google Accounts on the device &#8211; with a single tap and without having to re-enter your credentials. If you prefer to sign in without adding your account to the device, you can simply dismiss the dialog. And if you want a temporary browsing session, the menu provides a quick way to open Incognito mode.<br /><br /><br /><br /><h3 style="text-align: left;">Easier payments with Chrome on Android</h3>When you sign in to Chrome on your Android phone using the new single tap option, you&#8217;ll soon be able to autofill the payment methods stored in your Google Account for a more convenient shopping experience. Chrome will ask you to confirm the card&#8217;s CVC or let you <a href="https://blog.chromium.org/2020/07/more-secure-and-convenient-autofill.html" target="_blank">authenticate with biometrics</a>, and then you&#8217;re good to go. You can also save a new credit card to your account to use it across all your devices. Each time you save a card to your account, you will receive a confirmation email. You can manage and delete the cards at any time by going to your <a href="https://pay.google.com/gp/w/u/0/home/paymentmethods" target="_blank">Payment methods</a> in your account.</div><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6rIMkaD87SeqARi2mbhKsQKPgnEW1_UI6z0qqZd0VgeKeAr1Ig55YhyriyWsclcpe-7qh8p2k9lN-jnerIPo7GI7T0SZ9GSsr86F5sIyFFeznOeoxRFksmWNvZArmG7wdlBiZWGQJNqc/s912/Image_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="508" data-original-width="912" height="357" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6rIMkaD87SeqARi2mbhKsQKPgnEW1_UI6z0qqZd0VgeKeAr1Ig55YhyriyWsclcpe-7qh8p2k9lN-jnerIPo7GI7T0SZ9GSsr86F5sIyFFeznOeoxRFksmWNvZArmG7wdlBiZWGQJNqc/w640-h357/Image_01.png" width="640" /></a></div><br /><div><br /><h3 style="text-align: left;">Easier Password Management on Chrome desktop</h3></div><div>We&#8217;ve heard your feedback for more flexibility when it comes to having access to passwords saved to your Google Account. Over the next couple of months, accessing and managing your passwords safely across your devices will become even easier. This can all be done simply by signing in to your Google Account, regardless of whether sync is enabled. You&#8217;ll be able to autofill passwords on sites that you previously saved to your account, and when you save a new password, Chrome will let you choose where you want to save it &#8212; on the device or in your Google Account. If you choose your account, you can access it on all your devices.<br /><br />With this change we&#8217;re also bringing Chrome&#8217;s password generation feature to more people, helping them create strong and unique passwords for the many online accounts people manage when using Chrome.<br /><br /><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz42gH4fcwu1ILF_bvAZQbNWlByYPIKwn4vZPsCTYq6mVcVOGQJnuRHj4Mz7GsTJBwNGQFz-KEXKkA-EpFBy3VosHVape5NrTtS-fS5PBRO55H3D7rU0NIc0wWekZMx_64wenVmL8LqpHf/s1421/Image_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="886" data-original-width="1421" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz42gH4fcwu1ILF_bvAZQbNWlByYPIKwn4vZPsCTYq6mVcVOGQJnuRHj4Mz7GsTJBwNGQFz-KEXKkA-EpFBy3VosHVape5NrTtS-fS5PBRO55H3D7rU0NIc0wWekZMx_64wenVmL8LqpHf/w640-h400/Image_02.png" width="640" /></a></div><br />Keep an eye out for these features over the coming months, and as always, be sure to keep tabs on our blog for future updates.&nbsp;<br /><br />Posted by Sabine Borsay, Product Manager, Chrome <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Many people choose to save their payment information and passwords for their favorite websites to their <a href="https://myaccount.google.com/" target="_blank">Google Account</a> for easy access. Until recently, it was not always easy to access them in Chrome. For example: in that moment where you (finally!) found the perfect holiday gift, and started the checkout, Chrome couldn't help you access the login credentials you had saved in <a href="https://passwords.google.com/" target="_blank">Password Manager</a>, or the payment methods you had added to <a href="https://myaccount.google.com/" target="_blank">your account</a>, unless you had Chrome sync turned on for that device.<div><br /><a href="https://blog.chromium.org/2019/07/easier-payments-with-chrome.html" target="_blank">This changed last year</a>, when we made it easier to access the payment methods in your Google Account. Since then, we've been working hard to bring the same signed-in experience to more features and users -- making it simpler and more intuitive to access your Google Account info in Chrome. We're happy to announce that over the coming weeks and months, seamless payments and password management will become available to all signed-in users, syncing or not.<br /><br /><h3 style="text-align: left;">More convenient sign in on Android</h3></div><div>To help you get the most out of your Google Account, Chrome on Android will soon let you sign in with a single tap, even when not using sync. When you sign in to a Google service like Gmail, you can now choose to sign in to Chrome with one of your Google Accounts on the device &#8211; with a single tap and without having to re-enter your credentials. If you prefer to sign in without adding your account to the device, you can simply dismiss the dialog. And if you want a temporary browsing session, the menu provides a quick way to open Incognito mode.<br /><br /><br /><br /><h3 style="text-align: left;">Easier payments with Chrome on Android</h3>When you sign in to Chrome on your Android phone using the new single tap option, you&#8217;ll soon be able to autofill the payment methods stored in your Google Account for a more convenient shopping experience. Chrome will ask you to confirm the card&#8217;s CVC or let you <a href="https://blog.chromium.org/2020/07/more-secure-and-convenient-autofill.html" target="_blank">authenticate with biometrics</a>, and then you&#8217;re good to go. You can also save a new credit card to your account to use it across all your devices. Each time you save a card to your account, you will receive a confirmation email. You can manage and delete the cards at any time by going to your <a href="https://pay.google.com/gp/w/u/0/home/paymentmethods" target="_blank">Payment methods</a> in your account.</div><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6rIMkaD87SeqARi2mbhKsQKPgnEW1_UI6z0qqZd0VgeKeAr1Ig55YhyriyWsclcpe-7qh8p2k9lN-jnerIPo7GI7T0SZ9GSsr86F5sIyFFeznOeoxRFksmWNvZArmG7wdlBiZWGQJNqc/s912/Image_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="508" data-original-width="912" height="357" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG6rIMkaD87SeqARi2mbhKsQKPgnEW1_UI6z0qqZd0VgeKeAr1Ig55YhyriyWsclcpe-7qh8p2k9lN-jnerIPo7GI7T0SZ9GSsr86F5sIyFFeznOeoxRFksmWNvZArmG7wdlBiZWGQJNqc/w640-h357/Image_01.png" width="640" /></a></div><br /><div><br /><h3 style="text-align: left;">Easier Password Management on Chrome desktop</h3></div><div>We&#8217;ve heard your feedback for more flexibility when it comes to having access to passwords saved to your Google Account. Over the next couple of months, accessing and managing your passwords safely across your devices will become even easier. This can all be done simply by signing in to your Google Account, regardless of whether sync is enabled. You&#8217;ll be able to autofill passwords on sites that you previously saved to your account, and when you save a new password, Chrome will let you choose where you want to save it &#8212; on the device or in your Google Account. If you choose your account, you can access it on all your devices.<br /><br />With this change we&#8217;re also bringing Chrome&#8217;s password generation feature to more people, helping them create strong and unique passwords for the many online accounts people manage when using Chrome.<br /><br /><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz42gH4fcwu1ILF_bvAZQbNWlByYPIKwn4vZPsCTYq6mVcVOGQJnuRHj4Mz7GsTJBwNGQFz-KEXKkA-EpFBy3VosHVape5NrTtS-fS5PBRO55H3D7rU0NIc0wWekZMx_64wenVmL8LqpHf/s1421/Image_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="886" data-original-width="1421" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz42gH4fcwu1ILF_bvAZQbNWlByYPIKwn4vZPsCTYq6mVcVOGQJnuRHj4Mz7GsTJBwNGQFz-KEXKkA-EpFBy3VosHVape5NrTtS-fS5PBRO55H3D7rU0NIc0wWekZMx_64wenVmL8LqpHf/w640-h400/Image_02.png" width="640" /></a></div><br />Keep an eye out for these features over the coming months, and as always, be sure to keep tabs on our blog for future updates.&nbsp;<br /><br />Posted by Sabine Borsay, Product Manager, Chrome <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:Seamless payments and password management in Chrome&url=https://blog.chromium.org/2020/12/seamless-payments-and-password.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/2020/12/seamless-payments-and-password.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/2020/12/seamless-payments-and-password.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/passwords' rel='tag'> passwords </a> , <a class='label' href='https://blog.chromium.org/search/label/payments' rel='tag'> payments </a> </span> </div> </div> </div> <div class='post' data-id='8478156572492616134' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/12/continuing-our-journey-to-bring-instant.html' itemprop='url' title='Continuing our journey to bring instant experiences to the whole web'> Continuing our journey to bring instant experiences to the whole web </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Monday, December 7, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> Speed has always been a <a href="https://blog.chromium.org/2018/09/10-years-of-speed-in-chrome_11.html" target="_blank">core tenet</a> of Chrome. We care about speed, not only because it helps our users get things done quicker, but because it also contributes to making the web ecosystem more diverse by lowering the friction of discovering and engaging with more content or new websites. So, what if we could make the web more instant? Building on some of our previous work in this space, we have a new proposal that aims at speeding up navigations by downloading resources ahead of time, i.e. prefetching. The proposal defines the concept of a &#8220;private prefetch proxy&#8221; through the combination of an end-to-end encrypted CONNECT proxy to hide potentially identifiable information (e.g. user&#8217;s IP address), as well as rules governing its usage, and additional measures to ensure that the prefetches can not be personalized to the user. We are eager to work with the community on refining and generalizing the proposal for the benefit of the whole web.<br /><br /><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Our journey toward instant experiences</h3><div style="text-align: left;">In Chrome 73, with <a href="https://developers.google.com/web/updates/2019/03/nic73?hl=ar#sxg" target="_blank">Signed HTTP Exchange</a>, we launched the first phase of a long term effort designed to bring instant experiences to the whole web, through improved prefetching and pre-rendering techniques that are privacy and developer friendly. As a quick refresher, Signed HTTP Exchange makes it possible to create &#8220;portable&#8221; content, i.e. content that other parties can deliver on your behalf with the assurance that it will remain unaltered and properly attributed to your origin. This offers several advantages such as the ability to speed up page loads, increasing the availability of popular or critical content when the origin servers can&#8217;t keep up with the demand, and can also help reduce a publisher&#8217;s data transfer costs since the bytes are served by a third party.</div><br />In Chrome 86 for Android, we ran a proof-of-concept experiment to test a different approach that we hope will be a complementary option to Signed HTTP Exchange. While Signed HTTP Exchange can already be used to enable instant experiences, they require some <a href="https://developers.google.com/web/updates/2018/11/signed-exchanges#trying_out_signed_exchanges" target="_blank">extra work and setup</a> which isn&#8217;t yet always <a href="https://blog.amp.dev/2019/06/17/introducing-cloudflare-amp-real-url/" target="_blank">trivial</a>. We are always on the lookout for innovation opportunities, and with this new approach, our goal is to make it easier to achieve instant experiences across the whole web, thereby helping the community better understand the value of such experiences, and consequently motivating further investment in instant techniques or efforts meant to lower the barriers to adoption of such techniques.<br /><br />The experiment consisted of prefetching the critical resources for a subset of the most likely cross-site navigations in Chrome for Android, and showed an improvement of 40% on the <a href="https://web.dev/lcp/" target="_blank">Largest Contentful Paint </a>page load time metric, without revealing potentially identifiable information, such as the user&#8217;s IP address, and without requiring extra work from developers to start seeing some benefits. Given the successful proof of concept experiment, we feel ready to share more details about the approach and start engaging with the community to iterate on a viable web platform solution. But before we do, let us take you for a walk down memory lane.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div><div style="text-align: center;"><br /></div><div style="text-align: center;"><span id="docs-internal-guid-91331197-7fff-b7d3-dcca-63d5b2b4e0c2"><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 253px; overflow: hidden; width: 437px;"><img height="265" src="https://lh5.googleusercontent.com/58u-KeGT2pPgKGZAUuHIGfYlte5FovZd6rcqrgOFGcmRkux6xJQFr12B9La-ZPeDsh1xqzmCR9_lm4Vh7glrVZ3ufHyQjg4lraOPuZ8JW_x6gA2e12uRieAXg89UbNVci8uMDjGMZg" style="margin-left: 0px; margin-top: 0px;" width="437" /></span></span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">&#8220;Loading a page without prefetching&#8221;</span></p><div><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div></span></div><h3 style="text-align: left;"><br /></h3><h3 style="text-align: left;">Lessons learned from prefetching and prerendering</h3>Prefetching is a way to speed up page loads by downloading the bits and pieces that make up a web page (e.g. HTML documents, Javascript, Stylesheet, Images, etc.) in anticipation of a user navigating to said webpage. Pre-rendering is taking things a bit further by drawing and running the web page ahead of time, off-screen, so that by the time the user navigates to the web page, it&#8217;s ready to go and displays instantly.<br /><br />Prefetching or pre-rendering web pages is not a brand new idea. In fact, most modern browsers have such features. For instance, Chrome for desktop had a feature called &#8220;<a href="https://chrome.googleblog.com/2011/06/faster-than-fast.html" target="_blank">Instant Pages</a>&#8221; from 2011 until 2017 when it was replaced with <a href="https://developers.google.com/web/updates/2018/07/nostate-prefetch" target="_blank">NoState Prefetch</a>. Here are some of the key reasons that made us take a step back with regards to pre-rendering at the time:<br /><ul style="text-align: left;"><li>Pre-rendering was an all or nothing approach where calls to unsupported web features would result in completely abandoning pre-rendering. The intent was to avoid annoyances such as having sounds or permission prompts coming out of nowhere, but in practice, this meant that most websites were not compatible with pre-rendering and that web developers could inadvertently fall outside of the set of pre-rendering compatible web features, and lose all the benefits as a result.</li><li>Not all pages can be safely pre-rendered. For instance, pre-rendering a link to a page that logs you out of your favorite website would be a bad experience. Because it is non trivial to dissociate pages that are consequence-free vs. those that aren&#8217;t, this meant that we were only able to safely apply pre-rendering to a narrow subset of links on the web.</li></ul>These hurdles meant that pre-rendering was only used by, and for, a handful of websites. Even today, with the NoState Prefetch approach, the feature is only <a href="https://chromestatus.com/metrics/feature/timeline/popularity/918" target="_blank">used on 1.4% of all page loads</a>. Given the significant upsides (e.g. 40% faster page loads with prefetching), we believe that the ceiling ought to be much higher. To start, we decided to set our sights on addressing a significant impediment to the use of prefetching, and by extension pre-rendering: preserving privacy while improving page load performance.<br /><br /><br /><h3 style="text-align: left;">Prefetching and privacy</h3><div style="text-align: left;">A fundamental challenge with prefetching another website is that it inherently happens before the user has signaled their interest, i.e. by visiting said website. So, if your browser, or favorite websites, were to prefetch links to pages on other websites that you might be interested in, it exposes potentially identifiable information, such as your IP address or cookies, to the servers hosting those websites. This approach to prefetching is problematic because it allows the prefetched websites to learn something new about you, such as your interest in some content or product. In practice, as we have said earlier, this heavily limits the usage of prefetching to a small number of cases where prefetching a page doesn&#8217;t reveal new information to its publisher.</div><div style="text-align: center;"><span id="docs-internal-guid-fc7d20c1-7fff-b3d2-6008-cecfdd1d495d"><div style="text-align: left;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div></span></div></div><div style="text-align: center;"><span id="docs-internal-guid-2d296da6-7fff-98f3-445b-ad8386d1db38"><br /><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 294px; overflow: hidden; width: 499px;"><img height="303" src="https://lh3.googleusercontent.com/1OSD6iuUr8UkJtF632XdMgntwq4YBaMOAkGod0cO2EJ7wXLc7bo4MU-rco54bwbdyfiejguht6V3S6yQw_FxboTpjsY7tBoXH0KhqOeJdSm3T1EsC-w8A0W7x1NpOOIwZ2wTSogJHA" style="margin-left: 0px; margin-top: 0px;" width="499" /></span></span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">&#8220;Naively prefetching websites can result in leaking user&#8217;s interest in some content or product&#8221;</span></p><br /></span></div><div><br />In essence, the challenge here is to find an approach which upholds the following privacy principle: &#8220;None of the parties involved can learn anything new about the user as a result of prefetching a website&#8221;. For the experiment, we&#8217;ve addressed this challenge by having Chrome use a &#8220;private prefetch proxy&#8221; which consists of a <a href="https://tools.ietf.org/html/rfc7231#section-4.3.6" target="_blank">CONNECT proxy</a>, a set of rules governing its usage, and additional measures to ensure that the prefetches can not be personalized to the user.<br /><br /><h3 style="text-align: left;"><br /></h3><h3 style="text-align: left;">Private prefetch proxy</h3><div style="text-align: left;">At a high level, Chrome gives the name of a website to the CONNECT proxy which then creates a secure communication channel between Chrome and that website. By design, the proxy was operated for and by Google, and was restricted to navigations originating from Google owned surfaces, thereby ensuring that the proxy could only see information that&#8217;s already accessible such as the names of the websites prefetched from surfaces that we authored. The end-to-end encrypted communication channel provided by the CONNECT proxy means that the proxy is only able to relay further requests without being able to see the content of the communication. Furthermore, given that the content of the communication is encrypted end-to-end between Chrome and the destination site, it also means that intermediaries can&#8217;t see the prefetched domains, nor the content of the prefetched resources. Likewise, since the proxy is relaying the prefetching requests, the destination website only sees the IP address of the proxy, not the user&#8217;s IP address. Finally, prefetching was restricted to websites that had no cookies or other local state, thereby preventing the destination site from identifying a user via information previously stored on their device.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span id="docs-internal-guid-cd173c20-7fff-7b9f-6b01-7fd386ac5f97"><br /><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 284px; overflow: hidden; width: 497px;"><img height="302" src="https://lh5.googleusercontent.com/Yq5cTRhLU41MtCKVE1UKsBCdwEsYpH1Ck6b-sJk7Hn6mGPGGrX1acKN6Lv1eFDT8XJGc713khII7G3s_W4KkhntOiBSjDs9nNWOHXTkTQUkmxB-yDVapKczii3mmNKmlO0obVpdWlg" style="margin-left: 0px; margin-top: 0px;" width="497" /></span></span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">&#8220;Prefetching websites via a&nbsp;CONNECT proxy prevents leaking user information&#8221;</span></p><br /></span></div><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Rebuilding pre-rendering on a solid foundation</h3>As mentioned in the introduction, our goal is to bring instant experiences to the whole web through prefetching and pre-rendering techniques that are privacy and developer friendly. This proof of concept experiment and the follow-up discussions with the community represent small, but nevertheless important, steps toward that goal. Indeed, any pre-rendering feature is inherently built on top of a prefetching capability, which must abide by the same privacy principles. There are a few more challenges that we&#8217;ll need to solve to bring back an improved, privacy and developer friendly, pre-rendering feature. To be clear, we see this successful proof of concept experiment as a positive signal for iterating on a viable web platform solution, so that more websites can both benefit from, and take advantage of the approach outlined in this blog post. We are hopeful that what we&#8217;ve learned from past efforts, as well as new learnings we&#8217;ve gained thanks to this proof-of-concept experiment, will help foster a fruitful collaborative effort with the rest of the community.</div></div><div><br /><br />Posted by Michael Buettner (Software Engineer), and Kenji Baheux (Product Manager)<br /><br /><br /><br /><br /><br /><br /><br /></div> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> Speed has always been a <a href="https://blog.chromium.org/2018/09/10-years-of-speed-in-chrome_11.html" target="_blank">core tenet</a> of Chrome. We care about speed, not only because it helps our users get things done quicker, but because it also contributes to making the web ecosystem more diverse by lowering the friction of discovering and engaging with more content or new websites. So, what if we could make the web more instant? Building on some of our previous work in this space, we have a new proposal that aims at speeding up navigations by downloading resources ahead of time, i.e. prefetching. The proposal defines the concept of a &#8220;private prefetch proxy&#8221; through the combination of an end-to-end encrypted CONNECT proxy to hide potentially identifiable information (e.g. user&#8217;s IP address), as well as rules governing its usage, and additional measures to ensure that the prefetches can not be personalized to the user. We are eager to work with the community on refining and generalizing the proposal for the benefit of the whole web.<br /><br /><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Our journey toward instant experiences</h3><div style="text-align: left;">In Chrome 73, with <a href="https://developers.google.com/web/updates/2019/03/nic73?hl=ar#sxg" target="_blank">Signed HTTP Exchange</a>, we launched the first phase of a long term effort designed to bring instant experiences to the whole web, through improved prefetching and pre-rendering techniques that are privacy and developer friendly. As a quick refresher, Signed HTTP Exchange makes it possible to create &#8220;portable&#8221; content, i.e. content that other parties can deliver on your behalf with the assurance that it will remain unaltered and properly attributed to your origin. This offers several advantages such as the ability to speed up page loads, increasing the availability of popular or critical content when the origin servers can&#8217;t keep up with the demand, and can also help reduce a publisher&#8217;s data transfer costs since the bytes are served by a third party.</div><br />In Chrome 86 for Android, we ran a proof-of-concept experiment to test a different approach that we hope will be a complementary option to Signed HTTP Exchange. While Signed HTTP Exchange can already be used to enable instant experiences, they require some <a href="https://developers.google.com/web/updates/2018/11/signed-exchanges#trying_out_signed_exchanges" target="_blank">extra work and setup</a> which isn&#8217;t yet always <a href="https://blog.amp.dev/2019/06/17/introducing-cloudflare-amp-real-url/" target="_blank">trivial</a>. We are always on the lookout for innovation opportunities, and with this new approach, our goal is to make it easier to achieve instant experiences across the whole web, thereby helping the community better understand the value of such experiences, and consequently motivating further investment in instant techniques or efforts meant to lower the barriers to adoption of such techniques.<br /><br />The experiment consisted of prefetching the critical resources for a subset of the most likely cross-site navigations in Chrome for Android, and showed an improvement of 40% on the <a href="https://web.dev/lcp/" target="_blank">Largest Contentful Paint </a>page load time metric, without revealing potentially identifiable information, such as the user&#8217;s IP address, and without requiring extra work from developers to start seeing some benefits. Given the successful proof of concept experiment, we feel ready to share more details about the approach and start engaging with the community to iterate on a viable web platform solution. But before we do, let us take you for a walk down memory lane.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div><div style="text-align: center;"><br /></div><div style="text-align: center;"><span id="docs-internal-guid-91331197-7fff-b7d3-dcca-63d5b2b4e0c2"><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 253px; overflow: hidden; width: 437px;"><img height="265" src="https://lh5.googleusercontent.com/58u-KeGT2pPgKGZAUuHIGfYlte5FovZd6rcqrgOFGcmRkux6xJQFr12B9La-ZPeDsh1xqzmCR9_lm4Vh7glrVZ3ufHyQjg4lraOPuZ8JW_x6gA2e12uRieAXg89UbNVci8uMDjGMZg" style="margin-left: 0px; margin-top: 0px;" width="437" /></span></span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">&#8220;Loading a page without prefetching&#8221;</span></p><div><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div></span></div><h3 style="text-align: left;"><br /></h3><h3 style="text-align: left;">Lessons learned from prefetching and prerendering</h3>Prefetching is a way to speed up page loads by downloading the bits and pieces that make up a web page (e.g. HTML documents, Javascript, Stylesheet, Images, etc.) in anticipation of a user navigating to said webpage. Pre-rendering is taking things a bit further by drawing and running the web page ahead of time, off-screen, so that by the time the user navigates to the web page, it&#8217;s ready to go and displays instantly.<br /><br />Prefetching or pre-rendering web pages is not a brand new idea. In fact, most modern browsers have such features. For instance, Chrome for desktop had a feature called &#8220;<a href="https://chrome.googleblog.com/2011/06/faster-than-fast.html" target="_blank">Instant Pages</a>&#8221; from 2011 until 2017 when it was replaced with <a href="https://developers.google.com/web/updates/2018/07/nostate-prefetch" target="_blank">NoState Prefetch</a>. Here are some of the key reasons that made us take a step back with regards to pre-rendering at the time:<br /><ul style="text-align: left;"><li>Pre-rendering was an all or nothing approach where calls to unsupported web features would result in completely abandoning pre-rendering. The intent was to avoid annoyances such as having sounds or permission prompts coming out of nowhere, but in practice, this meant that most websites were not compatible with pre-rendering and that web developers could inadvertently fall outside of the set of pre-rendering compatible web features, and lose all the benefits as a result.</li><li>Not all pages can be safely pre-rendered. For instance, pre-rendering a link to a page that logs you out of your favorite website would be a bad experience. Because it is non trivial to dissociate pages that are consequence-free vs. those that aren&#8217;t, this meant that we were only able to safely apply pre-rendering to a narrow subset of links on the web.</li></ul>These hurdles meant that pre-rendering was only used by, and for, a handful of websites. Even today, with the NoState Prefetch approach, the feature is only <a href="https://chromestatus.com/metrics/feature/timeline/popularity/918" target="_blank">used on 1.4% of all page loads</a>. Given the significant upsides (e.g. 40% faster page loads with prefetching), we believe that the ceiling ought to be much higher. To start, we decided to set our sights on addressing a significant impediment to the use of prefetching, and by extension pre-rendering: preserving privacy while improving page load performance.<br /><br /><br /><h3 style="text-align: left;">Prefetching and privacy</h3><div style="text-align: left;">A fundamental challenge with prefetching another website is that it inherently happens before the user has signaled their interest, i.e. by visiting said website. So, if your browser, or favorite websites, were to prefetch links to pages on other websites that you might be interested in, it exposes potentially identifiable information, such as your IP address or cookies, to the servers hosting those websites. This approach to prefetching is problematic because it allows the prefetched websites to learn something new about you, such as your interest in some content or product. In practice, as we have said earlier, this heavily limits the usage of prefetching to a small number of cases where prefetching a page doesn&#8217;t reveal new information to its publisher.</div><div style="text-align: center;"><span id="docs-internal-guid-fc7d20c1-7fff-b3d2-6008-cecfdd1d495d"><div style="text-align: left;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div></span></div></div><div style="text-align: center;"><span id="docs-internal-guid-2d296da6-7fff-98f3-445b-ad8386d1db38"><br /><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 294px; overflow: hidden; width: 499px;"><img height="303" src="https://lh3.googleusercontent.com/1OSD6iuUr8UkJtF632XdMgntwq4YBaMOAkGod0cO2EJ7wXLc7bo4MU-rco54bwbdyfiejguht6V3S6yQw_FxboTpjsY7tBoXH0KhqOeJdSm3T1EsC-w8A0W7x1NpOOIwZ2wTSogJHA" style="margin-left: 0px; margin-top: 0px;" width="499" /></span></span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">&#8220;Naively prefetching websites can result in leaking user&#8217;s interest in some content or product&#8221;</span></p><br /></span></div><div><br />In essence, the challenge here is to find an approach which upholds the following privacy principle: &#8220;None of the parties involved can learn anything new about the user as a result of prefetching a website&#8221;. For the experiment, we&#8217;ve addressed this challenge by having Chrome use a &#8220;private prefetch proxy&#8221; which consists of a <a href="https://tools.ietf.org/html/rfc7231#section-4.3.6" target="_blank">CONNECT proxy</a>, a set of rules governing its usage, and additional measures to ensure that the prefetches can not be personalized to the user.<br /><br /><h3 style="text-align: left;"><br /></h3><h3 style="text-align: left;">Private prefetch proxy</h3><div style="text-align: left;">At a high level, Chrome gives the name of a website to the CONNECT proxy which then creates a secure communication channel between Chrome and that website. By design, the proxy was operated for and by Google, and was restricted to navigations originating from Google owned surfaces, thereby ensuring that the proxy could only see information that&#8217;s already accessible such as the names of the websites prefetched from surfaces that we authored. The end-to-end encrypted communication channel provided by the CONNECT proxy means that the proxy is only able to relay further requests without being able to see the content of the communication. Furthermore, given that the content of the communication is encrypted end-to-end between Chrome and the destination site, it also means that intermediaries can&#8217;t see the prefetched domains, nor the content of the prefetched resources. Likewise, since the proxy is relaying the prefetching requests, the destination website only sees the IP address of the proxy, not the user&#8217;s IP address. Finally, prefetching was restricted to websites that had no cookies or other local state, thereby preventing the destination site from identifying a user via information previously stored on their device.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span id="docs-internal-guid-cd173c20-7fff-7b9f-6b01-7fd386ac5f97"><br /><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 284px; overflow: hidden; width: 497px;"><img height="302" src="https://lh5.googleusercontent.com/Yq5cTRhLU41MtCKVE1UKsBCdwEsYpH1Ck6b-sJk7Hn6mGPGGrX1acKN6Lv1eFDT8XJGc713khII7G3s_W4KkhntOiBSjDs9nNWOHXTkTQUkmxB-yDVapKczii3mmNKmlO0obVpdWlg" style="margin-left: 0px; margin-top: 0px;" width="497" /></span></span></p><p dir="ltr" style="line-height: 1.8; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Lato, sans-serif" style="color: #212121; font-size: 10pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">&#8220;Prefetching websites via a&nbsp;CONNECT proxy prevents leaking user information&#8221;</span></p><br /></span></div><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Rebuilding pre-rendering on a solid foundation</h3>As mentioned in the introduction, our goal is to bring instant experiences to the whole web through prefetching and pre-rendering techniques that are privacy and developer friendly. This proof of concept experiment and the follow-up discussions with the community represent small, but nevertheless important, steps toward that goal. Indeed, any pre-rendering feature is inherently built on top of a prefetching capability, which must abide by the same privacy principles. There are a few more challenges that we&#8217;ll need to solve to bring back an improved, privacy and developer friendly, pre-rendering feature. To be clear, we see this successful proof of concept experiment as a positive signal for iterating on a viable web platform solution, so that more websites can both benefit from, and take advantage of the approach outlined in this blog post. We are hopeful that what we&#8217;ve learned from past efforts, as well as new learnings we&#8217;ve gained thanks to this proof-of-concept experiment, will help foster a fruitful collaborative effort with the rest of the community.</div></div><div><br /><br />Posted by Michael Buettner (Software Engineer), and Kenji Baheux (Product Manager)<br /><br /><br /><br /><br /><br /><br /><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:Continuing our journey to bring instant experiences to the whole web&url=https://blog.chromium.org/2020/12/continuing-our-journey-to-bring-instant.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/2020/12/continuing-our-journey-to-bring-instant.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/2020/12/continuing-our-journey-to-bring-instant.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/prefetching' rel='tag'> prefetching </a> , <a class='label' href='https://blog.chromium.org/search/label/private%20prefetch%20proxy' rel='tag'> private prefetch proxy </a> </span> </div> </div> </div> <div class='post' data-id='675687921729397268' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/12/chrome-88-digital-goods-lighting.html' itemprop='url' title='Chrome 88: Digital Goods, Lighting Estimation in Augmented Reality, and More'> Chrome 88: Digital Goods, Lighting Estimation in Augmented Reality, and More </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, December 3, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>Unless otherwise noted, changes described below apply to the newest Chrome beta channel release for Android, Chrome OS, Linux, macOS, and Windows. Learn more about the features listed here through the provided links or from the list on <a href="https://www.chromestatus.com/features#milestone%3D88">ChromeStatus.com</a>. Chrome 88 is beta as of December 3, 2020.</p> <h1 style="text-align: left;">Digital Goods API</h1><p>Chrome now supports an API for&nbsp;<a href="https://www.chromestatus.com/feature/5339955595313152">querying and managing digital products</a>&nbsp;to facilitate in-app purchases from web applications. This is used with the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Payment_Request_API">Payment Request API</a>, which is used to make the actual purchases. The API would be linked to a digital distribution service connected via the user agent. In Chromium, this is specifically a web API wrapper around the <a href="https://developer.android.com/google/play/billing/integrate">Android Play Billing API</a>.</p><p>This is needed so that web apps in the Play Store can accept purchases for digital goods. (Play policies prevent them from accepting payment via any other method.) Without this, websites that sell digital goods are not installable through the Play Store.</p><p>In Chrome 88, this is available for Android in an origin trial. For a list of other origin trials starting in this release, see below.</p><h1>Origin Trials</h1> <p>This version of Chrome introduces the origin trial described below. Origin trials allow you to try new features and give feedback on usability, practicality, and effectiveness to the web standards community. To register for any of the origin trials currently supported in Chrome, including the ones described below, visit the <a href="https://developers.chrome.com/origintrials/#/trials/active">Origin Trials dashboard</a>. To learn more about origin trials themselves, visit the <a href="https://github.com/GoogleChrome/OriginTrials/blob/gh-pages/developer-guide.md">Origin Trials Guide for Web Developers</a>.</p><h2>New Origin Trials</h2> <h3>WebXR: AR Lighting Estimation</h3> <p>Allows sites to query for estimates of the environmental lighting conditions within <a href="https://developer.mozilla.org/en-US/docs/Web/API/XRSession">WebXR sessions</a>. This exposes both spherical harmonics representing the ambient lighting, as well as a cubemap texture representing "reflections". Adding lighting estimation can help to make models feel more natural and like they "fit" better with the user's environment. This can make them feel more "real" or "natural".</p> <p>In Chrome 88, this is available for Android only.</p> <h2>Completed Origin Trials</h2> <p>The following features, previously in Chrome origin trials, are now enabled by default.</p><h3 style="text-align: left;">performance.measureMemory() Method</h3><p>Adds the <span style="font-family: courier; font-size: x-small;">performance.measureMemory()</span> method that estimates the memory usage of the web page in case the page is currently isolated (e.g. on Desktop). Because the method is gated behind COOP/COEP web sites need to enabled <a href="https://web.dev/why-coop-coep/">crossOriginIsolated</a> to use this method. For more information, see&nbsp;<a href="https://web.dev/monitor-total-page-memory-usage/">Monitor your web page's total memory usage with measureMemory()</a>.</p> <h3>PointerLock unadjustedMovement</h3> <p>Adds the ability to request unadjusted/unaccelerated mouse movement data when in <code>PointerLock</code>. If <code>unadjustedMovement</code> is set to true, then the pointer movements will not be affected by the underlying platform modifications such as mouse acceleration. For more information, see <a href="https://web.dev/disable-mouse-acceleration/">Disable mouse acceleration to provide a better FPS gaming experience</a>.</p> <h1>Other features in this release</h1> <h3>Anchor target=_blank implies rel=noopener by Default</h3> <p>To mitigate "tab-napping" attacks, in which a new tab/window opened by a victim context may navigate that opener context, anchors that target <code>_blank</code> will behave as though <code>rel</code> is set to <code>noopener</code>. To opt out of this behavior, you can set <code>rel</code> to opener. This conforms to a change in the HTML standard.</p> <h3>Dark Mode Form Controls and Scrollbars</h3> <p>Dark mode is an accessibility feature that allows web authors to enable their web pages to be viewed in dark mode. When enabled, users are able to view dark mode supported websites by toggling the dark mode settings on their OS. The benefits of dark mode are being easier on the eyes in a low light environment and lower battery consumption. For more about dark mode and form controls, see <a href="https://web.dev/color-scheme/">Improved dark mode default styling with the color-scheme CSS property and the corresponding meta tag</a>.</p> <h3>AbortSignal in addEventListener()</h3> <p>Adds <a href="https://www.chromestatus.com/feature/5658622220566528">the <code>AbortSignal</code> option</a>, named <code>signal</code>, to the options parameter of <code>addEventListener()</code>. The <code>signal</code> option must first be created by an <code>AbortController</code> by accessing the <code>signal</code> property on an <code>AbortController</code> instance. Once the signal is passed in to <code>addEventListener()</code>, calling <code>AbortController.abort()</code> removes the event listener added with <code>addEventListener()</code>.</p> <h3>CSS aspect-ratio Property</h3> <p>Allows <a href="https://www.chromestatus.com/feature/5738050678161408">explicitly specifying an aspect ratio</a> for any element to get similar behavior to a replaced element. This generalizes the aspect ratio concept to general elements. It allows various effects, examples include sizing <code>&lt;iframe&gt;</code> elements using an aspect ratio, filmstrips where each element has the same height but needs an appropriate width, and cases where a replaced element is wrapped by a component but should keep the aspect ratio.</p> <h3>CSS Selectors 4: Complex :not()</h3> <p>Allows <a href="https://www.chromestatus.com/feature/5014164156186624">complex selectors inside the <code>:not()</code> pseudo class</a>, such as <code>:not(.a + .b .c)</code>.</p> <h3>Don't Clear adoptedStyleSheets on Adoption to/from &lt;template&gt;</h3> <p>When adopting a shadow root into a <code>&lt;template&gt;</code> document from a document that the <code>&lt;template&gt;</code> is in (or vice versa), Chrome will <a href="https://www.chromestatus.com/feature/5980793119703040">no longer clear its <code>adoptedStyleSheets</code></a>.<br /> <br /> Currently Chrome always clears <code>adoptedStyleSheets</code> when the shadow root containing it is adopted into a different document. This ensures that constructed stylesheets are not used across <code>&lt;iframe&gt;</code> elements, but this also covers adopting into/from <code>&lt;template&gt;</code> elements, causing some confusion for the web developer.</p> <h3>ElementInternals.shadowRoot Attribute</h3> <p><a href="https://www.chromestatus.com/feature/5721288276443136">A new attribute on <code>ElementInternals</code>, <code>shadowRoot</code></a>, allows custom elements to access their own shadow root, regardless of open/closed status. Additionally, further restrictions are added to the <code>attachInternals()</code> method to ensure that custom elements get the first chance to attach the <code>ElementInternals</code> interface. With this change, the <code>attachInternals()</code> method will throw an exception if called before the custom element constructor being run.</p> <p>This feature was mostly driven, at least initially, by the declarative Shadow DOM feature introduction. With declarative Shadow DOM, there was a problem with closed shadow roots: declarative shadow content loads before the custom element is upgraded, which means that closed shadow content would have been inaccessible.<br /> <br /> In addition to the declarative Shadow DOM use case, this feature also offers a convenience to custom element authors, who no longer need to keep a reference to attached shadow roots, and can instead use the <code>ElementInternals</code> interface.</p> <h3>Make Type Optional in WakeLock.request()</h3> <p>The <code>type</code> parameter in <code>WakeLock.request()</code> <a href="https://www.chromestatus.com/feature/5725750881681408">is now optional</a> and defaults to <code>"screen"</code>, which is currently the only allowed value. For more information, see <a href="https://web.dev/wake-lock/#get-wake-lock">Stay awake with the Screen Wake Lock API</a>.</p> <h3>Origin Isolation</h3> <p><a href="https://www.chromestatus.com/feature/5683766104162304">Origin isolation</a> allows developers to opt in to giving up certain cross-origin same-site access capabilities&#8212;namely synchronous scripting via <code>document.domain</code>, and calling <code>postMessage()</code> with <code>WebAssembly.Module</code> instances. This gives the browser more flexibility in implementation technologies. <br /> <br /> Reasons why a site may want better isolation include: performance isolation, allocations of large amounts of memory, side-channel protection (e.g. against Spectre), and improved memory measurement.</p> <h3>path() Support in clip-path CSS Property</h3> <p>Adds <a href="https://www.chromestatus.com/feature/5633533638868992">support for <code>path()</code></a> as a value for the CSS <code>clip-path</code> property, which allows specifying SVG-style paths for clipping. This supplements the four basic shapes currently supported by <code>clip-path</code>: <code>circle</code>, <code>ellipse</code>, <code>polygon</code>, and <code>url</code>. For example, the following would clip an element with a triangle:<br /> <br /> <code>clip-path: path(oddeven, 'M 5 5 h 100 v 100 Z')</code> </p> <h3>Permissions-Policy Header</h3> <p>The <code>Permissions-Policy</code> HTTP header <a href="https://www.chromestatus.com/feature/5745992911552512">replaces the existing <code>Feature-Policy</code> header</a> for controlling delegation of permissions and powerful features. The header uses a structured syntax, and allows sites to more tightly restrict which origins can be granted access to features.</p> <h3>RTCRtpTransceiver.stop()</h3> <p>Transceivers allow the sending and/or receiving of media in WebRTC. <a href="https://www.chromestatus.com/feature/5410592384876544">Stopping a transceiver </a>makes it permanently inactive and frees its network port, encoder, and decoder resources. This also makes its <code>m=</code> section in the SDP reusable by future transceivers, preventing the SDP from growing indefinitely as transceivers are added and removed. This is part of "Perfect Negotiation", which makes signaling in WebRTC race free and less error-prone. </p> <h3>JavaScript</h3> <p>This version of Chrome incorporates version 8.8 of the V8 JavaScript engine. It specifically includes the change listed below. You can find a complete <a href="https://v8.dev/blog">list of recent features</a> in the V8 release notes.</p><h4 style="text-align: left;">Shared Array Buffers, Atomics, and Futex APIs</h4><p>Adds the JavaScript type&nbsp;<code>SharedArrayBuffer</code>&nbsp;gated behind COOP/COEP. A&nbsp;<code>SharedArrayBuffer</code>&nbsp;allows a message to be posted to a worker by sending a reference instead of a copy of the sent data.<br /><br />JavaScript&nbsp;<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics">Atomics</a>&nbsp;provides atomic loads and stores and read/modify/write accesses to&nbsp;<code>SharedArrayBuffer</code>&nbsp;objects.&nbsp;<code>Atomics.wait()</code>&nbsp;provides the ability for a worker to wait for another worker to signal it, without having to spinlock.</p><p>The primary use case for&nbsp;<code>SharedArrayBuffer</code>&nbsp;is for asm.js code, but it is also useful for implementing other higher-level sharing between Workers.</p><p>For more information, see&nbsp;<a href="https://web.dev/coop-coep/">Making your website "cross-origin isolated" using COOP and COEP</a>.</p> <h1>Deprecations, and Removals</h1> <p>This version of Chrome introduces the deprecations and removals listed below. Visit ChromeStatus.com for lists of <a href="https://www.chromestatus.com/features#browsers.chrome.status%3A%22Deprecated%22">current deprecations</a> and <a href="https://www.chromestatus.com/features#browsers.chrome.status:%22Removed%22">previous removals</a>.</p> <h2>Don't Allow Popups During Page Unload (Enterprises)</h2> <p>Since Chrome 80, pages have no longer been able to <a href="https://www.chromestatus.com/feature/5989473649164288">open a new page during unloading</a> using <code>window.open()</code>. Since then enterprises have been able to use the AllowPopupsDuringPageUnload policy flag to allow popups during page unload. Starting in Chrome 88, this flag is no longer supported.</p> <h2>FTP Support Removed</h2> <p>Chrome is removing support for FTP URLs. The legacy FTP implementation in Chrome has no support for encrypted connections (FTPS), nor proxies. Usage of FTP in the browser is sufficiently low that it is no longer viable to invest in improving the existing FTP client. In addition, more capable FTP clients are available on all affected platforms.</p> <p>Google Chrome 72 and later removed support for fetching document subresources over FTP and rendering of top level FTP resources. Navigating to FTP URLs results in showing a directory listing or a download depending on the type of resource. A bug in Google Chrome 74 and later resulted in dropping support for accessing FTP URLs over HTTP proxies. Proxy support for FTP was removed entirely in Google Chrome 76.</p> <p>The remaining capabilities of Google Chrome's FTP implementation were restricted to either displaying a directory listing or downloading a resource over unencrypted connections. </p> <p>In Chrome 77, FTP support was disabled by default for fifty percent of users but was available with flags.</p> <p>In Chrome 88 all FTP support is disabled.</p> <h2>Web Components v0 Removed</h2> <p>Web Components v0 have been in a reverse origin trial since Chrome 80. This allowed users of the API time to upgrade their sites while ensuring that new adopters of Web Components used version 1. The reverse origin trial ends with Chrome 87, making Chrome 88 the first in which version 0 is no longer supported. The Web Components v1 APIs replace Web Components v0 and are fully supported in Chrome, Safari, Firefox, and Edge. This removal covers the items listed below. </p> <ul> <li><a href="https://www.chromestatus.com/feature/4642138092470272">Custom Elements v0</a></li> <li><a href="https://www.chromestatus.com/feature/5144752345317376">HTML Imports</a></li> <li><a href="https://www.chromestatus.com/feature/4507242028072960">Shadow DOM v0</a></li> </ul> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>Unless otherwise noted, changes described below apply to the newest Chrome beta channel release for Android, Chrome OS, Linux, macOS, and Windows. Learn more about the features listed here through the provided links or from the list on <a href="https://www.chromestatus.com/features#milestone%3D88">ChromeStatus.com</a>. Chrome 88 is beta as of December 3, 2020.</p> <h1 style="text-align: left;">Digital Goods API</h1><p>Chrome now supports an API for&nbsp;<a href="https://www.chromestatus.com/feature/5339955595313152">querying and managing digital products</a>&nbsp;to facilitate in-app purchases from web applications. This is used with the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Payment_Request_API">Payment Request API</a>, which is used to make the actual purchases. The API would be linked to a digital distribution service connected via the user agent. In Chromium, this is specifically a web API wrapper around the <a href="https://developer.android.com/google/play/billing/integrate">Android Play Billing API</a>.</p><p>This is needed so that web apps in the Play Store can accept purchases for digital goods. (Play policies prevent them from accepting payment via any other method.) Without this, websites that sell digital goods are not installable through the Play Store.</p><p>In Chrome 88, this is available for Android in an origin trial. For a list of other origin trials starting in this release, see below.</p><h1>Origin Trials</h1> <p>This version of Chrome introduces the origin trial described below. Origin trials allow you to try new features and give feedback on usability, practicality, and effectiveness to the web standards community. To register for any of the origin trials currently supported in Chrome, including the ones described below, visit the <a href="https://developers.chrome.com/origintrials/#/trials/active">Origin Trials dashboard</a>. To learn more about origin trials themselves, visit the <a href="https://github.com/GoogleChrome/OriginTrials/blob/gh-pages/developer-guide.md">Origin Trials Guide for Web Developers</a>.</p><h2>New Origin Trials</h2> <h3>WebXR: AR Lighting Estimation</h3> <p>Allows sites to query for estimates of the environmental lighting conditions within <a href="https://developer.mozilla.org/en-US/docs/Web/API/XRSession">WebXR sessions</a>. This exposes both spherical harmonics representing the ambient lighting, as well as a cubemap texture representing "reflections". Adding lighting estimation can help to make models feel more natural and like they "fit" better with the user's environment. This can make them feel more "real" or "natural".</p> <p>In Chrome 88, this is available for Android only.</p> <h2>Completed Origin Trials</h2> <p>The following features, previously in Chrome origin trials, are now enabled by default.</p><h3 style="text-align: left;">performance.measureMemory() Method</h3><p>Adds the <span style="font-family: courier; font-size: x-small;">performance.measureMemory()</span> method that estimates the memory usage of the web page in case the page is currently isolated (e.g. on Desktop). Because the method is gated behind COOP/COEP web sites need to enabled <a href="https://web.dev/why-coop-coep/">crossOriginIsolated</a> to use this method. For more information, see&nbsp;<a href="https://web.dev/monitor-total-page-memory-usage/">Monitor your web page's total memory usage with measureMemory()</a>.</p> <h3>PointerLock unadjustedMovement</h3> <p>Adds the ability to request unadjusted/unaccelerated mouse movement data when in <code>PointerLock</code>. If <code>unadjustedMovement</code> is set to true, then the pointer movements will not be affected by the underlying platform modifications such as mouse acceleration. For more information, see <a href="https://web.dev/disable-mouse-acceleration/">Disable mouse acceleration to provide a better FPS gaming experience</a>.</p> <h1>Other features in this release</h1> <h3>Anchor target=_blank implies rel=noopener by Default</h3> <p>To mitigate "tab-napping" attacks, in which a new tab/window opened by a victim context may navigate that opener context, anchors that target <code>_blank</code> will behave as though <code>rel</code> is set to <code>noopener</code>. To opt out of this behavior, you can set <code>rel</code> to opener. This conforms to a change in the HTML standard.</p> <h3>Dark Mode Form Controls and Scrollbars</h3> <p>Dark mode is an accessibility feature that allows web authors to enable their web pages to be viewed in dark mode. When enabled, users are able to view dark mode supported websites by toggling the dark mode settings on their OS. The benefits of dark mode are being easier on the eyes in a low light environment and lower battery consumption. For more about dark mode and form controls, see <a href="https://web.dev/color-scheme/">Improved dark mode default styling with the color-scheme CSS property and the corresponding meta tag</a>.</p> <h3>AbortSignal in addEventListener()</h3> <p>Adds <a href="https://www.chromestatus.com/feature/5658622220566528">the <code>AbortSignal</code> option</a>, named <code>signal</code>, to the options parameter of <code>addEventListener()</code>. The <code>signal</code> option must first be created by an <code>AbortController</code> by accessing the <code>signal</code> property on an <code>AbortController</code> instance. Once the signal is passed in to <code>addEventListener()</code>, calling <code>AbortController.abort()</code> removes the event listener added with <code>addEventListener()</code>.</p> <h3>CSS aspect-ratio Property</h3> <p>Allows <a href="https://www.chromestatus.com/feature/5738050678161408">explicitly specifying an aspect ratio</a> for any element to get similar behavior to a replaced element. This generalizes the aspect ratio concept to general elements. It allows various effects, examples include sizing <code>&lt;iframe&gt;</code> elements using an aspect ratio, filmstrips where each element has the same height but needs an appropriate width, and cases where a replaced element is wrapped by a component but should keep the aspect ratio.</p> <h3>CSS Selectors 4: Complex :not()</h3> <p>Allows <a href="https://www.chromestatus.com/feature/5014164156186624">complex selectors inside the <code>:not()</code> pseudo class</a>, such as <code>:not(.a + .b .c)</code>.</p> <h3>Don't Clear adoptedStyleSheets on Adoption to/from &lt;template&gt;</h3> <p>When adopting a shadow root into a <code>&lt;template&gt;</code> document from a document that the <code>&lt;template&gt;</code> is in (or vice versa), Chrome will <a href="https://www.chromestatus.com/feature/5980793119703040">no longer clear its <code>adoptedStyleSheets</code></a>.<br /> <br /> Currently Chrome always clears <code>adoptedStyleSheets</code> when the shadow root containing it is adopted into a different document. This ensures that constructed stylesheets are not used across <code>&lt;iframe&gt;</code> elements, but this also covers adopting into/from <code>&lt;template&gt;</code> elements, causing some confusion for the web developer.</p> <h3>ElementInternals.shadowRoot Attribute</h3> <p><a href="https://www.chromestatus.com/feature/5721288276443136">A new attribute on <code>ElementInternals</code>, <code>shadowRoot</code></a>, allows custom elements to access their own shadow root, regardless of open/closed status. Additionally, further restrictions are added to the <code>attachInternals()</code> method to ensure that custom elements get the first chance to attach the <code>ElementInternals</code> interface. With this change, the <code>attachInternals()</code> method will throw an exception if called before the custom element constructor being run.</p> <p>This feature was mostly driven, at least initially, by the declarative Shadow DOM feature introduction. With declarative Shadow DOM, there was a problem with closed shadow roots: declarative shadow content loads before the custom element is upgraded, which means that closed shadow content would have been inaccessible.<br /> <br /> In addition to the declarative Shadow DOM use case, this feature also offers a convenience to custom element authors, who no longer need to keep a reference to attached shadow roots, and can instead use the <code>ElementInternals</code> interface.</p> <h3>Make Type Optional in WakeLock.request()</h3> <p>The <code>type</code> parameter in <code>WakeLock.request()</code> <a href="https://www.chromestatus.com/feature/5725750881681408">is now optional</a> and defaults to <code>"screen"</code>, which is currently the only allowed value. For more information, see <a href="https://web.dev/wake-lock/#get-wake-lock">Stay awake with the Screen Wake Lock API</a>.</p> <h3>Origin Isolation</h3> <p><a href="https://www.chromestatus.com/feature/5683766104162304">Origin isolation</a> allows developers to opt in to giving up certain cross-origin same-site access capabilities&#8212;namely synchronous scripting via <code>document.domain</code>, and calling <code>postMessage()</code> with <code>WebAssembly.Module</code> instances. This gives the browser more flexibility in implementation technologies. <br /> <br /> Reasons why a site may want better isolation include: performance isolation, allocations of large amounts of memory, side-channel protection (e.g. against Spectre), and improved memory measurement.</p> <h3>path() Support in clip-path CSS Property</h3> <p>Adds <a href="https://www.chromestatus.com/feature/5633533638868992">support for <code>path()</code></a> as a value for the CSS <code>clip-path</code> property, which allows specifying SVG-style paths for clipping. This supplements the four basic shapes currently supported by <code>clip-path</code>: <code>circle</code>, <code>ellipse</code>, <code>polygon</code>, and <code>url</code>. For example, the following would clip an element with a triangle:<br /> <br /> <code>clip-path: path(oddeven, 'M 5 5 h 100 v 100 Z')</code> </p> <h3>Permissions-Policy Header</h3> <p>The <code>Permissions-Policy</code> HTTP header <a href="https://www.chromestatus.com/feature/5745992911552512">replaces the existing <code>Feature-Policy</code> header</a> for controlling delegation of permissions and powerful features. The header uses a structured syntax, and allows sites to more tightly restrict which origins can be granted access to features.</p> <h3>RTCRtpTransceiver.stop()</h3> <p>Transceivers allow the sending and/or receiving of media in WebRTC. <a href="https://www.chromestatus.com/feature/5410592384876544">Stopping a transceiver </a>makes it permanently inactive and frees its network port, encoder, and decoder resources. This also makes its <code>m=</code> section in the SDP reusable by future transceivers, preventing the SDP from growing indefinitely as transceivers are added and removed. This is part of "Perfect Negotiation", which makes signaling in WebRTC race free and less error-prone. </p> <h3>JavaScript</h3> <p>This version of Chrome incorporates version 8.8 of the V8 JavaScript engine. It specifically includes the change listed below. You can find a complete <a href="https://v8.dev/blog">list of recent features</a> in the V8 release notes.</p><h4 style="text-align: left;">Shared Array Buffers, Atomics, and Futex APIs</h4><p>Adds the JavaScript type&nbsp;<code>SharedArrayBuffer</code>&nbsp;gated behind COOP/COEP. A&nbsp;<code>SharedArrayBuffer</code>&nbsp;allows a message to be posted to a worker by sending a reference instead of a copy of the sent data.<br /><br />JavaScript&nbsp;<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics">Atomics</a>&nbsp;provides atomic loads and stores and read/modify/write accesses to&nbsp;<code>SharedArrayBuffer</code>&nbsp;objects.&nbsp;<code>Atomics.wait()</code>&nbsp;provides the ability for a worker to wait for another worker to signal it, without having to spinlock.</p><p>The primary use case for&nbsp;<code>SharedArrayBuffer</code>&nbsp;is for asm.js code, but it is also useful for implementing other higher-level sharing between Workers.</p><p>For more information, see&nbsp;<a href="https://web.dev/coop-coep/">Making your website "cross-origin isolated" using COOP and COEP</a>.</p> <h1>Deprecations, and Removals</h1> <p>This version of Chrome introduces the deprecations and removals listed below. Visit ChromeStatus.com for lists of <a href="https://www.chromestatus.com/features#browsers.chrome.status%3A%22Deprecated%22">current deprecations</a> and <a href="https://www.chromestatus.com/features#browsers.chrome.status:%22Removed%22">previous removals</a>.</p> <h2>Don't Allow Popups During Page Unload (Enterprises)</h2> <p>Since Chrome 80, pages have no longer been able to <a href="https://www.chromestatus.com/feature/5989473649164288">open a new page during unloading</a> using <code>window.open()</code>. Since then enterprises have been able to use the AllowPopupsDuringPageUnload policy flag to allow popups during page unload. Starting in Chrome 88, this flag is no longer supported.</p> <h2>FTP Support Removed</h2> <p>Chrome is removing support for FTP URLs. The legacy FTP implementation in Chrome has no support for encrypted connections (FTPS), nor proxies. Usage of FTP in the browser is sufficiently low that it is no longer viable to invest in improving the existing FTP client. In addition, more capable FTP clients are available on all affected platforms.</p> <p>Google Chrome 72 and later removed support for fetching document subresources over FTP and rendering of top level FTP resources. Navigating to FTP URLs results in showing a directory listing or a download depending on the type of resource. A bug in Google Chrome 74 and later resulted in dropping support for accessing FTP URLs over HTTP proxies. Proxy support for FTP was removed entirely in Google Chrome 76.</p> <p>The remaining capabilities of Google Chrome's FTP implementation were restricted to either displaying a directory listing or downloading a resource over unencrypted connections. </p> <p>In Chrome 77, FTP support was disabled by default for fifty percent of users but was available with flags.</p> <p>In Chrome 88 all FTP support is disabled.</p> <h2>Web Components v0 Removed</h2> <p>Web Components v0 have been in a reverse origin trial since Chrome 80. This allowed users of the API time to upgrade their sites while ensuring that new adopters of Web Components used version 1. The reverse origin trial ends with Chrome 87, making Chrome 88 the first in which version 0 is no longer supported. The Web Components v1 APIs replace Web Components v0 and are fully supported in Chrome, Safari, Firefox, and Edge. This removal covers the items listed below. </p> <ul> <li><a href="https://www.chromestatus.com/feature/4642138092470272">Custom Elements v0</a></li> <li><a href="https://www.chromestatus.com/feature/5144752345317376">HTML Imports</a></li> <li><a href="https://www.chromestatus.com/feature/4507242028072960">Shadow DOM v0</a></li> </ul> <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 88: Digital Goods, Lighting Estimation in Augmented Reality, and More&url=https://blog.chromium.org/2020/12/chrome-88-digital-goods-lighting.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/2020/12/chrome-88-digital-goods-lighting.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/2020/12/chrome-88-digital-goods-lighting.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='6428367397639392467' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/11/transparent-privacy-practices.html' itemprop='url' title='Transparent privacy practices for Chrome Extensions'> Transparent privacy practices for Chrome Extensions </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, November 18, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <span id="docs-internal-guid-cafaa631-7fff-3cb4-1939-cb621696dbaf"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: &quot;Google Sans&quot;, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 258px; overflow: hidden; width: 620px;"><img height="258" src="https://lh5.googleusercontent.com/JwRHwUX4dV8F7GB1alb1FD7cmT_JaeU6uu99XM89mDrQ67PmyPfJnsQpg4IEefgaq881-VpijNYtXJerpROl6xSgPt06gyR4G7CLGBzmiNB2YusLhdeEEIM0CqAiBMZGCRWtuITMAw" style="margin-left: 0px; margin-top: 0px;" width="620" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Protecting users and their data is a fundamental aspect of the work we do on Chrome. Last year, as part of Google&#8217;s </span><a href="https://blog.google/technology/safety-security/update-project-strobe-new-policies-chrome-and-drive/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Project Strobe</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, we announced an important </span><a href="https://blog.chromium.org/2019/07/project-strobe-updates.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">set of policies</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> for extensions to protect users and their data. These policies require extensions to request only the permissions needed to implement their features. Additionally, we required more extensions to post privacy policies and handle user data securely.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Today, we are announcing changes that build upon those protections with an update to our developer policy that limits what extension developers can do with the data they collect. The new policy also requires developers to certify their data use practices, and display that information directly on the Chrome Web Store listing to help users understand an extension&#8217;s privacy practices.&nbsp;</span></p><br /><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: &quot;Google Sans&quot;, sans-serif; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Simplifying privacy practices for our users</span></h1><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Starting January 2021, each extension&#8217;s detail page in the Chrome Web Store will show developer-provided information about the data collected by the extension, in clear and easy to understand language. Data disclosure collection is available to developers today.&nbsp;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 327px; overflow: hidden; width: 624px;"><img height="327.0314381855526" src="https://lh3.googleusercontent.com/D8qVbFpZNHjEBQM9QZvkpxGCaLnGJICnjm2XrEp4taf6e9BkjYF_0DRWa2GlCkvxXL_L_xTn5IiV2OkEIP3gKkTK6N1PSw7W_9WZUXzO1XGTyyNmoJDx7zrGqV0DxRtNmcXyl-UXZw" style="margin-left: 0px; margin-top: -0.015719092776306565px;" width="624" /></span></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: &quot;Google Sans&quot;, sans-serif; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Updating our user data privacy policy</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">We are also introducing an </span><a href="https://developer.chrome.com/webstore/program_policies" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">additional policy</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> focused on limiting how extension developers use data they collect. More specifically:</span></p><ul style="margin-bottom: 0; margin-top: 0;"><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Ensuring the use or transfer of user data is for the primary benefit of the user and in accordance with the stated purpose of the extension.</span></p></li><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Reiterating that the sale of user data is never allowed. Google does not sell user data and extension developers may not do this either.</span></p></li><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Prohibiting the use or transfer of user data for personalized advertising.&nbsp;</span></p></li><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Prohibiting the use or transfer of user data for creditworthiness or any form of lending qualification and to data brokers or other information resellers.&nbsp;</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The item listing page will also display whether the developer has certified that their extension complies with this new policy.&nbsp;</span></p><br /><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: &quot;Google Sans&quot;, sans-serif; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Developer-provided privacy disclosures</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">To publish or update an extension, our new policy will require developers to provide data usage disclosures directly from the privacy tab of the </span><a href="https://chrome.google.com/webstore/developer/dashboard" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">developer dashboard</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. These disclosures include:</span></p><ul style="margin-bottom: 0; margin-top: 0;"><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The nature of the data being collected from users.&nbsp;&nbsp;</span></p></li><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The developer&#8217;s certification that they comply with the new Limited Use policy.&nbsp;</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The disclosure form is grouped by category to make it simpler for developers, and maps exactly to the disclosures that will be displayed to Chrome users. Most of this information will be consistent with existing privacy policies that developers have provided to the Chrome Web Store.&nbsp;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 445px; overflow: hidden; width: 624px;"><img height="445" src="https://lh6.googleusercontent.com/p0Z3g1UIKCOlowhkkKM79Etwf4kpn8NMp0R29w5mMA6Jf-9QHucxKmmAEghnNletu5i0Yc2bpQuNXPf6VJ6daopnJ5CFwZlpOtvFWNTbCJ85Pnh5mPARLyGO9238nvn-cVpOfOWzNw" style="margin-left: 0px; margin-top: 0px;" width="624" /></span></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Data disclosures collection will be made available to developers </span><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">today,</span><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> and will be displayed on the Chrome Web Store listing starting </span><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">January 18, 2021</span><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">For developers who have not yet provided privacy disclosures by January 18, 2021, a notice will be shown on their Chrome Web Store listings to inform users that the developer hasn&#8217;t certified that they comply with the Limited Use policy yet.&nbsp;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 405px; overflow: hidden; width: 688px;"><img height="405" src="https://lh5.googleusercontent.com/7I-nP3x2bonpzmNEA-c3IDHka0LN2GHzuTWkJY5vJ093v2GuzhOhLAHujTTFc4kXsXzepvDxCyQVA7NEzdl1DZoUvabOLiJvpgzAk8gLsP9Oev4WZ68_Rlj2YUUSaSUhz5f1N0c7QQ" style="margin-left: -42.77914110429443px; margin-top: 0px;" width="773.5582822085888" /></span></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">You can find the full policy in the </span><a href="https://developer.chrome.com/webstore/program_policies" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Developer Program Policies page</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> as well as additional details in the </span><a href="https://developer.chrome.com/webstore/user_data" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">User Data FAQ</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> .</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Thank you for working with us to build a better web with transparency, choice, and control for everyone.</span></p><div><span><br /></span></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Posted by Alexandre Blondin and Mark M. Jaycox, Chrome Product &amp; Policy</span></p><div><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div></span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <span id="docs-internal-guid-cafaa631-7fff-3cb4-1939-cb621696dbaf"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: &quot;Google Sans&quot;, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 258px; overflow: hidden; width: 620px;"><img height="258" src="https://lh5.googleusercontent.com/JwRHwUX4dV8F7GB1alb1FD7cmT_JaeU6uu99XM89mDrQ67PmyPfJnsQpg4IEefgaq881-VpijNYtXJerpROl6xSgPt06gyR4G7CLGBzmiNB2YusLhdeEEIM0CqAiBMZGCRWtuITMAw" style="margin-left: 0px; margin-top: 0px;" width="620" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Protecting users and their data is a fundamental aspect of the work we do on Chrome. Last year, as part of Google&#8217;s </span><a href="https://blog.google/technology/safety-security/update-project-strobe-new-policies-chrome-and-drive/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Project Strobe</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, we announced an important </span><a href="https://blog.chromium.org/2019/07/project-strobe-updates.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">set of policies</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> for extensions to protect users and their data. These policies require extensions to request only the permissions needed to implement their features. Additionally, we required more extensions to post privacy policies and handle user data securely.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Today, we are announcing changes that build upon those protections with an update to our developer policy that limits what extension developers can do with the data they collect. The new policy also requires developers to certify their data use practices, and display that information directly on the Chrome Web Store listing to help users understand an extension&#8217;s privacy practices.&nbsp;</span></p><br /><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: &quot;Google Sans&quot;, sans-serif; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Simplifying privacy practices for our users</span></h1><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Starting January 2021, each extension&#8217;s detail page in the Chrome Web Store will show developer-provided information about the data collected by the extension, in clear and easy to understand language. Data disclosure collection is available to developers today.&nbsp;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 327px; overflow: hidden; width: 624px;"><img height="327.0314381855526" src="https://lh3.googleusercontent.com/D8qVbFpZNHjEBQM9QZvkpxGCaLnGJICnjm2XrEp4taf6e9BkjYF_0DRWa2GlCkvxXL_L_xTn5IiV2OkEIP3gKkTK6N1PSw7W_9WZUXzO1XGTyyNmoJDx7zrGqV0DxRtNmcXyl-UXZw" style="margin-left: 0px; margin-top: -0.015719092776306565px;" width="624" /></span></span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: &quot;Google Sans&quot;, sans-serif; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Updating our user data privacy policy</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">We are also introducing an </span><a href="https://developer.chrome.com/webstore/program_policies" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">additional policy</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> focused on limiting how extension developers use data they collect. More specifically:</span></p><ul style="margin-bottom: 0; margin-top: 0;"><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Ensuring the use or transfer of user data is for the primary benefit of the user and in accordance with the stated purpose of the extension.</span></p></li><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Reiterating that the sale of user data is never allowed. Google does not sell user data and extension developers may not do this either.</span></p></li><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Prohibiting the use or transfer of user data for personalized advertising.&nbsp;</span></p></li><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Prohibiting the use or transfer of user data for creditworthiness or any form of lending qualification and to data brokers or other information resellers.&nbsp;</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The item listing page will also display whether the developer has certified that their extension complies with this new policy.&nbsp;</span></p><br /><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: &quot;Google Sans&quot;, sans-serif; font-size: 20pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Developer-provided privacy disclosures</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">To publish or update an extension, our new policy will require developers to provide data usage disclosures directly from the privacy tab of the </span><a href="https://chrome.google.com/webstore/developer/dashboard" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">developer dashboard</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. These disclosures include:</span></p><ul style="margin-bottom: 0; margin-top: 0;"><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The nature of the data being collected from users.&nbsp;&nbsp;</span></p></li><li dir="ltr" style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The developer&#8217;s certification that they comply with the new Limited Use policy.&nbsp;</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The disclosure form is grouped by category to make it simpler for developers, and maps exactly to the disclosures that will be displayed to Chrome users. Most of this information will be consistent with existing privacy policies that developers have provided to the Chrome Web Store.&nbsp;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 445px; overflow: hidden; width: 624px;"><img height="445" src="https://lh6.googleusercontent.com/p0Z3g1UIKCOlowhkkKM79Etwf4kpn8NMp0R29w5mMA6Jf-9QHucxKmmAEghnNletu5i0Yc2bpQuNXPf6VJ6daopnJ5CFwZlpOtvFWNTbCJ85Pnh5mPARLyGO9238nvn-cVpOfOWzNw" style="margin-left: 0px; margin-top: 0px;" width="624" /></span></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Data disclosures collection will be made available to developers </span><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">today,</span><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> and will be displayed on the Chrome Web Store listing starting </span><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">January 18, 2021</span><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">For developers who have not yet provided privacy disclosures by January 18, 2021, a notice will be shown on their Chrome Web Store listings to inform users that the developer hasn&#8217;t certified that they comply with the Limited Use policy yet.&nbsp;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 405px; overflow: hidden; width: 688px;"><img height="405" src="https://lh5.googleusercontent.com/7I-nP3x2bonpzmNEA-c3IDHka0LN2GHzuTWkJY5vJ093v2GuzhOhLAHujTTFc4kXsXzepvDxCyQVA7NEzdl1DZoUvabOLiJvpgzAk8gLsP9Oev4WZ68_Rlj2YUUSaSUhz5f1N0c7QQ" style="margin-left: -42.77914110429443px; margin-top: 0px;" width="773.5582822085888" /></span></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">You can find the full policy in the </span><a href="https://developer.chrome.com/webstore/program_policies" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Developer Program Policies page</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> as well as additional details in the </span><a href="https://developer.chrome.com/webstore/user_data" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">User Data FAQ</span></a><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> .</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Thank you for working with us to build a better web with transparency, choice, and control for everyone.</span></p><div><span><br /></span></div><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Posted by Alexandre Blondin and Mark M. Jaycox, Chrome Product &amp; Policy</span></p><div><span style="color: #434343; font-family: Roboto, sans-serif; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div></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:Transparent privacy practices for Chrome Extensions&url=https://blog.chromium.org/2020/11/transparent-privacy-practices.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/2020/11/transparent-privacy-practices.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/2020/11/transparent-privacy-practices.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/chrome%20extensions' rel='tag'> chrome extensions </a> , <a class='label' href='https://blog.chromium.org/search/label/privacy' rel='tag'> privacy </a> , <a class='label' href='https://blog.chromium.org/search/label/strobe' rel='tag'> strobe </a> </span> </div> </div> </div> <div class='post' data-id='6991304118159214020' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/11/tab-throttling-and-more-performance.html' itemprop='url' title='Tab throttling and more performance improvements in Chrome M87'> Tab throttling and more performance improvements in Chrome M87 </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Tuesday, November 17, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <div>Even if you have <b>a lot</b> of tabs open, you likely only focus on a small set of them to get a task done. Starting in this release, Chrome is actively managing your computer&#8217;s resources to make the tabs you care about fast&#8212;while allowing you to keep hundreds of tabs open&#8212;so you can pick up where you left off.</div><div><br /></div><div>In this release, we&#8217;re improving how Chrome understands and manages resources with Tab throttling, occlusion tracking and back/forward caching, so you can quickly get to what you need when you need it.</div><div><br /></div><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Tab throttling and Occlusion Tracking</h3><div>Knowing what tabs you&#8217;re using helps Chrome manage your computer&#8217;s resources more efficiently to get things done. We&#8217;ve made significant improvements by preventing background tabs from waking up your CPU too often, and no longer rendering tabs that you can&#8217;t see.</div><div><br /></div><div>We investigated how background tabs use system resources and found that JavaScript Timers represent &gt;40% of the work in background tabs. Reducing their impact on CPU and power is important to make the browser more efficient. Beginning in M87, we&#8217;re <a href="https://docs.google.com/document/d/11FhKHRcABGS4SWPFGwoL6g0ALMqrFKapCk5ZTKKupEk/view" target="_blank">throttling JavaScript timer wake-ups</a> in background tabs to once per minute. This reduces CPU usage by up to 5x, and extends battery life up to 1.25 hours in our internal testing. We&#8217;ve done this without sacrificing the background features that users care about, like playing music and getting notifications.</div><div><br /></div><div>Next, we&#8217;re bringing <a href="https://docs.google.com/document/d/1Di4DiGwHamIgLYjaOpripOJQinUquUuyxuiim2-WUIs/view" target="_blank">Occlusion Tracking</a>--which was previously added to Chrome OS and Mac--to Windows, which allows Chrome to know which windows and tabs are actually visible to you. With this information, Chrome can optimize resources for the tabs you are using, not the ones you&#8217;ve minimized, making Chrome up to 25% faster to start up and 7% faster to load pages, all while using less memory.</div></div><div><br /></div><div>These updates will be gradually rolling out in M87 and our next release, M88.&nbsp;</div><div><br /></div><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Back/forward cache</h3><div>How many times have you visited a website and clicked a link to go to another page, only to realize it's not what you wanted and click the back button? On mobile devices, this happens a lot: 1 in 5 navigations are a back/forward navigation. This is where a back/forward cache shines! It&#8217;s a browser optimization which enables instant back and forward navigations. In Chrome 87, our back/forward cache will make 20% of those back/forward navigations instant, with plans to increase this to 50% through further improvements and developer outreach in the near future. Here is how it works:</div><div>&nbsp;</div></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/_me7_7C6Drs" width="320" youtube-src-id="_me7_7C6Drs"></iframe></div><br /><div><br /></div><div><div>Back/forward cache is one of our long wished-for feature requests in Chrome and now with Chrome 87 we will gradually launch it to Chrome for Android users. Head over to <a href=" https://web.dev/bfcache/" target="_blank">this technical article</a> to learn more about how we added back/forward cache within Chrome's multi-process architecture and if you're a web developer, learn how to make the most of the back/forward cache on your website.</div></div><div><br /></div><div>Posted by&nbsp;Mark Chang, Chrome Product Manager</div><div><br /></div><div><br /></div><div><br /></div><div><i><span style="color: #666666;">Data source: Real world data anonymously aggregated from Chrome pre-stable channels.</span></i></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> <div>Even if you have <b>a lot</b> of tabs open, you likely only focus on a small set of them to get a task done. Starting in this release, Chrome is actively managing your computer&#8217;s resources to make the tabs you care about fast&#8212;while allowing you to keep hundreds of tabs open&#8212;so you can pick up where you left off.</div><div><br /></div><div>In this release, we&#8217;re improving how Chrome understands and manages resources with Tab throttling, occlusion tracking and back/forward caching, so you can quickly get to what you need when you need it.</div><div><br /></div><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Tab throttling and Occlusion Tracking</h3><div>Knowing what tabs you&#8217;re using helps Chrome manage your computer&#8217;s resources more efficiently to get things done. We&#8217;ve made significant improvements by preventing background tabs from waking up your CPU too often, and no longer rendering tabs that you can&#8217;t see.</div><div><br /></div><div>We investigated how background tabs use system resources and found that JavaScript Timers represent &gt;40% of the work in background tabs. Reducing their impact on CPU and power is important to make the browser more efficient. Beginning in M87, we&#8217;re <a href="https://docs.google.com/document/d/11FhKHRcABGS4SWPFGwoL6g0ALMqrFKapCk5ZTKKupEk/view" target="_blank">throttling JavaScript timer wake-ups</a> in background tabs to once per minute. This reduces CPU usage by up to 5x, and extends battery life up to 1.25 hours in our internal testing. We&#8217;ve done this without sacrificing the background features that users care about, like playing music and getting notifications.</div><div><br /></div><div>Next, we&#8217;re bringing <a href="https://docs.google.com/document/d/1Di4DiGwHamIgLYjaOpripOJQinUquUuyxuiim2-WUIs/view" target="_blank">Occlusion Tracking</a>--which was previously added to Chrome OS and Mac--to Windows, which allows Chrome to know which windows and tabs are actually visible to you. With this information, Chrome can optimize resources for the tabs you are using, not the ones you&#8217;ve minimized, making Chrome up to 25% faster to start up and 7% faster to load pages, all while using less memory.</div></div><div><br /></div><div>These updates will be gradually rolling out in M87 and our next release, M88.&nbsp;</div><div><br /></div><div><br /></div><div><br /></div><div><h3 style="text-align: left;">Back/forward cache</h3><div>How many times have you visited a website and clicked a link to go to another page, only to realize it's not what you wanted and click the back button? On mobile devices, this happens a lot: 1 in 5 navigations are a back/forward navigation. This is where a back/forward cache shines! It&#8217;s a browser optimization which enables instant back and forward navigations. In Chrome 87, our back/forward cache will make 20% of those back/forward navigations instant, with plans to increase this to 50% through further improvements and developer outreach in the near future. Here is how it works:</div><div>&nbsp;</div></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/_me7_7C6Drs" width="320" youtube-src-id="_me7_7C6Drs"></iframe></div><br /><div><br /></div><div><div>Back/forward cache is one of our long wished-for feature requests in Chrome and now with Chrome 87 we will gradually launch it to Chrome for Android users. Head over to <a href=" https://web.dev/bfcache/" target="_blank">this technical article</a> to learn more about how we added back/forward cache within Chrome's multi-process architecture and if you're a web developer, learn how to make the most of the back/forward cache on your website.</div></div><div><br /></div><div>Posted by&nbsp;Mark Chang, Chrome Product Manager</div><div><br /></div><div><br /></div><div><br /></div><div><i><span style="color: #666666;">Data source: Real world data anonymously aggregated from Chrome pre-stable channels.</span></i></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:Tab throttling and more performance improvements in Chrome M87&url=https://blog.chromium.org/2020/11/tab-throttling-and-more-performance.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/2020/11/tab-throttling-and-more-performance.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/2020/11/tab-throttling-and-more-performance.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='1611000898483985202' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/10/reducing-abusive-notification-content.html' itemprop='url' title='Reducing abusive notification content'> Reducing abusive notification content </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Wednesday, October 21, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <span id="docs-internal-guid-c03db2c7-7fff-904f-9b23-1c4d3de2be8b"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Although notifications on the web are useful for a variety of applications, they can also be misused for phishing, malware or fake messages that imitate system notifications for the purpose of generating user interactions.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">In Chrome 86, we&#8217;ve expanded on previous efforts [</span><a href="https://blog.chromium.org/2020/01/introducing-quieter-permission-ui-for.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">1</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">] [</span><a href="https://blog.chromium.org/2020/05/protecting-chrome-users-from-abusive.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">2</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">] to improve the quality of the web notification ecosystem by adding enforcement for websites sending abusive notification content.&nbsp;This includes sites sending messages containing links to malware or that seek to spoof system administrative messages.&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">When abusive notification content is detected on an origin, Chrome will automatically display the permission requests using a quieter UI, shown below.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: justify;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">How is this different from previous abusive notification protections?</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Chrome 80 introduced the quiet Notification permission UI. Chrome 84 announced auto-enrolment in quiet notification UI for websites with abusive notification permission requests, such as sites that use deceptive patterns to request notification permission.&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The new enforcement in Chrome 86 focuses on notification </span><span style="font-family: Arial; font-size: 11pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">content</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> and is triggered by sites that have a history of sending messages containing abusive content. This treatment applies to sites that try to trick users into accepting the notification permission for malicious purposes, for example sites that use web notifications to send malware or to mimic system messages to obtain user login credentials.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: justify;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">What does it look like?</span></h2><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 335px; overflow: hidden; width: 504px;"><img height="335" src="https://lh4.googleusercontent.com/TQ10szluPdXsKoYIeYe5ljxjVIoJzcCvLybUa3tEA24a6vISYkwiqAz9VymzgyNY_N8tfqHKvxSv9WhrcC-GvDc4uaiCE1T52y3C6xK1K--Lazicm9PSBiGxGVCyjFtDTBJaEOuExA" style="margin-left: 0px; margin-top: 0px;" width="504" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Desktop UI for quiet notifications UI on abusive websites. The new UI discourages users from allowing notifications from these websites.&nbsp;&nbsp;</span></p><div><span><br /></span></div><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 436px; overflow: hidden; width: 244px;"><img height="436" src="https://lh4.googleusercontent.com/ZlyxAU84FOdJ_buyRJv4_Hao7YKG217MGd6T3R4TLwyt2-s8AIQ_20LAFraE_75QoEjzd-mbwaUswI_sa3_iotIOp52Z1shXS76jAJQvPMUApOwa9Yby8DI3OEoMiEvM4JntQMrUXA" style="margin-left: -0.670329670329668px; margin-top: 0px;" width="245.34065934065933" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Mobile UI for quiet notifications on abusive websites.&nbsp; The new UI discourages users from allowing notifications from these websites.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">This UI exactly matches the UI that was previously announced for Chrome 84. The only difference is in Chrome 86 we will begin blocking notification permission requests when sites have a pattern of sending abusive notification content.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: justify;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Why are we doing this?</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Abusive notification prompts are one of the top user complaints we receive about Chrome. Our goal with these changes is to improve the experience for Chrome users and to reduce the incentive for abusive sites to misuse the web notifications feature.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: justify;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">How will Chrome detect sites sending abusive notification content?&nbsp;&nbsp;</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Google&#8217;s automated web crawling service will occasionally subscribe to website push notifications if the push permission is requested. Notifications that are sent to the automated Chrome instances, using Safe Browsing technology, will be evaluated for abusive content, and sites sending abusive notifications will be flagged for enforcement if the issue is unresolved.&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">What happens if abusive notifications are detected from my website?</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">When a site is found to be in &#8220;Failing&#8221; status for any type of notification abuse, Search Console will send an email to registered site owners and users in the site's Search Console at least 30 calendar days prior to the start of enforcement. During the 30 day grace period websites can address the issue and request another review.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">We recommend concerned site owners and developers review the </span><a href="https://www.google.com/webmasters/tools/abusive-notifications-unverified?pli=1" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Abusive Notifications Report</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> in Search Console. The Search Console help center has additional information on the </span><a href="https://support.google.com/webtools/answer/9798950" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Abusive Notifications Report</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> and the </span><a href="https://support.google.com/webtools/answer/9799831" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">abusive notification review process</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">What should I do if my website failed the abusive notification review?&nbsp;</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The Search Console help center has a </span><a href="https://support.google.com/webtools/answer/9799048" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">guide</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> for how to fix abusive notifications and request another review of your website.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Are any further abusive notification protections planned?&nbsp;&nbsp;&nbsp;</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Prior to the release of Chrome&#8217;s abusive notifications protections, many users have already unintentionally allowed notifications from websites engaging in abusive activity.&nbsp; In an upcoming release, Chrome will revert the notification permission status from &#8220;granted&#8221; to &#8220;default&#8221; for abusive origins, preventing further notifications unless the user returns to the abusive origin and re-enables notifications.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">We&#8217;ll be listening for feedback from users and developers about the effectiveness of current enforcements and may make further changes based on that feedback. </span></p><div><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div><div><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Posted by PJ McLachlan, Product Manager</span></div></span> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <span id="docs-internal-guid-c03db2c7-7fff-904f-9b23-1c4d3de2be8b"><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Although notifications on the web are useful for a variety of applications, they can also be misused for phishing, malware or fake messages that imitate system notifications for the purpose of generating user interactions.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">In Chrome 86, we&#8217;ve expanded on previous efforts [</span><a href="https://blog.chromium.org/2020/01/introducing-quieter-permission-ui-for.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">1</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">] [</span><a href="https://blog.chromium.org/2020/05/protecting-chrome-users-from-abusive.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">2</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">] to improve the quality of the web notification ecosystem by adding enforcement for websites sending abusive notification content.&nbsp;This includes sites sending messages containing links to malware or that seek to spoof system administrative messages.&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">When abusive notification content is detected on an origin, Chrome will automatically display the permission requests using a quieter UI, shown below.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: justify;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">How is this different from previous abusive notification protections?</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Chrome 80 introduced the quiet Notification permission UI. Chrome 84 announced auto-enrolment in quiet notification UI for websites with abusive notification permission requests, such as sites that use deceptive patterns to request notification permission.&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The new enforcement in Chrome 86 focuses on notification </span><span style="font-family: Arial; font-size: 11pt; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">content</span><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> and is triggered by sites that have a history of sending messages containing abusive content. This treatment applies to sites that try to trick users into accepting the notification permission for malicious purposes, for example sites that use web notifications to send malware or to mimic system messages to obtain user login credentials.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: justify;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">What does it look like?</span></h2><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 335px; overflow: hidden; width: 504px;"><img height="335" src="https://lh4.googleusercontent.com/TQ10szluPdXsKoYIeYe5ljxjVIoJzcCvLybUa3tEA24a6vISYkwiqAz9VymzgyNY_N8tfqHKvxSv9WhrcC-GvDc4uaiCE1T52y3C6xK1K--Lazicm9PSBiGxGVCyjFtDTBJaEOuExA" style="margin-left: 0px; margin-top: 0px;" width="504" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Desktop UI for quiet notifications UI on abusive websites. The new UI discourages users from allowing notifications from these websites.&nbsp;&nbsp;</span></p><div><span><br /></span></div><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 436px; overflow: hidden; width: 244px;"><img height="436" src="https://lh4.googleusercontent.com/ZlyxAU84FOdJ_buyRJv4_Hao7YKG217MGd6T3R4TLwyt2-s8AIQ_20LAFraE_75QoEjzd-mbwaUswI_sa3_iotIOp52Z1shXS76jAJQvPMUApOwa9Yby8DI3OEoMiEvM4JntQMrUXA" style="margin-left: -0.670329670329668px; margin-top: 0px;" width="245.34065934065933" /></span></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Mobile UI for quiet notifications on abusive websites.&nbsp; The new UI discourages users from allowing notifications from these websites.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">This UI exactly matches the UI that was previously announced for Chrome 84. The only difference is in Chrome 86 we will begin blocking notification permission requests when sites have a pattern of sending abusive notification content.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: justify;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Why are we doing this?</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Abusive notification prompts are one of the top user complaints we receive about Chrome. Our goal with these changes is to improve the experience for Chrome users and to reduce the incentive for abusive sites to misuse the web notifications feature.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt; text-align: justify;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">How will Chrome detect sites sending abusive notification content?&nbsp;&nbsp;</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Google&#8217;s automated web crawling service will occasionally subscribe to website push notifications if the push permission is requested. Notifications that are sent to the automated Chrome instances, using Safe Browsing technology, will be evaluated for abusive content, and sites sending abusive notifications will be flagged for enforcement if the issue is unresolved.&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">What happens if abusive notifications are detected from my website?</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">When a site is found to be in &#8220;Failing&#8221; status for any type of notification abuse, Search Console will send an email to registered site owners and users in the site's Search Console at least 30 calendar days prior to the start of enforcement. During the 30 day grace period websites can address the issue and request another review.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">We recommend concerned site owners and developers review the </span><a href="https://www.google.com/webmasters/tools/abusive-notifications-unverified?pli=1" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Abusive Notifications Report</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> in Search Console. The Search Console help center has additional information on the </span><a href="https://support.google.com/webtools/answer/9798950" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">Abusive Notifications Report</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> and the </span><a href="https://support.google.com/webtools/answer/9799831" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">abusive notification review process</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">.</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">What should I do if my website failed the abusive notification review?&nbsp;</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The Search Console help center has a </span><a href="https://support.google.com/webtools/answer/9799048" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;">guide</span></a><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> for how to fix abusive notifications and request another review of your website.&nbsp;&nbsp;</span></p><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Are any further abusive notification protections planned?&nbsp;&nbsp;&nbsp;</span></h2><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Prior to the release of Chrome&#8217;s abusive notifications protections, many users have already unintentionally allowed notifications from websites engaging in abusive activity.&nbsp; In an upcoming release, Chrome will revert the notification permission status from &#8220;granted&#8221; to &#8220;default&#8221; for abusive origins, preventing further notifications unless the user returns to the abusive origin and re-enables notifications.&nbsp;&nbsp;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">We&#8217;ll be listening for feedback from users and developers about the effectiveness of current enforcements and may make further changes based on that feedback. </span></p><div><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div><div><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Posted by PJ McLachlan, Product Manager</span></div></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:Reducing abusive notification content&url=https://blog.chromium.org/2020/10/reducing-abusive-notification-content.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/2020/10/reducing-abusive-notification-content.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/2020/10/reducing-abusive-notification-content.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/abusive%20notifications' rel='tag'> abusive notifications </a> </span> </div> </div> </div> <div class='post' data-id='3815083068739828814' itemscope='' itemtype='http://schema.org/BlogPosting'> <h2 class='title' itemprop='name'> <a href='https://blog.chromium.org/2020/10/chrome-87-beta-webauthn-in-devtools.html' itemprop='url' title='Chrome 87 Beta: WebAuthn in DevTools, Pan/Tilt/Zoom, Flow Relative Shorthands and More'> Chrome 87 Beta: WebAuthn in DevTools, Pan/Tilt/Zoom, Flow Relative Shorthands and More </a> </h2> <div class='post-header'> <div class='published'> <span class='publishdate' itemprop='datePublished'> Thursday, October 15, 2020 </span> </div> </div> <div class='post-body'> <div class='post-content' itemprop='articleBody'> <script type='text/template'> <p>Unless otherwise noted, changes described below apply to the newest Chrome beta channel release for Android, Chrome OS, Linux, macOS, and Windows. Learn more about the features listed here through the provided links or from the list on <a href="https://www.chromestatus.com/features#milestone%3D76">ChromeStatus.com</a>. Chrome 87 is beta as of October 15, 2020.</p> <h2>WebAuthn Tab in DevTools</h2> <p>Testing web authentication has long been difficult because developers need devices to test their code. Starting in Chrome 87, authentication can be emulated and debugged using a new panel in DevTools. You can find the panel in DevTools by selecting <strong>More options</strong>, then <strong>More tools</strong>, then <strong>WebAuthn</strong>. To learn how to use it, see the section in <a href="https://developers.google.com/web/updates/2020/10/devtools#webauthn">What's New in DevTools (Chrome 87)</a>.</p> <p><span id="docs-internal-guid-9e3d9bb3-7fff-171d-f7d8-cc1b47dd6a5c"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 399px; overflow: hidden; width: 624px;"><img height="399" src="https://lh3.googleusercontent.com/24rUeaeOXh0gI5GYDqzM4VKnIbKNU6UOtlJKpilFZgJlSfCQhhJW1yk3Bzk42zLJ_iReS73Fh6loZTCH-bzF7Hk4FI-GJz9RiBsGOo_Ap6el9lYnvA3FJx7WmZSM3KHs62XAj6LYmw" style="margin-left: 0px; margin-top: 0px;" width="624" /></span></span></span></p> <h2>Control camera pan, tilt, and zoom</h2> <p>Room-scale video conferencing solutions deploy cameras with pan, tilt, and zoom capabilities so that software can point the camera at meeting participants. Starting in Chrome 87, the pan, tilt, and zoom features on cameras are accessible to websites using media track constraints in <code>MediaDevices.getUserMedia()</code> and <code>MediaStreamTrack.applyConstraints()</code>.</p> <p>Websites are only allowed to control these capabilities when users explicitly grant permission. For details on using the new capabilities and a demo, see <a href="https://web.dev/camera-pan-tilt-zoom/">Control camera pan, tilt, and zoom</a>.</p> <video autoplay="" controls="" muted=""> <source src="https://storage.googleapis.com/web-dev-assets/camera-pan-tilt-zoom/ptz_h264.mp4" type="video/mp4"> </video> <h2>CSS flow-relative shorthand and offset properties</h2> <p>The trend in CSS for many years has been to supplement physical properties with logical properties. Properties that assume language flows left to right and top to bottom don't work in non-European text such as vertical Chinese text, or Arabic. Modern CSS rules use flow-relative terms like start and end and provide rules for dealing with the text's axis (direction). </p> <p>The first step in implementing this in Chrome was to implement the most granular flow-relative features of the <a href="https://www.w3.org/TR/css-logical-1">CSS Logical Properties and Values</a> spec. Chrome 87 ships shorthands and <br /> offsets to make these logical properties and values a bit easier to write. What was once written with multiple CSS rules can now be written as one. For example, separate rules for <code>margin-block-start</code> and <code>margin-block-end</code> may now be written using a single <code>margin-block</code> property. </p> <p>For a list of all flow-relative shorthands now supported by Chrome, and explanations for how to use them, see <a href="https://web.dev/logical-property-shorthands/">Logical layout enhancements with flow-relative shorthands</a>. For more CSS-related updates, see the CSS section, below.</p> <h2>Completed Origin Trials</h2> <p>Origin trials allow you to try new features and give feedback on usability, practicality, and effectiveness to the web standards community. The following feature, previously in a Chrome origin trial, is now enabled by default.</p> <h4 style="text-align: left;">Cookie Store API</h4> <p>The Cookie Store API <a href="https://www.chromestatus.com/feature/5658847691669504">exposes HTTP cookies to service workers</a> and offers an asynchronous alternative to <code>document.cookie</code>.</p> <h2>Other features in this release</h2> <h4 style="text-align: left;">cross-origin isolation</h4> <p>Chrome 87 has a number of changes related to cross-origin isolation. Chrome will now use origin instead of site as agent cluster key for cross-origin isolated agent clusters. Mutation of <code>document.domain</code> is no longer supported for cross-origin isolated agent clusters. This change also introduces <code>window.crossOriginIsolated</code>, a boolean that indicates whether APIs that require cross-origin isolation are allowed to use it. Supporting APIs include:</p> <ul> <li><code><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer">SharedArrayBuffer</a></code> (required for WebAssembly Threads)</li> <li><code><a href="https://web.dev/monitor-total-page-memory-usage/">performance.measureMemory()</a></code></li> <li><a href="https://wicg.github.io/js-self-profiling/">JS Self-Profiling API</a></li> </ul> <p>For more information, see <a href="https://web.dev/coop-coep/">Making your website "cross-origin isolated" using COOP and COEP</a>.</p> <h4 style="text-align: left;">iframe attribute for limiting same-origin iframe document access</h4> <p>Adds <a href="https://www.chromestatus.com/feature/5648946183536640">the <code>disallowdocumentaccess</code> property</a> to disallow cross-document scripting between iframes from the same origin in the same parent document. This also puts same-origin iframes in separate event loops.</p><p><b>Note:</b>&nbsp;This item was pulled from Chrome 87 beta and was not in later builds.</p> <h4 style="text-align: left;">isInputPending()</h4> <p>Sometimes long-running scripts block user input. A lag between a user's action and a response by an app is a bad user experience. To address this, Chrome has added a method called <code>isInputPending()</code>, accessible from <code>navigator.scheduling</code>, which can be called from long-running operations. You can find <a href="https://wicg.github.io/is-input-pending/#examples-of-usage">an example of the method's use</a> in the draft spec.</p> <h4 style="text-align: left;">Range Request Headers in Service Workers</h4> <p>HTTP range requests, which have been available in major browsers for several years, allow servers to send requested data to the client in chunks. This has proved especially useful for large media files where the user experience is improved through smoother playback and improved pause and resume functions.</p> <p>Historically, range requests and services workers did not work well together, forcing developers to build <a href="https://code-tree.github.io/sw-partial-content/">work-arounds</a>. Starting in Chrome 87, passing range requests through to the network from inside a service worker will "just work."</p> <p>For an explanation of the issues with range requests and what's changed in Chrome 87, see <a href="https://web.dev/sw-range-requests/">Handling range requests in a service worker</a>.</p> <h4 style="text-align: left;">Streams API: transferable streams</h4> <p><a href="https://www.chromestatus.com/feature/5298733486964736">Transferable streams</a> now allows <code>ReadableStream</code>, <code>WritableStream</code>, and <code>TransformStream</code> objects to be passed as arguments to <code>postMessage()</code>. The streams APIs provide ubiquitous, interoperable primitives for creating, composing, and consuming streams of data. A natural thing to do with a stream is to pass it to a web worker. This provides a fluent primitive for offloading work to another thread. </p> <p>Offloading work onto a worker is important for a smooth user experience, but the ergonomics can be awkward. Transferable streams solve this problem for streams. Once the stream itself has been transferred, the data is transparently cloned in the background.</p> <h4 style="text-align: left;">Transition related event handlers</h4> <p>The <code>ontransitionrun</code>, <code>ontransitionstart</code>, and <code>ontransitioncancel</code> <a href="https://www.chromestatus.com/feature/5354694014664704">event handler attributes</a> allow developers to add event listeners for <code>'transitionrun'</code>, <code>'transitionstart'</code>, and <code>'transitioncancel'</code> events on elements, Document objects, and Window objects.</p> <h4 style="text-align: left;">WakeLockSentinel.released Attribute</h4> <p>The <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/WakeLockSentinel">WakeLockSentinel</a></code> object has <a href="https://www.chromestatus.com/feature/5632527123349504">a new property called <code>released</code></a> that indicates whether a sentinel has already been released. It defaults to false and changes to true when a release event is dispatched. The new attribute helps web developers know when locks are released so that they do not need to keep track of them manually. </p> <h3>CSS</h3> <h4>@font-face descriptors to override font metrics</h4> <p>New <a href="https://www.chromestatus.com/feature/5651198621253632"><code>@font-face</code> descriptors</a> have been added to <code>ascent-override</code>, <code>descent-override</code>, and <code>line-gap-override</code> to override metrics of the font. This Improves interoperably across browsers and operating systems, so that the same font always looks the same on the same site, regardless of OS or browser. Additionally, it aligns metrics between two web fonts present simultaneously, but for different glyphs. Finally, it overrides font metrics for a fallback font to emulate a web font, to minimize cumulative layout shift.</p> <h4>Text Decoration and Underline Properties</h4> <p>Chrome now supports <a href="https://www.chromestatus.com/feature/5747636764147712">several new text decoration and underline properties</a>. These properties solve use cases where underlines are too close to the text baseline and ink-skipping triggers too early in a text run. These use cases solve problems caused by the launch of the <code><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/text-decoration-skip-ink">text-decoration-skip-ink </a></code>property. The new properties are <code>text-decoration-thickness</code>, <code>text-underline-offset</code> and a <code>from-font</code> keyword for <code>text-underline-position</code>.</p> <h4>The quotes Property Supports the 'auto' Value</h4> <p>CSS2 allowed browsers to define the default value for the quotes property, which Chrome formerly followed. Chrome 87 <a href="https://www.chromestatus.com/feature/4922661488558080">now follows CSS Generated Content Module Level 3</a> in which the <code>'auto'</code> keyword is the default value. That spec requires that a typographically appropriate value be used for quotes based on the content language of the element and/or its parent.</p> <h3>JavaScript</h3> <p>This version of Chrome incorporates version 8.7 of the V8 JavaScript engine. It specifically includes the changes listed below. You can find a complete <a href="https://v8.dev/blog">list of recent features</a> in the V8 release notes.</p> <h4>Atomics.waitAsync()</h4> <p><a href="https://www.chromestatus.com/feature/6243382101803008">Chrome now supports <code>Atomics.waitAsync()</code></a>, the async version of <code>Atomics.wait()</code>. <code>Atomics.waitAsync()</code> allows programmers to wait on a <code>SharedArrayBuffer</code> location in the same fashion as <code>Atomics.wait()</code> but returns a Promise instead.</p> <p><code>Atomics.wait()</code> blocks the thread and cannot be used on the main web browser thread, where blocking is disallowed. This makes coordination via <code>SharedArrayBuffers</code> between the main thread and worker threads more ergonomic.</p> <h3 style="text-align: left;">Deprecations and Removals</h3> <p>This version of Chrome introduces the deprecations and removals listed below. Visit ChromeStatus.com for lists of <a href="https://www.chromestatus.com/features#browsers.chrome.status%3A%22Deprecated%22">current deprecations</a> and <a href="https://www.chromestatus.com/features#browsers.chrome.status:%22Removed%22">previous removals</a>.</p> <h4 style="text-align: left;">Comma separator in iframe allow attribute</h4> <p>Permissions policy declarations in an <code>&lt;iframe&gt;</code> tag <a href="https://www.chromestatus.com/feature/5740835259809792">can no longer use commas</a> as a separator between items. Developers should use semicolons instead.</p> <h4 style="text-align: left;">-webkit-font-size-delta</h4> <p>Blink <a href="https://www.chromestatus.com/feature/6267981828980736">will no longer support</a> the rarely-used <code>-webkit-font-size-delta</code> property. Developers should use <code>font-size</code> to control font size instead.</p> <h4 style="text-align: left;">Deprecate FTP support</h4> <p>Chrome is <a href="https://www.chromestatus.com/features/6246151319715840">deprecating and removing support for FTP URLs</a>. The current FTP implementation in Google Chrome has no support for encrypted connections (FTPS), nor proxies. Usage of FTP in the browser is sufficiently low that it is no longer viable to invest in improving the existing FTP client. In addition, more capable FTP clients are available on all affected platforms.<br /> <br /> Google Chrome 72 and later removed support for fetching document subresources over FTP and rendering of top level FTP resources. Currently navigating to FTP URLs results in showing a directory listing or a download depending on the type of resource. A bug in Google Chrome 74 and later resulted in dropping support for accessing FTP URLs over HTTP proxies. Proxy support for FTP was removed entirely in Google Chrome 76. In Chrome 86, FTP was turned off for pre-release channels (Canary and Beta) and was experimentally turned off for one percent of stable users. <br /> <br /> The remaining capabilities of Google Chrome's FTP implementation are restricted to either displaying a directory listing or downloading a resource over unencrypted connections. </p> <p>Remainder of the deprecation follows this timeline:</p> <h4>Chrome 87</h4> <p>FTP support will be disabled by default for fifty percent of users but can be enabled using the flags listed above.</p> <h4>Chrome 88</h4> <p>FTP support will be disabled.</p> <span itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'> <meta content='https://plus.google.com/116899029375914044550' itemprop='url'/> </span> </script> <noscript> <p>Unless otherwise noted, changes described below apply to the newest Chrome beta channel release for Android, Chrome OS, Linux, macOS, and Windows. Learn more about the features listed here through the provided links or from the list on <a href="https://www.chromestatus.com/features#milestone%3D76">ChromeStatus.com</a>. Chrome 87 is beta as of October 15, 2020.</p> <h2>WebAuthn Tab in DevTools</h2> <p>Testing web authentication has long been difficult because developers need devices to test their code. Starting in Chrome 87, authentication can be emulated and debugged using a new panel in DevTools. You can find the panel in DevTools by selecting <strong>More options</strong>, then <strong>More tools</strong>, then <strong>WebAuthn</strong>. To learn how to use it, see the section in <a href="https://developers.google.com/web/updates/2020/10/devtools#webauthn">What's New in DevTools (Chrome 87)</a>.</p> <p><span id="docs-internal-guid-9e3d9bb3-7fff-171d-f7d8-cc1b47dd6a5c"><span style="font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="border: none; display: inline-block; height: 399px; overflow: hidden; width: 624px;"><img height="399" src="https://lh3.googleusercontent.com/24rUeaeOXh0gI5GYDqzM4VKnIbKNU6UOtlJKpilFZgJlSfCQhhJW1yk3Bzk42zLJ_iReS73Fh6loZTCH-bzF7Hk4FI-GJz9RiBsGOo_Ap6el9lYnvA3FJx7WmZSM3KHs62XAj6LYmw" style="margin-left: 0px; margin-top: 0px;" width="624" /></span></span></span></p> <h2>Control camera pan, tilt, and zoom</h2> <p>Room-scale video conferencing solutions deploy cameras with pan, tilt, and zoom capabilities so that software can point the camera at meeting participants. Starting in Chrome 87, the pan, tilt, and zoom features on cameras are accessible to websites using media track constraints in <code>MediaDevices.getUserMedia()</code> and <code>MediaStreamTrack.applyConstraints()</code>.</p> <p>Websites are only allowed to control these capabilities when users explicitly grant permission. For details on using the new capabilities and a demo, see <a href="https://web.dev/camera-pan-tilt-zoom/">Control camera pan, tilt, and zoom</a>.</p> <video autoplay="" controls="" muted=""> <source src="https://storage.googleapis.com/web-dev-assets/camera-pan-tilt-zoom/ptz_h264.mp4" type="video/mp4"> </video> <h2>CSS flow-relative shorthand and offset properties</h2> <p>The trend in CSS for many years has been to supplement physical properties with logical properties. Properties that assume language flows left to right and top to bottom don't work in non-European text such as vertical Chinese text, or Arabic. Modern CSS rules use flow-relative terms like start and end and provide rules for dealing with the text's axis (direction). </p> <p>The first step in implementing this in Chrome was to implement the most granular flow-relative features of the <a href="https://www.w3.org/TR/css-logical-1">CSS Logical Properties and Values</a> spec. Chrome 87 ships shorthands and <br /> offsets to make these logical properties and values a bit easier to write. What was once written with multiple CSS rules can now be written as one. For example, separate rules for <code>margin-block-start</code> and <code>margin-block-end</code> may now be written using a single <code>margin-block</code> property. </p> <p>For a list of all flow-relative shorthands now supported by Chrome, and explanations for how to use them, see <a href="https://web.dev/logical-property-shorthands/">Logical layout enhancements with flow-relative shorthands</a>. For more CSS-related updates, see the CSS section, below.</p> <h2>Completed Origin Trials</h2> <p>Origin trials allow you to try new features and give feedback on usability, practicality, and effectiveness to the web standards community. The following feature, previously in a Chrome origin trial, is now enabled by default.</p> <h4 style="text-align: left;">Cookie Store API</h4> <p>The Cookie Store API <a href="https://www.chromestatus.com/feature/5658847691669504">exposes HTTP cookies to service workers</a> and offers an asynchronous alternative to <code>document.cookie</code>.</p> <h2>Other features in this release</h2> <h4 style="text-align: left;">cross-origin isolation</h4> <p>Chrome 87 has a number of changes related to cross-origin isolation. Chrome will now use origin instead of site as agent cluster key for cross-origin isolated agent clusters. Mutation of <code>document.domain</code> is no longer supported for cross-origin isolated agent clusters. This change also introduces <code>window.crossOriginIsolated</code>, a boolean that indicates whether APIs that require cross-origin isolation are allowed to use it. Supporting APIs include:</p> <ul> <li><code><a href="https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer">SharedArrayBuffer</a></code> (required for WebAssembly Threads)</li> <li><code><a href="https://web.dev/monitor-total-page-memory-usage/">performance.measureMemory()</a></code></li> <li><a href="https://wicg.github.io/js-self-profiling/">JS Self-Profiling API</a></li> </ul> <p>For more information, see <a href="https://web.dev/coop-coep/">Making your website "cross-origin isolated" using COOP and COEP</a>.</p> <h4 style="text-align: left;">iframe attribute for limiting same-origin iframe document access</h4> <p>Adds <a href="https://www.chromestatus.com/feature/5648946183536640">the <code>disallowdocumentaccess</code> property</a> to disallow cross-document scripting between iframes from the same origin in the same parent document. This also puts same-origin iframes in separate event loops.</p><p><b>Note:</b>&nbsp;This item was pulled from Chrome 87 beta and was not in later builds.</p> <h4 style="text-align: left;">isInputPending()</h4> <p>Sometimes long-running scripts block user input. A lag between a user's action and a response by an app is a bad user experience. To address this, Chrome has added a method called <code>isInputPending()</code>, accessible from <code>navigator.scheduling</code>, which can be called from long-running operations. You can find <a href="https://wicg.github.io/is-input-pending/#examples-of-usage">an example of the method's use</a> in the draft spec.</p> <h4 style="text-align: left;">Range Request Headers in Service Workers</h4> <p>HTTP range requests, which have been available in major browsers for several years, allow servers to send requested data to the client in chunks. This has proved especially useful for large media files where the user experience is improved through smoother playback and improved pause and resume functions.</p> <p>Historically, range requests and services workers did not work well together, forcing developers to build <a href="https://code-tree.github.io/sw-partial-content/">work-arounds</a>. Starting in Chrome 87, passing range requests through to the network from inside a service worker will "just work."</p> <p>For an explanation of the issues with range requests and what's changed in Chrome 87, see <a href="https://web.dev/sw-range-requests/">Handling range requests in a service worker</a>.</p> <h4 style="text-align: left;">Streams API: transferable streams</h4> <p><a href="https://www.chromestatus.com/feature/5298733486964736">Transferable streams</a> now allows <code>ReadableStream</code>, <code>WritableStream</code>, and <code>TransformStream</code> objects to be passed as arguments to <code>postMessage()</code>. The streams APIs provide ubiquitous, interoperable primitives for creating, composing, and consuming streams of data. A natural thing to do with a stream is to pass it to a web worker. This provides a fluent primitive for offloading work to another thread. </p> <p>Offloading work onto a worker is important for a smooth user experience, but the ergonomics can be awkward. Transferable streams solve this problem for streams. Once the stream itself has been transferred, the data is transparently cloned in the background.</p> <h4 style="text-align: left;">Transition related event handlers</h4> <p>The <code>ontransitionrun</code>, <code>ontransitionstart</code>, and <code>ontransitioncancel</code> <a href="https://www.chromestatus.com/feature/5354694014664704">event handler attributes</a> allow developers to add event listeners for <code>'transitionrun'</code>, <code>'transitionstart'</code>, and <code>'transitioncancel'</code> events on elements, Document objects, and Window objects.</p> <h4 style="text-align: left;">WakeLockSentinel.released Attribute</h4> <p>The <code><a href="https://developer.mozilla.org/en-US/docs/Web/API/WakeLockSentinel">WakeLockSentinel</a></code> object has <a href="https://www.chromestatus.com/feature/5632527123349504">a new property called <code>released</code></a> that indicates whether a sentinel has already been released. It defaults to false and changes to true when a release event is dispatched. The new attribute helps web developers know when locks are released so that they do not need to keep track of them manually. </p> <h3>CSS</h3> <h4>@font-face descriptors to override font metrics</h4> <p>New <a href="https://www.chromestatus.com/feature/5651198621253632"><code>@font-face</code> descriptors</a> have been added to <code>ascent-override</code>, <code>descent-override</code>, and <code>line-gap-override</code> to override metrics of the font. This Improves interoperably across browsers and operating systems, so that the same font always looks the same on the same site, regardless of OS or browser. Additionally, it aligns metrics between two web fonts present simultaneously, but for different glyphs. Finally, it overrides font metrics for a fallback font to emulate a web font, to minimize cumulative layout shift.</p> <h4>Text Decoration and Underline Properties</h4> <p>Chrome now supports <a href="https://www.chromestatus.com/feature/5747636764147712">several new text decoration and underline properties</a>. These properties solve use cases where underlines are too close to the text baseline and ink-skipping triggers too early in a text run. These use cases solve problems caused by the launch of the <code><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/text-decoration-skip-ink">text-decoration-skip-ink </a></code>property. The new properties are <code>text-decoration-thickness</code>, <code>text-underline-offset</code> and a <code>from-font</code> keyword for <code>text-underline-position</code>.</p> <h4>The quotes Property Supports the 'auto' Value</h4> <p>CSS2 allowed browsers to define the default value for the quotes property, which Chrome formerly followed. Chrome 87 <a href="https://www.chromestatus.com/feature/4922661488558080">now follows CSS Generated Content Module Level 3</a> in which the <code>'auto'</code> keyword is the default value. That spec requires that a typographically appropriate value be used for quotes based on the content language of the element and/or its parent.</p> <h3>JavaScript</h3> <p>This version of Chrome incorporates version 8.7 of the V8 JavaScript engine. It specifically includes the changes listed below. You can find a complete <a href="https://v8.dev/blog">list of recent features</a> in the V8 release notes.</p> <h4>Atomics.waitAsync()</h4> <p><a href="https://www.chromestatus.com/feature/6243382101803008">Chrome now supports <code>Atomics.waitAsync()</code></a>, the async version of <code>Atomics.wait()</code>. <code>Atomics.waitAsync()</code> allows programmers to wait on a <code>SharedArrayBuffer</code> location in the same fashion as <code>Atomics.wait()</code> but returns a Promise instead.</p> <p><code>Atomics.wait()</code> blocks the thread and cannot be used on the main web browser thread, where blocking is disallowed. This makes coordination via <code>SharedArrayBuffers</code> between the main thread and worker threads more ergonomic.</p> <h3 style="text-align: left;">Deprecations and Removals</h3> <p>This version of Chrome introduces the deprecations and removals listed below. Visit ChromeStatus.com for lists of <a href="https://www.chromestatus.com/features#browsers.chrome.status%3A%22Deprecated%22">current deprecations</a> and <a href="https://www.chromestatus.com/features#browsers.chrome.status:%22Removed%22">previous removals</a>.</p> <h4 style="text-align: left;">Comma separator in iframe allow attribute</h4> <p>Permissions policy declarations in an <code>&lt;iframe&gt;</code> tag <a href="https://www.chromestatus.com/feature/5740835259809792">can no longer use commas</a> as a separator between items. Developers should use semicolons instead.</p> <h4 style="text-align: left;">-webkit-font-size-delta</h4> <p>Blink <a href="https://www.chromestatus.com/feature/6267981828980736">will no longer support</a> the rarely-used <code>-webkit-font-size-delta</code> property. Developers should use <code>font-size</code> to control font size instead.</p> <h4 style="text-align: left;">Deprecate FTP support</h4> <p>Chrome is <a href="https://www.chromestatus.com/features/6246151319715840">deprecating and removing support for FTP URLs</a>. The current FTP implementation in Google Chrome has no support for encrypted connections (FTPS), nor proxies. Usage of FTP in the browser is sufficiently low that it is no longer viable to invest in improving the existing FTP client. In addition, more capable FTP clients are available on all affected platforms.<br /> <br /> Google Chrome 72 and later removed support for fetching document subresources over FTP and rendering of top level FTP resources. Currently navigating to FTP URLs results in showing a directory listing or a download depending on the type of resource. A bug in Google Chrome 74 and later resulted in dropping support for accessing FTP URLs over HTTP proxies. Proxy support for FTP was removed entirely in Google Chrome 76. In Chrome 86, FTP was turned off for pre-release channels (Canary and Beta) and was experimentally turned off for one percent of stable users. <br /> <br /> The remaining capabilities of Google Chrome's FTP implementation are restricted to either displaying a directory listing or downloading a resource over unencrypted connections. </p> <p>Remainder of the deprecation follows this timeline:</p> <h4>Chrome 87</h4> <p>FTP support will be disabled by default for fifty percent of users but can be enabled using the flags listed above.</p> <h4>Chrome 88</h4> <p>FTP support will be disabled.</p> <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 87 Beta: WebAuthn in DevTools, Pan/Tilt/Zoom, Flow Relative Shorthands and More&url=https://blog.chromium.org/2020/10/chrome-87-beta-webauthn-in-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/2020/10/chrome-87-beta-webauthn-in-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/2020/10/chrome-87-beta-webauthn-in-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'> <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'> &#59530; </i> </a> <span id='blog-pager-newer-link'> <a class='blog-pager-newer-link' href='https://blog.chromium.org/search?updated-max=2021-03-11T14:38:00-08:00&max-results=7&reverse-paginate=true' id='Blog1_blog-pager-newer-link' title='Newer Posts'> <i class='material-icons'> &#58820; </i> </a> </span> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href='https://blog.chromium.org/search?updated-max=2020-10-15T11:06:00-07:00&max-results=7' id='Blog1_blog-pager-older-link' title='Older Posts'> <i class='material-icons'> &#58824; </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'> &#58821; </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'> &#58055; </i> <h2> Archive </h2> <i class='material-icons arrow'> &#58821; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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 expanded'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy toggle-open'> <i class='material-icons'> &#58823; </i> &#160; </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 expanded'> <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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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 collapsed'> <div class='intervalToggle'> <span class='new-toggle' href='javascript:void(0)'> <i class='material-icons arrow'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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 collapsed'> <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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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'> &#58821; </i> </span> <a class='toggle' href='javascript:void(0)' style='display: none'> <span class='zippy'> <i class='material-icons'> &#58821; </i> &#160; </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/&amp;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'] = 'AOuZoY7ib1dEoHy2zueTRPz4dRSnMHqF2g:1732384553820';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d2471378914199150966','//blog.chromium.org/2020/','2471378914199150966'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '2471378914199150966', 'title': 'Chromium Blog', 'url': 'https://blog.chromium.org/2020/', 'canonicalUrl': 'https://blog.chromium.org/2020/', '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': '2020', 'pageTitle': 'Chromium Blog: 2020'}}, {'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/2020/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': true, 'isLabelSearch': false, 'archive': {'year': 2020, 'rangeMessage': 'Showing posts from 2020'}}}]); _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>

Pages: 1 2 3 4 5 6 7 8 9 10